Skip to content

Commit

Permalink
Allow to include uninitialized modules [Bug #18177]
Browse files Browse the repository at this point in the history
The module that is about to be included is considered initialized.
  • Loading branch information
nobu committed Sep 19, 2021
1 parent c0a892a commit 3e9f7db
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 1 deletion.
3 changes: 2 additions & 1 deletion class.c
Original file line number Diff line number Diff line change
Expand Up @@ -917,7 +917,8 @@ ensure_includable(VALUE klass, VALUE module)
rb_class_modify_check(klass);
Check_Type(module, T_MODULE);
if (RMODULE_UNINITIALIZED(module)) {
rb_raise(rb_eArgError, "uninitialized module");
RB_OBJ_WRITE(module, &RCLASS(module)->super, 0);
/* no more re-initialization */
}
if (!NIL_P(rb_refinement_module_get_refined_class(module))) {
rb_raise(rb_eArgError, "refinement module is not allowed");
Expand Down
12 changes: 12 additions & 0 deletions test/ruby/test_module.rb
Original file line number Diff line number Diff line change
Expand Up @@ -432,6 +432,18 @@ def x
initialize_copy(Module.new)
end
end

m = Class.new(Module) do
def initialize_copy(other)
# leave uninitialized
end
end.new.dup
c = Class.new
assert_operator(c.include(m), :<, m)
cp = Module.instance_method(:initialize_copy)
assert_raise(TypeError) do
cp.bind_call(m, Module.new)
end
end

def test_dup
Expand Down

0 comments on commit 3e9f7db

Please sign in to comment.