mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* 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
This commit is contained in:
parent
5e8e08d74e
commit
a927483326
4 changed files with 29 additions and 9 deletions
|
|
@ -1,3 +1,9 @@
|
|||
Thu Dec 20 01:10:52 2007 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||
|
||||
* 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 <m_seki@mva.biglobe.ne.jp>
|
||||
|
||||
* test/drb/drbtest.rb (test_07_public_private_protected_missing):
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
13
compile.c
13
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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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[];
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue