Fix calling extended callback

The callback of extending module should be called, not of a singleton
class of an extended object.
This commit is contained in:
Paweł Świątkowski
2025-05-27 22:23:35 +02:00
parent bec5dbc4e9
commit bdcd496bc2
2 changed files with 28 additions and 2 deletions
+2 -2
View File
@@ -1681,8 +1681,8 @@ mrb_obj_extend(mrb_state *mrb, mrb_value obj)
mrb_value mod = argv[argc];
mrb_check_type(mrb, mod, MRB_TT_MODULE);
mrb_include_module(mrb, mrb_class_ptr(cc), mrb_class_ptr(mod));
if (!mrb_func_basic_p(mrb, cc, extended, mrb_do_nothing)) {
mrb_funcall_argv(mrb, cc, extended, 1, &mod);
if (!mrb_func_basic_p(mrb, mod, extended, mrb_do_nothing)) {
mrb_funcall_argv(mrb, mod, extended, 1, &obj);
}
}
return obj;
+26
View File
@@ -477,3 +477,29 @@ assert('class with non-class/module outer raises TypeError') do
assert_raise(TypeError) { class 0::C1; end }
assert_raise(TypeError) { class []::C2; end }
end
assert('module with extended callback') do
module FooWithExtended
@@extended = []
def self.extended(base)
@@extended << base
end
def self.extended_classes
@@extended
end
def answer
42
end
end
class BarBeingExtended
extend FooWithExtended
end
assert_equal [BarBeingExtended], FooWithExtended.extended_classes
assert_true BarBeingExtended.respond_to?(:answer)
assert_equal 42, BarBeingExtended.answer
end