Fix `instance_exec` and `class_exec` to avoid crash on indirect calls.

Thank you @shuujii to additional report on #4973
parent ab508e1e
...@@ -43,10 +43,15 @@ mrb_mod_module_exec(mrb_state *mrb, mrb_value self) ...@@ -43,10 +43,15 @@ mrb_mod_module_exec(mrb_state *mrb, mrb_value self)
const mrb_value *argv; const mrb_value *argv;
mrb_int argc; mrb_int argc;
mrb_value blk; mrb_value blk;
struct RClass *c;
mrb_get_args(mrb, "*&!", &argv, &argc, &blk); mrb_get_args(mrb, "*&!", &argv, &argc, &blk);
mrb->c->ci->target_class = mrb_class_ptr(self); c = mrb_class_ptr(self);
if (mrb->c->ci->acc < 0) {
return mrb_yield_with_class(mrb, blk, argc, argv, self, c);
}
mrb->c->ci->target_class = c;
return mrb_yield_cont(mrb, blk, self, argc, argv); return mrb_yield_cont(mrb, blk, self, argc, argv);
} }
......
...@@ -101,18 +101,9 @@ mrb_obj_instance_exec(mrb_state *mrb, mrb_value self) ...@@ -101,18 +101,9 @@ mrb_obj_instance_exec(mrb_state *mrb, mrb_value self)
struct RClass *c; struct RClass *c;
mrb_get_args(mrb, "*&!", &argv, &argc, &blk); mrb_get_args(mrb, "*&!", &argv, &argc, &blk);
c = mrb_singleton_class_ptr(mrb, self);
switch (mrb_type(self)) { if (mrb->c->ci->acc < 0) {
case MRB_TT_SYMBOL: return mrb_yield_with_class(mrb, blk, argc, argv, self, c);
case MRB_TT_FIXNUM:
#ifndef MRB_WITHOUT_FLOAT
case MRB_TT_FLOAT:
#endif
c = NULL;
break;
default:
c = mrb_class_ptr(mrb_singleton_class(mrb, self));
break;
} }
mrb->c->ci->target_class = c; mrb->c->ci->target_class = c;
return mrb_yield_cont(mrb, blk, self, argc, argv); return mrb_yield_cont(mrb, blk, self, argc, argv);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment