summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gc.c8
-rw-r--r--test/ruby/test_class.rb9
2 files changed, 15 insertions, 2 deletions
diff --git a/gc.c b/gc.c
index 3251719066..94c7f60c95 100644
--- a/gc.c
+++ b/gc.c
@@ -3141,8 +3141,10 @@ obj_free(rb_objspace_t *objspace, VALUE obj)
}
rb_class_remove_from_module_subclasses(obj);
rb_class_remove_from_super_subclasses(obj);
+#if !USE_RVARGC
if (RCLASS_EXT(obj))
- RCLASS_EXT(obj) = NULL;
+ xfree(RCLASS_EXT(obj));
+#endif
(void)RB_DEBUG_COUNTER_INC_IF(obj_module_ptr, BUILTIN_TYPE(obj) == T_MODULE);
(void)RB_DEBUG_COUNTER_INC_IF(obj_class_ptr, BUILTIN_TYPE(obj) == T_CLASS);
@@ -3308,7 +3310,9 @@ obj_free(rb_objspace_t *objspace, VALUE obj)
cc_table_free(objspace, obj, FALSE);
rb_class_remove_from_module_subclasses(obj);
rb_class_remove_from_super_subclasses(obj);
- RCLASS_EXT(obj) = NULL;
+#if !USE_RVARGC
+ xfree(RCLASS_EXT(obj));
+#endif
RB_DEBUG_COUNTER_INC(obj_iclass_ptr);
break;
diff --git a/test/ruby/test_class.rb b/test/ruby/test_class.rb
index 4ae230f91e..eb448e952a 100644
--- a/test/ruby/test_class.rb
+++ b/test/ruby/test_class.rb
@@ -769,4 +769,13 @@ class TestClass < Test::Unit::TestCase
assert(c.descendants.size <= 100)
end
end
+
+ def test_classext_memory_leak
+ assert_no_memory_leak([], <<-PREP, <<-CODE, rss: true)
+code = proc { Class.new }
+1_000.times(&code)
+PREP
+3_000_000.times(&code)
+CODE
+ end
end