summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Hess <HParker@github.com>2023-09-23 19:41:55 +0000
committerJean Boussier <jean.boussier@gmail.com>2023-09-23 23:10:46 +0200
commitc42261059dfebabbf0391327a5e077545a9bc438 (patch)
tree9af7f0d1f6136f91915cdecaa0eab1e4493d3917
parent61a2e9450c025b6a7499719089db5b4ae0317ce6 (diff)
[Bug #19901]
fix leak in module clone Co-authored-by: Peter Zhu <peter@peterzhu.ca>
-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)