From a196d8a5f3551356fbbbac9b891f1db06dc4e710 Mon Sep 17 00:00:00 2001 From: dearblue Date: Thu, 24 Oct 2024 22:05:59 +0900 Subject: [PATCH] Fixed also argument forwarding in `class_exec` Pointed out by @matz. https://github.com/mruby/mruby/pull/6391#issuecomment-2433662139 --- mrbgems/mruby-class-ext/src/class.c | 14 ++------------ mrbgems/mruby-class-ext/test/class.rb | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/mrbgems/mruby-class-ext/src/class.c b/mrbgems/mruby-class-ext/src/class.c index 0155b2713..67dbc373b 100644 --- a/mrbgems/mruby-class-ext/src/class.c +++ b/mrbgems/mruby-class-ext/src/class.c @@ -4,6 +4,7 @@ #include #include #include +#include #include static mrb_value @@ -44,18 +45,7 @@ mod_singleton_class_p(mrb_state *mrb, mrb_value self) static mrb_value mod_module_exec(mrb_state *mrb, mrb_value self) { - const mrb_value *argv; - mrb_int argc; - mrb_value blk; - - mrb_get_args(mrb, "*&!", &argv, &argc, &blk); - - struct RClass *c = mrb_class_ptr(self); - if (mrb->c->ci->cci > 0) { - return mrb_yield_with_class(mrb, blk, argc, argv, self, c); - } - mrb_vm_ci_target_class_set(mrb->c->ci, c); - return mrb_yield_cont(mrb, blk, self, argc, argv); + return mrb_object_exec(mrb, self, mrb_class_ptr(self)); } struct subclass_args { diff --git a/mrbgems/mruby-class-ext/test/class.rb b/mrbgems/mruby-class-ext/test/class.rb index fba2a19f9..65b16bb28 100644 --- a/mrbgems/mruby-class-ext/test/class.rb +++ b/mrbgems/mruby-class-ext/test/class.rb @@ -27,3 +27,20 @@ assert 'Class#attached_object' do assert_raise(TypeError){TrueClass.attached_object} assert_raise(TypeError){NilClass.attached_object} end + +assert 'Class#class_exec' do + c = Class.new + class << c + def index + 12345 + end + end + c.class_exec do + def index + 54321 + end + end + + assert_equal 12345, c.index + assert_equal 54321, c.new.index +end