summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--class.c7
-rw-r--r--test/ruby/test_module.rb22
2 files changed, 29 insertions, 0 deletions
diff --git a/class.c b/class.c
index 4dbf5a2f35..7719b06208 100644
--- a/class.c
+++ b/class.c
@@ -1141,6 +1141,13 @@ rb_prepend_module(VALUE klass, VALUE module)
if (changed) {
rb_vm_check_redefinition_by_prepend(klass);
}
+ if (RB_TYPE_P(klass, T_MODULE)) {
+ rb_subclass_entry_t *iclass = RCLASS_EXT(klass)->subclasses;
+ while (iclass) {
+ include_modules_at(iclass->klass, iclass->klass, module, FALSE);
+ iclass = iclass->next;
+ }
+ }
}
/*
diff --git a/test/ruby/test_module.rb b/test/ruby/test_module.rb
index d3012e59ae..d2da384cbd 100644
--- a/test/ruby/test_module.rb
+++ b/test/ruby/test_module.rb
@@ -587,6 +587,28 @@ class TestModule < Test::Unit::TestCase
m1.include m2
m1.include m3
assert_equal([:m1, :sc, :m2, :m3, :c], o.foo)
+
+ m1, m2, m3, sc, o = modules.call
+ assert_equal([:sc, :c], o.foo)
+ sc.prepend m1
+ assert_equal([:m1, :sc, :c], o.foo)
+ m1.prepend m2
+ assert_equal([:m2, :m1, :sc, :c], o.foo)
+ m2.prepend m3
+ assert_equal([:m3, :m2, :m1, :sc, :c], o.foo)
+ m1, m2, m3, sc, o = modules.call
+ sc.include m1
+ assert_equal([:sc, :m1, :c], o.foo)
+ sc.prepend m2
+ assert_equal([:m2, :sc, :m1, :c], o.foo)
+ sc.prepend m3
+ assert_equal([:m3, :m2, :sc, :m1, :c], o.foo)
+ m1, m2, m3, sc, o = modules.call
+ sc.include m1
+ assert_equal([:sc, :m1, :c], o.foo)
+ m2.prepend m3
+ m1.include m2
+ assert_equal([:sc, :m1, :m3, :m2, :c], o.foo)
end
def test_included_modules