summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--class.c1
-rw-r--r--test/ruby/test_module.rb12
2 files changed, 13 insertions, 0 deletions
diff --git a/class.c b/class.c
index 96f97365ac..f730009709 100644
--- a/class.c
+++ b/class.c
@@ -471,6 +471,7 @@ copy_tables(VALUE clone, VALUE orig)
rb_id_table_foreach(rb_cvc_tbl, cvc_table_copy, &ctx);
RCLASS_CVC_TBL(clone) = rb_cvc_tbl_dup;
}
+ rb_id_table_free(RCLASS_M_TBL(clone));
RCLASS_M_TBL(clone) = 0;
if (!RB_TYPE_P(clone, T_ICLASS)) {
st_data_t id;
diff --git a/test/ruby/test_module.rb b/test/ruby/test_module.rb
index 7aebf71d2d..ca15746002 100644
--- a/test/ruby/test_module.rb
+++ b/test/ruby/test_module.rb
@@ -3321,6 +3321,18 @@ class TestModule < Test::Unit::TestCase
CODE
end
+ def test_module_clone_memory_leak
+ # [Bug #19901]
+ assert_no_memory_leak([], <<~PREP, <<~CODE, rss: true)
+ code = proc do
+ Module.new.clone
+ end
+ 1_000.times(&code)
+ PREP
+ 1_000_000.times(&code)
+ CODE
+ end
+
private
def assert_top_method_is_private(method)