From 80edcf82a1498caa58a53668c8b311cbcf98816d Mon Sep 17 00:00:00 2001 From: nobu Date: Tue, 9 Sep 2003 01:39:58 +0000 Subject: [PATCH] * eval.c (struct tag): dst should be VALUE. * eval.c (localjump_destination): stop at the scope where the current block was created. [ruby-dev:21353] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@4539 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 13 +++++++++++-- eval.c | 11 +++++------ test/ruby/test_iterator.rb | 5 +++-- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index ed9e46b88e..ab62fd8eac 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +Tue Sep 9 10:39:51 2003 Nobuyoshi Nakada + + * eval.c (struct tag): dst should be VALUE. + +Tue Sep 9 10:39:51 2003 Nobuyoshi Nakada + + * eval.c (localjump_destination): stop at the scope where the current + block was created. [ruby-dev:21353] + Tue Sep 9 05:17:04 2003 GOTOU Yuuzou * ext/openssl/ossl_config.rb: avoid compile error in OpenSSL-0.9.6. @@ -7,11 +16,11 @@ Tue Sep 9 01:50:45 2003 GOTOU Yuuzou * lib/webrick/httpserver.rb (HTTPServer#access_log): add "\n" to the message. - * lib/webrick/log.rb (BasicLog#log): add "\n" only if needed. + * lib/webrick/log.rb (BasicLog#log): add "\n" only if needed. Mon Sep 8 22:15:33 2003 - * ext/tk/lib/multi-tk.rb: modify security check at creating + * ext/tk/lib/multi-tk.rb: modify security check at creating a new interpreter Mon Sep 8 20:00:12 2003 Nobuyoshi Nakada diff --git a/eval.c b/eval.c index a9c2dc7f72..7119596b3a 100644 --- a/eval.c +++ b/eval.c @@ -822,7 +822,7 @@ struct tag { VALUE tag; VALUE retval; struct SCOPE *scope; - int dst; + VALUE dst; struct tag *prev; }; static struct tag *prot_tag; @@ -1520,6 +1520,7 @@ localjump_reason(exc) return rb_iv_get(exc, "@reason"); } +NORETURN(static void jump_tag_but_local_jump _((int))); static void jump_tag_but_local_jump(state) int state; @@ -4023,18 +4024,16 @@ localjump_destination(state, scope, retval) (tt->tag == PROT_CALL || tt->tag == tag) && tt->scope == scope) { tt->dst = (VALUE)scope; tt->retval = retval; - break; + JUMP_TAG(state); } + if (tt->tag == PROT_FUNC && tt->scope == scope) break; if (tt->tag == PROT_THREAD) { rb_raise(rb_eThreadError, "%s jump can't across threads", (state == TAG_BREAK) ? "break" : "return"); } tt = tt->prev; } - if (!tt) { - jump_tag_but_local_jump(state); - } - JUMP_TAG(state); + jump_tag_but_local_jump(state); } static VALUE diff --git a/test/ruby/test_iterator.rb b/test/ruby/test_iterator.rb index 4947ed26ce..83bfb25255 100644 --- a/test/ruby/test_iterator.rb +++ b/test/ruby/test_iterator.rb @@ -179,7 +179,7 @@ class TestIterator < Test::Unit::TestCase m(block_given?,&proc{}) end - def test_block_in_arg + def test_block_given assert(m1{p 'test'}) assert(m2{p 'test'}) assert(!m1()) @@ -299,6 +299,7 @@ class TestIterator < Test::Unit::TestCase lambda = lambda{44} assert_raises(LocalJumpError) {get_block{break}.call} assert_nothing_raised {lambda{break}.call} + assert_instance_of(LocalJumpError, (get_block{break}.call rescue $!)) assert_equal(-1, block.arity) assert_equal(-1, lambda.arity) @@ -319,7 +320,7 @@ class TestIterator < Test::Unit::TestCase marity_test(:p) lambda(&method(:assert)).call(true) - lambda(&get_block{|a,n| assert(a,n)}).call(true, 2) + lambda(&get_block{|a,n| assert(a,n)}).call(true, "marity") end class ITER_TEST1