summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Zhu <peter@peterzhu.ca>2026-01-02 11:41:24 -0500
committergit <svn-admin@ruby-lang.org>2026-01-02 20:42:11 +0000
commite7695ba3d9f0e8ee17025af4d42ecaf2dad47f29 (patch)
treea324e043c075d19ea834076f53a7eb3dfefbb20a
parent31fb970c18734455c2a2e6eb93bdc67db1edb88c (diff)
[ruby/mmtk] Check for T_NONE during marking
https://github.com/ruby/mmtk/commit/c3e338bb25
-rw-r--r--gc/mmtk/mmtk.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/gc/mmtk/mmtk.c b/gc/mmtk/mmtk.c
index b532d3a774..6da17fdb23 100644
--- a/gc/mmtk/mmtk.c
+++ b/gc/mmtk/mmtk.c
@@ -72,6 +72,8 @@ struct MMTk_final_job {
#ifdef RB_THREAD_LOCAL_SPECIFIER
RB_THREAD_LOCAL_SPECIFIER struct MMTk_GCThreadTLS *rb_mmtk_gc_thread_tls;
+
+RB_THREAD_LOCAL_SPECIFIER VALUE marking_parent_object;
#else
# error We currently need language-supported TLS
#endif
@@ -270,14 +272,18 @@ rb_mmtk_update_object_references(MMTk_ObjectReference mmtk_object)
VALUE object = (VALUE)mmtk_object;
if (!RB_FL_TEST(object, RUBY_FL_WEAK_REFERENCE)) {
+ marking_parent_object = object;
rb_gc_update_object_references(rb_gc_get_objspace(), object);
+ marking_parent_object = 0;
}
}
static void
rb_mmtk_call_gc_mark_children(MMTk_ObjectReference object)
{
+ marking_parent_object = (VALUE)object;
rb_gc_mark_children(rb_gc_get_objspace(), (VALUE)object);
+ marking_parent_object = 0;
}
static void
@@ -285,11 +291,15 @@ rb_mmtk_handle_weak_references(MMTk_ObjectReference mmtk_object, bool moving)
{
VALUE object = (VALUE)mmtk_object;
+ marking_parent_object = object;
+
rb_gc_handle_weak_references(object);
if (moving) {
rb_gc_update_object_references(rb_gc_get_objspace(), object);
}
+
+ marking_parent_object = 0;
}
static void
@@ -797,6 +807,17 @@ void rb_gc_impl_adjust_memory_usage(void *objspace_ptr, ssize_t diff) { }
static inline VALUE
rb_mmtk_call_object_closure(VALUE obj, bool pin)
{
+ if (RB_UNLIKELY(RB_BUILTIN_TYPE(obj) == T_NONE)) {
+ const size_t info_size = 256;
+ char obj_info_buf[info_size];
+ rb_raw_obj_info(obj_info_buf, info_size, obj);
+
+ char parent_obj_info_buf[info_size];
+ rb_raw_obj_info(parent_obj_info_buf, info_size, marking_parent_object);
+
+ rb_bug("try to mark T_NONE object (obj: %s, parent: %s)", obj_info_buf, parent_obj_info_buf);
+ }
+
return (VALUE)rb_mmtk_gc_thread_tls->object_closure.c_function(
rb_mmtk_gc_thread_tls->object_closure.rust_closure,
rb_mmtk_gc_thread_tls->gc_context,