summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2021-02-05 21:39:44 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2021-02-05 21:39:44 +0900
commitee3017496ba60ca418b5e54c1f8f5d8b38524a52 (patch)
tree6e7b7e8924936b755ec30d4e308c68eac2967ed4
parent043fe9d9f5ab13063683881a981f24489d3f7335 (diff)
downloadmruby-ee3017496ba60ca418b5e54c1f8f5d8b38524a52.tar.gz
mruby-ee3017496ba60ca418b5e54c1f8f5d8b38524a52.zip
`instance_eval` for classes and modules should behave as `class_eval`.
-rw-r--r--src/vm.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/vm.c b/src/vm.c
index f8b74034e..390ce8aaa 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -659,11 +659,21 @@ mrb_value
mrb_obj_instance_eval(mrb_state *mrb, mrb_value self)
{
mrb_value a, b;
+ struct RClass *c;
if (mrb_get_args(mrb, "|S&", &a, &b) == 1) {
mrb_raise(mrb, E_NOTIMP_ERROR, "instance_eval with string not implemented");
}
- return eval_under(mrb, self, b, mrb_singleton_class_ptr(mrb, self));
+ switch (mrb_type(self)) {
+ case MRB_TT_MODULE:
+ case MRB_TT_CLASS:
+ case MRB_TT_ICLASS:
+ c = mrb_class_ptr(self);
+ break;
+ default:
+ c = mrb_singleton_class_ptr(mrb, self);
+ }
+ return eval_under(mrb, self, b, c);
}
MRB_API mrb_value