From 87fe4d49139524fddd58c8119cf356308a081813 Mon Sep 17 00:00:00 2001 From: matz Date: Sat, 1 Sep 2007 14:46:00 +0000 Subject: [PATCH] * eval_jump.ci (rb_f_throw): wrap tag and TAG_THROW in a NODE_MEMO node to make throw instruction to work well. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@13333 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 +++++ eval_jump.ci | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2d3b742bf5..6e791919b1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Sat Sep 1 23:44:26 2007 Yukihiro Matsumoto + + * 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 * 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;