mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
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:
+2
-2
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user