From d91b18f561b4fdf5afe73705a013d3e4ca043ec3 Mon Sep 17 00:00:00 2001 From: nobu Date: Wed, 19 Dec 2007 16:10:54 +0000 Subject: * 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: http://svn.ruby-lang.org/repos/ruby/trunk@14339 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 6 ++++++ bootstraptest/test_eval.rb | 13 +++++++++---- compile.c | 13 +++++++++++-- version.h | 6 +++--- 4 files changed, 29 insertions(+), 9 deletions(-) diff --git a/ChangeLog b/ChangeLog index c856d5b5a..8f15563ed 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Thu Dec 20 01:10:52 2007 Nobuyoshi Nakada + + * 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 * test/drb/drbtest.rb (test_07_public_private_protected_missing): diff --git a/bootstraptest/test_eval.rb b/bootstraptest/test_eval.rb index 2f5e91207..b2a576246 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 diff --git a/compile.c b/compile.c index 3c76edd54..e17165e5b 100644 --- a/compile.c +++ b/compile.c @@ -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; } diff --git a/version.h b/version.h index aa8cb83eb..ee0a9556f 100644 --- a/version.h +++ b/version.h @@ -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[]; -- cgit