diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | eval_jump.ci | 4 |
2 files changed, 7 insertions, 2 deletions
@@ -1,3 +1,8 @@ +Sat Sep 1 23:44:26 2007 Yukihiro Matsumoto <matz@ruby-lang.org> + + * eval_jump.ci (rb_f_throw): wrap tag and TAG_THROW in a NODE_MEMO + node to make throw instruction to work well. + Sat Sep 1 20:56:07 2007 Tanaka Akira <akr@fsij.org> * include/ruby/ruby.h (struct RBignum): embed digits in RBignum for diff --git a/eval_jump.ci b/eval_jump.ci index a637f97227..1767515e6f 100644 --- a/eval_jump.ci +++ b/eval_jump.ci @@ -39,7 +39,7 @@ rb_f_throw(int argc, VALUE *argv) rb_raise(rb_eArgError, "uncaught throw %s", RSTRING_PTR(desc)); } rb_trap_restore_mask(); - th->errinfo = tag; + th->errinfo = (VALUE)rb_node_newnode(NODE_MEMO, tag, 0, TAG_THROW); JUMP_TAG(TAG_THROW); #ifndef __GNUC__ @@ -117,7 +117,7 @@ rb_f_catch(int argc, VALUE *argv) if ((state = EXEC_TAG()) == 0) { val = rb_yield_0(1, &tag); } - else if (state == TAG_THROW && th->errinfo == tag) { + else if (state == TAG_THROW && RNODE(th->errinfo)->u1.value == tag) { val = th->tag->retval; th->errinfo = Qnil; state = 0; |