diff options
author | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-04-12 08:13:20 +0000 |
---|---|---|
committer | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-04-12 08:13:20 +0000 |
commit | e0943c481ab3fc3a5a35e3f7a71d97ad93f7036f (patch) | |
tree | 4fdc8ce023a0ad1b950c07bed70e038f344e7f47 /eval.c | |
parent | cc3871f9dcd8f89d6e554f59ff02c67dde42fc37 (diff) | |
download | ruby-e0943c481ab3fc3a5a35e3f7a71d97ad93f7036f.tar.gz |
* eval.c (rb_rescue2): restore cfp ([ruby-dev:30582]).
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12172 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 60 |
1 files changed, 33 insertions, 27 deletions
@@ -1327,8 +1327,10 @@ rb_rescue2(VALUE (*b_proc) (ANYARGS), VALUE data1, VALUE (*r_proc) (ANYARGS), VALUE data2, ...) { int state; + rb_thread_t *th = GET_THREAD(); + rb_control_frame_t *cfp = th->cfp; volatile VALUE result; - volatile VALUE e_info = GET_THREAD()->errinfo; + volatile VALUE e_info = th->errinfo; va_list args; PUSH_TAG(PROT_NONE); @@ -1336,38 +1338,42 @@ rb_rescue2(VALUE (*b_proc) (ANYARGS), VALUE data1, VALUE (*r_proc) (ANYARGS), retry_entry: result = (*b_proc) (data1); } - else if (state == TAG_RAISE) { - int handle = Qfalse; - VALUE eclass; + else { + th->cfp = cfp; /* restore */ - va_init_list(args, data2); - while (eclass = va_arg(args, VALUE)) { - if (rb_obj_is_kind_of(GET_THREAD()->errinfo, eclass)) { - handle = Qtrue; - break; + if (state == TAG_RAISE) { + int handle = Qfalse; + VALUE eclass; + + va_init_list(args, data2); + while (eclass = va_arg(args, VALUE)) { + if (rb_obj_is_kind_of(th->errinfo, eclass)) { + handle = Qtrue; + break; + } } - } - va_end(args); + va_end(args); - if (handle) { - if (r_proc) { - PUSH_TAG(PROT_NONE); - if ((state = EXEC_TAG()) == 0) { - result = (*r_proc) (data2, GET_THREAD()->errinfo); + if (handle) { + if (r_proc) { + PUSH_TAG(PROT_NONE); + if ((state = EXEC_TAG()) == 0) { + result = (*r_proc) (data2, th->errinfo); + } + POP_TAG(); + if (state == TAG_RETRY) { + state = 0; + th->errinfo = Qnil; + goto retry_entry; + } } - POP_TAG(); - if (state == TAG_RETRY) { + else { + result = Qnil; state = 0; - GET_THREAD()->errinfo = Qnil; - goto retry_entry; } - } - else { - result = Qnil; - state = 0; - } - if (state == 0) { - GET_THREAD()->errinfo = e_info; + if (state == 0) { + th->errinfo = e_info; + } } } } |