diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-12-19 16:10:54 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-12-19 16:10:54 +0000 |
commit | a927483326e54e6a4e9387009af0b57f38636497 (patch) | |
tree | eb38d3722b555b480f00303979429b20ef2f2a41 | |
parent | 5e8e08d74e9ed8f6805e0f86c643900770b1564d (diff) |
* compile.c (iseq_compile_each): should handle upper level eval iseq
from break/next, and COMPILE_ERROR() breaks only one block.
[ruby-dev:31372]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@14339 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | bootstraptest/test_eval.rb | 13 | ||||
-rw-r--r-- | compile.c | 13 | ||||
-rw-r--r-- | version.h | 6 |
4 files changed, 29 insertions, 9 deletions
@@ -1,3 +1,9 @@ +Thu Dec 20 01:10:52 2007 Nobuyoshi Nakada <[email protected]> + + * compile.c (iseq_compile_each): should handle upper level eval iseq + from break/next, and COMPILE_ERROR() breaks only one block. + [ruby-dev:31372] + Thu Dec 20 00:07:36 2007 Masatoshi SEKI <[email protected]> * test/drb/drbtest.rb (test_07_public_private_protected_missing): diff --git a/bootstraptest/test_eval.rb b/bootstraptest/test_eval.rb index 2f5e912074..b2a5762460 100644 --- a/bootstraptest/test_eval.rb +++ b/bootstraptest/test_eval.rb @@ -189,7 +189,12 @@ assert_equal %q{[10, main]}, %q{ $ans } -assert_match /Illegal break/, %q{ - STDERR.reopen(STDOUT) - eval "0 rescue break" -}, '[ruby-dev:31372]' +%w[break next redo].each do |keyword| + assert_match %r"Can't escape from eval with #{keyword}\z", %{ + begin + eval "0 rescue #{keyword}" + rescue SyntaxError => e + e.message + end + }, '[ruby-dev:31372]' +end @@ -2942,11 +2942,12 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) INT2FIX(level | 0x02) /* TAG_BREAK */ ); } else if (iseq->type == ISEQ_TYPE_EVAL) { + break_in_eval: COMPILE_ERROR((ERROR_ARGS "Can't escape from eval with break")); } else { rb_iseq_t *ip = iseq->parent_iseq; - while (ip && ip->compile_data) { + while (ip) { level++; if (ip->compile_data->redo_label != 0) { level = 0x8000; @@ -2960,6 +2961,9 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) level <<= 16; goto break_by_insn; } + else if (ip->type == ISEQ_TYPE_EVAL) { + goto break_in_eval; + } ip = ip->parent_iseq; } COMPILE_ERROR((ERROR_ARGS "Illegal break")); @@ -2985,6 +2989,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) iseq->compile_data->end_label); } else if (iseq->type == ISEQ_TYPE_EVAL) { + next_in_eval: COMPILE_ERROR((ERROR_ARGS "Can't escape from eval with next")); } else { @@ -3001,6 +3006,9 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) level |= 0x4000; break; } + else if (ip->type == ISEQ_TYPE_EVAL) { + goto next_in_eval; + } ip = ip->parent_iseq; } if (ip != 0) { @@ -3034,6 +3042,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) #endif } else if (iseq->type == ISEQ_TYPE_EVAL) { + redo_in_eval: COMPILE_ERROR((ERROR_ARGS "Can't escape from eval with redo")); } else if (iseq->compile_data->start_label) { @@ -3059,7 +3068,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) break; } else if (ip->type == ISEQ_TYPE_EVAL) { - COMPILE_ERROR((ERROR_ARGS "Can't escape from eval with redo")); + goto redo_in_eval; } ip = ip->parent_iseq; } @@ -1,7 +1,7 @@ #define RUBY_VERSION "1.9.0" -#define RUBY_RELEASE_DATE "2007-12-19" +#define RUBY_RELEASE_DATE "2007-12-20" #define RUBY_VERSION_CODE 190 -#define RUBY_RELEASE_CODE 20071219 +#define RUBY_RELEASE_CODE 20071220 #define RUBY_PATCHLEVEL 0 #define RUBY_VERSION_MAJOR 1 @@ -9,7 +9,7 @@ #define RUBY_VERSION_TEENY 0 #define RUBY_RELEASE_YEAR 2007 #define RUBY_RELEASE_MONTH 12 -#define RUBY_RELEASE_DAY 19 +#define RUBY_RELEASE_DAY 20 #ifdef RUBY_EXTERN RUBY_EXTERN const char ruby_version[]; |