summaryrefslogtreecommitdiffstats
path: root/vm_eval.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-03-13 09:10:07 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-03-13 09:10:07 +0000
commit8dbf325b45f3b29417a722e65a4e685538f6a2db (patch)
treee59cd1970049593d4220fc033a1e060308a26d8f /vm_eval.c
parent07fb6dd3614d49124cbb51a42d45a3ba6b6f01fd (diff)
downloadruby-8dbf325b45f3b29417a722e65a4e685538f6a2db.tar.gz
ruby-8dbf325b45f3b29417a722e65a4e685538f6a2db.tar.xz
ruby-8dbf325b45f3b29417a722e65a4e685538f6a2db.zip
* vm_eval.c (rb_throw_obj): inverted call flow. [ruby-core:22872]
git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@22927 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'vm_eval.c')
-rw-r--r--vm_eval.c31
1 files changed, 10 insertions, 21 deletions
diff --git a/vm_eval.c b/vm_eval.c
index 0780f0928..4679fe65f 100644
--- a/vm_eval.c
+++ b/vm_eval.c
@@ -1127,8 +1127,6 @@ rb_mod_module_exec(int argc, VALUE *argv, VALUE mod)
return yield_under(mod, mod, rb_ary_new4(argc, argv));
}
-NORETURN(static VALUE rb_f_throw _((int, VALUE *)));
-
/*
* call-seq:
* throw(symbol [, obj])
@@ -1145,10 +1143,18 @@ static VALUE
rb_f_throw(int argc, VALUE *argv)
{
VALUE tag, value;
+
+ rb_scan_args(argc, argv, "11", &tag, &value);
+ rb_throw_obj(tag, value);
+ return Qnil; /* not reached */
+}
+
+void
+rb_throw_obj(VALUE tag, VALUE value)
+{
rb_thread_t *th = GET_THREAD();
struct rb_vm_tag *tt = th->tag;
- rb_scan_args(argc, argv, "11", &tag, &value);
while (tt) {
if (tt->tag == tag) {
tt->retval = value;
@@ -1164,29 +1170,12 @@ rb_f_throw(int argc, VALUE *argv)
th->errinfo = NEW_THROW_OBJECT(tag, 0, TAG_THROW);
JUMP_TAG(TAG_THROW);
-#ifndef __GNUC__
- return Qnil; /* not reached */
-#endif
}
void
rb_throw(const char *tag, VALUE val)
{
- VALUE argv[2];
-
- argv[0] = ID2SYM(rb_intern(tag));
- argv[1] = val;
- rb_f_throw(2, argv);
-}
-
-void
-rb_throw_obj(VALUE tag, VALUE val)
-{
- VALUE argv[2];
-
- argv[0] = tag;
- argv[1] = val;
- rb_f_throw(2, argv);
+ rb_throw_obj(ID2SYM(rb_intern(tag)), val);
}
/*