summaryrefslogtreecommitdiff
path: root/eval.c
diff options
context:
space:
mode:
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/eval.c b/eval.c
index 7726edb9e8..e14215f7a7 100644
--- a/eval.c
+++ b/eval.c
@@ -10187,7 +10187,19 @@ rb_catch(tag, func, data)
VALUE (*func)();
VALUE data;
{
- return rb_iterate((VALUE(*)_((VALUE)))catch_i, ID2SYM(rb_intern(tag)), func, data);
+ int state;
+ VALUE val = Qnil; /* OK */
+
+ PUSH_TAG(PROT_NONE);
+ PUSH_SCOPE();
+ if ((state = EXEC_TAG()) == 0) {
+ val = rb_iterate((VALUE(*)_((VALUE)))catch_i, ID2SYM(rb_intern(tag)), func, data);
+ }
+ POP_SCOPE();
+ POP_TAG();
+ if (state) JUMP_TAG(state);
+
+ return val;
}
static VALUE