From d7f412e685aee3138213734ad81ffd5fe0e4be8c Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Fri, 17 Oct 2025 20:45:04 -0400 Subject: [PATCH 1/3] Add rb_root_namespace_data_type --- namespace.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/namespace.c b/namespace.c index c8c947f50cd8ba..bd805ae0d38ac6 100644 --- a/namespace.c +++ b/namespace.c @@ -238,6 +238,17 @@ const rb_data_type_t rb_namespace_data_type = { 0, 0, RUBY_TYPED_FREE_IMMEDIATELY // TODO: enable RUBY_TYPED_WB_PROTECTED when inserting write barriers }; +const rb_data_type_t rb_root_namespace_data_type = { + "Namespace::Root", + { + rb_namespace_entry_mark, + namespace_entry_free, + namespace_entry_memsize, + rb_namespace_gc_update_references, + }, + 0, 0, RUBY_TYPED_FREE_IMMEDIATELY // TODO: enable RUBY_TYPED_WB_PROTECTED when inserting write barriers +}; + VALUE rb_namespace_entry_alloc(VALUE klass) { @@ -708,7 +719,7 @@ initialize_root_namespace(void) root->ns_id = namespace_generate_id(); root->ns_object = root_namespace; - entry = TypedData_Wrap_Struct(rb_cNamespaceEntry, &rb_namespace_data_type, root); + entry = TypedData_Wrap_Struct(rb_cNamespaceEntry, &rb_root_namespace_data_type, root); rb_ivar_set(root_namespace, id_namespace_entry, entry); } else { From eb4a6f0cda35e9f7dc926d5cf66efdfaf3136ac3 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Fri, 17 Oct 2025 21:41:12 -0400 Subject: [PATCH 2/3] Fix memory leak of TypedData data in Namespace --- namespace.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/namespace.c b/namespace.c index bd805ae0d38ac6..e860de20ef56eb 100644 --- a/namespace.c +++ b/namespace.c @@ -208,7 +208,7 @@ free_loading_table_entry(st_data_t key, st_data_t value, st_data_t arg) } static void -namespace_entry_free(void *ptr) +namespace_root_free(void *ptr) { rb_namespace_t *ns = (rb_namespace_t *)ptr; if (ns->loading_table) { @@ -218,6 +218,13 @@ namespace_entry_free(void *ptr) } } +static void +namespace_entry_free(void *ptr) +{ + namespace_root_free(ptr); + xfree(ptr); +} + static size_t namespace_entry_memsize(const void *ptr) { @@ -242,7 +249,7 @@ const rb_data_type_t rb_root_namespace_data_type = { "Namespace::Root", { rb_namespace_entry_mark, - namespace_entry_free, + namespace_root_free, namespace_entry_memsize, rb_namespace_gc_update_references, }, From ddd1aeaa648d7fe608d73004f3bfb2f11108c5d3 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Fri, 17 Oct 2025 22:23:26 -0400 Subject: [PATCH 3/3] Free loaded_features_index in namespace --- namespace.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/namespace.c b/namespace.c index e860de20ef56eb..86a5ecf1544907 100644 --- a/namespace.c +++ b/namespace.c @@ -216,6 +216,10 @@ namespace_root_free(void *ptr) st_free_table(ns->loading_table); ns->loading_table = 0; } + + if (ns->loaded_features_index) { + st_free_table(ns->loaded_features_index); + } } static void