From 7379b9ed780bc8fcf8c50ae2d33816523327608c Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Wed, 24 Dec 2025 09:17:21 -0500 Subject: [PATCH 1/2] Optimize rb_mark_generic_ivar for T_DATA and T_STRUCT T_DATA and T_STRUCT could have ivars but might not use the generic_fields_tbl. This commit skips lookup in the generic_fields_tbl for those cases. --- depend | 36 ++++++++++++++++++++++++++++++++++++ ext/objspace/depend | 2 ++ ext/ripper/depend | 1 + gc.c | 4 ++-- shape.h | 20 ++++++++++++++++++++ 5 files changed, 61 insertions(+), 2 deletions(-) diff --git a/depend b/depend index bf001f45ca8169..e7ad0b9f8ba508 100644 --- a/depend +++ b/depend @@ -300,6 +300,7 @@ ast.$(OBJEXT): $(top_srcdir)/internal/sanitizers.h ast.$(OBJEXT): $(top_srcdir)/internal/serial.h ast.$(OBJEXT): $(top_srcdir)/internal/set_table.h ast.$(OBJEXT): $(top_srcdir)/internal/static_assert.h +ast.$(OBJEXT): $(top_srcdir)/internal/struct.h ast.$(OBJEXT): $(top_srcdir)/internal/symbol.h ast.$(OBJEXT): $(top_srcdir)/internal/variable.h ast.$(OBJEXT): $(top_srcdir)/internal/vm.h @@ -539,6 +540,7 @@ bignum.$(OBJEXT): $(top_srcdir)/internal/sanitizers.h bignum.$(OBJEXT): $(top_srcdir)/internal/serial.h bignum.$(OBJEXT): $(top_srcdir)/internal/set_table.h bignum.$(OBJEXT): $(top_srcdir)/internal/static_assert.h +bignum.$(OBJEXT): $(top_srcdir)/internal/struct.h bignum.$(OBJEXT): $(top_srcdir)/internal/variable.h bignum.$(OBJEXT): $(top_srcdir)/internal/vm.h bignum.$(OBJEXT): $(top_srcdir)/internal/warnings.h @@ -753,6 +755,7 @@ box.$(OBJEXT): $(top_srcdir)/internal/set_table.h box.$(OBJEXT): $(top_srcdir)/internal/st.h box.$(OBJEXT): $(top_srcdir)/internal/static_assert.h box.$(OBJEXT): $(top_srcdir)/internal/string.h +box.$(OBJEXT): $(top_srcdir)/internal/struct.h box.$(OBJEXT): $(top_srcdir)/internal/variable.h box.$(OBJEXT): $(top_srcdir)/internal/vm.h box.$(OBJEXT): $(top_srcdir)/internal/warnings.h @@ -991,6 +994,7 @@ builtin.$(OBJEXT): $(top_srcdir)/internal/sanitizers.h builtin.$(OBJEXT): $(top_srcdir)/internal/serial.h builtin.$(OBJEXT): $(top_srcdir)/internal/set_table.h builtin.$(OBJEXT): $(top_srcdir)/internal/static_assert.h +builtin.$(OBJEXT): $(top_srcdir)/internal/struct.h builtin.$(OBJEXT): $(top_srcdir)/internal/variable.h builtin.$(OBJEXT): $(top_srcdir)/internal/vm.h builtin.$(OBJEXT): $(top_srcdir)/internal/warnings.h @@ -1226,6 +1230,7 @@ class.$(OBJEXT): $(top_srcdir)/internal/serial.h class.$(OBJEXT): $(top_srcdir)/internal/set_table.h class.$(OBJEXT): $(top_srcdir)/internal/static_assert.h class.$(OBJEXT): $(top_srcdir)/internal/string.h +class.$(OBJEXT): $(top_srcdir)/internal/struct.h class.$(OBJEXT): $(top_srcdir)/internal/variable.h class.$(OBJEXT): $(top_srcdir)/internal/vm.h class.$(OBJEXT): $(top_srcdir)/internal/warnings.h @@ -1636,6 +1641,7 @@ compile.$(OBJEXT): $(top_srcdir)/internal/serial.h compile.$(OBJEXT): $(top_srcdir)/internal/set_table.h compile.$(OBJEXT): $(top_srcdir)/internal/static_assert.h compile.$(OBJEXT): $(top_srcdir)/internal/string.h +compile.$(OBJEXT): $(top_srcdir)/internal/struct.h compile.$(OBJEXT): $(top_srcdir)/internal/symbol.h compile.$(OBJEXT): $(top_srcdir)/internal/thread.h compile.$(OBJEXT): $(top_srcdir)/internal/variable.h @@ -1895,6 +1901,7 @@ complex.$(OBJEXT): $(top_srcdir)/internal/serial.h complex.$(OBJEXT): $(top_srcdir)/internal/set_table.h complex.$(OBJEXT): $(top_srcdir)/internal/static_assert.h complex.$(OBJEXT): $(top_srcdir)/internal/string.h +complex.$(OBJEXT): $(top_srcdir)/internal/struct.h complex.$(OBJEXT): $(top_srcdir)/internal/variable.h complex.$(OBJEXT): $(top_srcdir)/internal/vm.h complex.$(OBJEXT): $(top_srcdir)/internal/warnings.h @@ -2312,6 +2319,7 @@ cont.$(OBJEXT): $(top_srcdir)/internal/serial.h cont.$(OBJEXT): $(top_srcdir)/internal/set_table.h cont.$(OBJEXT): $(top_srcdir)/internal/static_assert.h cont.$(OBJEXT): $(top_srcdir)/internal/string.h +cont.$(OBJEXT): $(top_srcdir)/internal/struct.h cont.$(OBJEXT): $(top_srcdir)/internal/thread.h cont.$(OBJEXT): $(top_srcdir)/internal/variable.h cont.$(OBJEXT): $(top_srcdir)/internal/vm.h @@ -2552,6 +2560,7 @@ debug.$(OBJEXT): $(top_srcdir)/internal/serial.h debug.$(OBJEXT): $(top_srcdir)/internal/set_table.h debug.$(OBJEXT): $(top_srcdir)/internal/signal.h debug.$(OBJEXT): $(top_srcdir)/internal/static_assert.h +debug.$(OBJEXT): $(top_srcdir)/internal/struct.h debug.$(OBJEXT): $(top_srcdir)/internal/variable.h debug.$(OBJEXT): $(top_srcdir)/internal/vm.h debug.$(OBJEXT): $(top_srcdir)/internal/warnings.h @@ -5095,6 +5104,7 @@ error.$(OBJEXT): $(top_srcdir)/internal/serial.h error.$(OBJEXT): $(top_srcdir)/internal/set_table.h error.$(OBJEXT): $(top_srcdir)/internal/static_assert.h error.$(OBJEXT): $(top_srcdir)/internal/string.h +error.$(OBJEXT): $(top_srcdir)/internal/struct.h error.$(OBJEXT): $(top_srcdir)/internal/symbol.h error.$(OBJEXT): $(top_srcdir)/internal/thread.h error.$(OBJEXT): $(top_srcdir)/internal/variable.h @@ -5320,6 +5330,7 @@ eval.$(OBJEXT): $(top_srcdir)/internal/serial.h eval.$(OBJEXT): $(top_srcdir)/internal/set_table.h eval.$(OBJEXT): $(top_srcdir)/internal/static_assert.h eval.$(OBJEXT): $(top_srcdir)/internal/string.h +eval.$(OBJEXT): $(top_srcdir)/internal/struct.h eval.$(OBJEXT): $(top_srcdir)/internal/thread.h eval.$(OBJEXT): $(top_srcdir)/internal/variable.h eval.$(OBJEXT): $(top_srcdir)/internal/vm.h @@ -6563,6 +6574,7 @@ imemo.$(OBJEXT): $(top_srcdir)/internal/serial.h imemo.$(OBJEXT): $(top_srcdir)/internal/set_table.h imemo.$(OBJEXT): $(top_srcdir)/internal/st.h imemo.$(OBJEXT): $(top_srcdir)/internal/static_assert.h +imemo.$(OBJEXT): $(top_srcdir)/internal/struct.h imemo.$(OBJEXT): $(top_srcdir)/internal/variable.h imemo.$(OBJEXT): $(top_srcdir)/internal/vm.h imemo.$(OBJEXT): $(top_srcdir)/internal/warnings.h @@ -6948,6 +6960,7 @@ io.$(OBJEXT): $(top_srcdir)/internal/serial.h io.$(OBJEXT): $(top_srcdir)/internal/set_table.h io.$(OBJEXT): $(top_srcdir)/internal/static_assert.h io.$(OBJEXT): $(top_srcdir)/internal/string.h +io.$(OBJEXT): $(top_srcdir)/internal/struct.h io.$(OBJEXT): $(top_srcdir)/internal/thread.h io.$(OBJEXT): $(top_srcdir)/internal/transcode.h io.$(OBJEXT): $(top_srcdir)/internal/variable.h @@ -7396,6 +7409,7 @@ iseq.$(OBJEXT): $(top_srcdir)/internal/serial.h iseq.$(OBJEXT): $(top_srcdir)/internal/set_table.h iseq.$(OBJEXT): $(top_srcdir)/internal/static_assert.h iseq.$(OBJEXT): $(top_srcdir)/internal/string.h +iseq.$(OBJEXT): $(top_srcdir)/internal/struct.h iseq.$(OBJEXT): $(top_srcdir)/internal/symbol.h iseq.$(OBJEXT): $(top_srcdir)/internal/thread.h iseq.$(OBJEXT): $(top_srcdir)/internal/variable.h @@ -7645,6 +7659,7 @@ jit.$(OBJEXT): $(top_srcdir)/internal/serial.h jit.$(OBJEXT): $(top_srcdir)/internal/set_table.h jit.$(OBJEXT): $(top_srcdir)/internal/static_assert.h jit.$(OBJEXT): $(top_srcdir)/internal/string.h +jit.$(OBJEXT): $(top_srcdir)/internal/struct.h jit.$(OBJEXT): $(top_srcdir)/internal/variable.h jit.$(OBJEXT): $(top_srcdir)/internal/vm.h jit.$(OBJEXT): $(top_srcdir)/internal/warnings.h @@ -7897,6 +7912,7 @@ load.$(OBJEXT): $(top_srcdir)/internal/serial.h load.$(OBJEXT): $(top_srcdir)/internal/set_table.h load.$(OBJEXT): $(top_srcdir)/internal/static_assert.h load.$(OBJEXT): $(top_srcdir)/internal/string.h +load.$(OBJEXT): $(top_srcdir)/internal/struct.h load.$(OBJEXT): $(top_srcdir)/internal/thread.h load.$(OBJEXT): $(top_srcdir)/internal/variable.h load.$(OBJEXT): $(top_srcdir)/internal/vm.h @@ -9035,6 +9051,7 @@ memory_view.$(OBJEXT): $(top_srcdir)/internal/sanitizers.h memory_view.$(OBJEXT): $(top_srcdir)/internal/serial.h memory_view.$(OBJEXT): $(top_srcdir)/internal/set_table.h memory_view.$(OBJEXT): $(top_srcdir)/internal/static_assert.h +memory_view.$(OBJEXT): $(top_srcdir)/internal/struct.h memory_view.$(OBJEXT): $(top_srcdir)/internal/variable.h memory_view.$(OBJEXT): $(top_srcdir)/internal/vm.h memory_view.$(OBJEXT): $(top_srcdir)/internal/warnings.h @@ -9252,6 +9269,7 @@ miniinit.$(OBJEXT): $(top_srcdir)/internal/sanitizers.h miniinit.$(OBJEXT): $(top_srcdir)/internal/serial.h miniinit.$(OBJEXT): $(top_srcdir)/internal/set_table.h miniinit.$(OBJEXT): $(top_srcdir)/internal/static_assert.h +miniinit.$(OBJEXT): $(top_srcdir)/internal/struct.h miniinit.$(OBJEXT): $(top_srcdir)/internal/variable.h miniinit.$(OBJEXT): $(top_srcdir)/internal/vm.h miniinit.$(OBJEXT): $(top_srcdir)/internal/warnings.h @@ -9508,6 +9526,7 @@ node.$(OBJEXT): $(top_srcdir)/internal/sanitizers.h node.$(OBJEXT): $(top_srcdir)/internal/serial.h node.$(OBJEXT): $(top_srcdir)/internal/set_table.h node.$(OBJEXT): $(top_srcdir)/internal/static_assert.h +node.$(OBJEXT): $(top_srcdir)/internal/struct.h node.$(OBJEXT): $(top_srcdir)/internal/variable.h node.$(OBJEXT): $(top_srcdir)/internal/vm.h node.$(OBJEXT): $(top_srcdir)/internal/warnings.h @@ -9722,6 +9741,7 @@ node_dump.$(OBJEXT): $(top_srcdir)/internal/sanitizers.h node_dump.$(OBJEXT): $(top_srcdir)/internal/serial.h node_dump.$(OBJEXT): $(top_srcdir)/internal/set_table.h node_dump.$(OBJEXT): $(top_srcdir)/internal/static_assert.h +node_dump.$(OBJEXT): $(top_srcdir)/internal/struct.h node_dump.$(OBJEXT): $(top_srcdir)/internal/variable.h node_dump.$(OBJEXT): $(top_srcdir)/internal/vm.h node_dump.$(OBJEXT): $(top_srcdir)/internal/warnings.h @@ -9939,6 +9959,7 @@ numeric.$(OBJEXT): $(top_srcdir)/internal/serial.h numeric.$(OBJEXT): $(top_srcdir)/internal/set_table.h numeric.$(OBJEXT): $(top_srcdir)/internal/static_assert.h numeric.$(OBJEXT): $(top_srcdir)/internal/string.h +numeric.$(OBJEXT): $(top_srcdir)/internal/struct.h numeric.$(OBJEXT): $(top_srcdir)/internal/util.h numeric.$(OBJEXT): $(top_srcdir)/internal/variable.h numeric.$(OBJEXT): $(top_srcdir)/internal/vm.h @@ -10377,6 +10398,7 @@ pack.$(OBJEXT): $(top_srcdir)/internal/serial.h pack.$(OBJEXT): $(top_srcdir)/internal/set_table.h pack.$(OBJEXT): $(top_srcdir)/internal/static_assert.h pack.$(OBJEXT): $(top_srcdir)/internal/string.h +pack.$(OBJEXT): $(top_srcdir)/internal/struct.h pack.$(OBJEXT): $(top_srcdir)/internal/symbol.h pack.$(OBJEXT): $(top_srcdir)/internal/variable.h pack.$(OBJEXT): $(top_srcdir)/internal/vm.h @@ -10601,6 +10623,7 @@ parse.$(OBJEXT): $(top_srcdir)/internal/serial.h parse.$(OBJEXT): $(top_srcdir)/internal/set_table.h parse.$(OBJEXT): $(top_srcdir)/internal/static_assert.h parse.$(OBJEXT): $(top_srcdir)/internal/string.h +parse.$(OBJEXT): $(top_srcdir)/internal/struct.h parse.$(OBJEXT): $(top_srcdir)/internal/symbol.h parse.$(OBJEXT): $(top_srcdir)/internal/thread.h parse.$(OBJEXT): $(top_srcdir)/internal/variable.h @@ -12059,6 +12082,7 @@ proc.$(OBJEXT): $(top_srcdir)/internal/serial.h proc.$(OBJEXT): $(top_srcdir)/internal/set_table.h proc.$(OBJEXT): $(top_srcdir)/internal/static_assert.h proc.$(OBJEXT): $(top_srcdir)/internal/string.h +proc.$(OBJEXT): $(top_srcdir)/internal/struct.h proc.$(OBJEXT): $(top_srcdir)/internal/symbol.h proc.$(OBJEXT): $(top_srcdir)/internal/variable.h proc.$(OBJEXT): $(top_srcdir)/internal/vm.h @@ -12310,6 +12334,7 @@ process.$(OBJEXT): $(top_srcdir)/internal/serial.h process.$(OBJEXT): $(top_srcdir)/internal/set_table.h process.$(OBJEXT): $(top_srcdir)/internal/static_assert.h process.$(OBJEXT): $(top_srcdir)/internal/string.h +process.$(OBJEXT): $(top_srcdir)/internal/struct.h process.$(OBJEXT): $(top_srcdir)/internal/thread.h process.$(OBJEXT): $(top_srcdir)/internal/time.h process.$(OBJEXT): $(top_srcdir)/internal/variable.h @@ -12765,6 +12790,7 @@ random.$(OBJEXT): $(top_srcdir)/internal/sanitizers.h random.$(OBJEXT): $(top_srcdir)/internal/serial.h random.$(OBJEXT): $(top_srcdir)/internal/set_table.h random.$(OBJEXT): $(top_srcdir)/internal/static_assert.h +random.$(OBJEXT): $(top_srcdir)/internal/struct.h random.$(OBJEXT): $(top_srcdir)/internal/variable.h random.$(OBJEXT): $(top_srcdir)/internal/vm.h random.$(OBJEXT): $(top_srcdir)/internal/warnings.h @@ -13390,6 +13416,7 @@ re.$(OBJEXT): $(top_srcdir)/internal/serial.h re.$(OBJEXT): $(top_srcdir)/internal/set_table.h re.$(OBJEXT): $(top_srcdir)/internal/static_assert.h re.$(OBJEXT): $(top_srcdir)/internal/string.h +re.$(OBJEXT): $(top_srcdir)/internal/struct.h re.$(OBJEXT): $(top_srcdir)/internal/time.h re.$(OBJEXT): $(top_srcdir)/internal/variable.h re.$(OBJEXT): $(top_srcdir)/internal/vm.h @@ -14617,6 +14644,7 @@ ruby.$(OBJEXT): $(top_srcdir)/internal/serial.h ruby.$(OBJEXT): $(top_srcdir)/internal/set_table.h ruby.$(OBJEXT): $(top_srcdir)/internal/static_assert.h ruby.$(OBJEXT): $(top_srcdir)/internal/string.h +ruby.$(OBJEXT): $(top_srcdir)/internal/struct.h ruby.$(OBJEXT): $(top_srcdir)/internal/thread.h ruby.$(OBJEXT): $(top_srcdir)/internal/variable.h ruby.$(OBJEXT): $(top_srcdir)/internal/vm.h @@ -15259,6 +15287,7 @@ set.$(OBJEXT): $(top_srcdir)/internal/serial.h set.$(OBJEXT): $(top_srcdir)/internal/set_table.h set.$(OBJEXT): $(top_srcdir)/internal/static_assert.h set.$(OBJEXT): $(top_srcdir)/internal/string.h +set.$(OBJEXT): $(top_srcdir)/internal/struct.h set.$(OBJEXT): $(top_srcdir)/internal/symbol.h set.$(OBJEXT): $(top_srcdir)/internal/variable.h set.$(OBJEXT): $(top_srcdir)/internal/vm.h @@ -17321,6 +17350,7 @@ thread.$(OBJEXT): $(top_srcdir)/internal/set_table.h thread.$(OBJEXT): $(top_srcdir)/internal/signal.h thread.$(OBJEXT): $(top_srcdir)/internal/static_assert.h thread.$(OBJEXT): $(top_srcdir)/internal/string.h +thread.$(OBJEXT): $(top_srcdir)/internal/struct.h thread.$(OBJEXT): $(top_srcdir)/internal/thread.h thread.$(OBJEXT): $(top_srcdir)/internal/time.h thread.$(OBJEXT): $(top_srcdir)/internal/variable.h @@ -17577,6 +17607,7 @@ time.$(OBJEXT): $(top_srcdir)/internal/serial.h time.$(OBJEXT): $(top_srcdir)/internal/set_table.h time.$(OBJEXT): $(top_srcdir)/internal/static_assert.h time.$(OBJEXT): $(top_srcdir)/internal/string.h +time.$(OBJEXT): $(top_srcdir)/internal/struct.h time.$(OBJEXT): $(top_srcdir)/internal/time.h time.$(OBJEXT): $(top_srcdir)/internal/variable.h time.$(OBJEXT): $(top_srcdir)/internal/vm.h @@ -18876,6 +18907,7 @@ vm_backtrace.$(OBJEXT): $(top_srcdir)/internal/serial.h vm_backtrace.$(OBJEXT): $(top_srcdir)/internal/set_table.h vm_backtrace.$(OBJEXT): $(top_srcdir)/internal/static_assert.h vm_backtrace.$(OBJEXT): $(top_srcdir)/internal/string.h +vm_backtrace.$(OBJEXT): $(top_srcdir)/internal/struct.h vm_backtrace.$(OBJEXT): $(top_srcdir)/internal/variable.h vm_backtrace.$(OBJEXT): $(top_srcdir)/internal/vm.h vm_backtrace.$(OBJEXT): $(top_srcdir)/internal/warnings.h @@ -19109,6 +19141,7 @@ vm_dump.$(OBJEXT): $(top_srcdir)/internal/sanitizers.h vm_dump.$(OBJEXT): $(top_srcdir)/internal/serial.h vm_dump.$(OBJEXT): $(top_srcdir)/internal/set_table.h vm_dump.$(OBJEXT): $(top_srcdir)/internal/static_assert.h +vm_dump.$(OBJEXT): $(top_srcdir)/internal/struct.h vm_dump.$(OBJEXT): $(top_srcdir)/internal/variable.h vm_dump.$(OBJEXT): $(top_srcdir)/internal/vm.h vm_dump.$(OBJEXT): $(top_srcdir)/internal/warnings.h @@ -19556,6 +19589,7 @@ vm_trace.$(OBJEXT): $(top_srcdir)/internal/sanitizers.h vm_trace.$(OBJEXT): $(top_srcdir)/internal/serial.h vm_trace.$(OBJEXT): $(top_srcdir)/internal/set_table.h vm_trace.$(OBJEXT): $(top_srcdir)/internal/static_assert.h +vm_trace.$(OBJEXT): $(top_srcdir)/internal/struct.h vm_trace.$(OBJEXT): $(top_srcdir)/internal/symbol.h vm_trace.$(OBJEXT): $(top_srcdir)/internal/thread.h vm_trace.$(OBJEXT): $(top_srcdir)/internal/variable.h @@ -20008,6 +20042,7 @@ yjit.$(OBJEXT): $(top_srcdir)/internal/serial.h yjit.$(OBJEXT): $(top_srcdir)/internal/set_table.h yjit.$(OBJEXT): $(top_srcdir)/internal/static_assert.h yjit.$(OBJEXT): $(top_srcdir)/internal/string.h +yjit.$(OBJEXT): $(top_srcdir)/internal/struct.h yjit.$(OBJEXT): $(top_srcdir)/internal/variable.h yjit.$(OBJEXT): $(top_srcdir)/internal/vm.h yjit.$(OBJEXT): $(top_srcdir)/internal/warnings.h @@ -20262,6 +20297,7 @@ zjit.$(OBJEXT): $(top_srcdir)/internal/serial.h zjit.$(OBJEXT): $(top_srcdir)/internal/set_table.h zjit.$(OBJEXT): $(top_srcdir)/internal/static_assert.h zjit.$(OBJEXT): $(top_srcdir)/internal/string.h +zjit.$(OBJEXT): $(top_srcdir)/internal/struct.h zjit.$(OBJEXT): $(top_srcdir)/internal/variable.h zjit.$(OBJEXT): $(top_srcdir)/internal/vm.h zjit.$(OBJEXT): $(top_srcdir)/internal/warnings.h diff --git a/ext/objspace/depend b/ext/objspace/depend index bc1565aa49c367..04b26eb6c26567 100644 --- a/ext/objspace/depend +++ b/ext/objspace/depend @@ -401,6 +401,7 @@ objspace.o: $(top_srcdir)/internal/sanitizers.h objspace.o: $(top_srcdir)/internal/serial.h objspace.o: $(top_srcdir)/internal/set_table.h objspace.o: $(top_srcdir)/internal/static_assert.h +objspace.o: $(top_srcdir)/internal/struct.h objspace.o: $(top_srcdir)/internal/variable.h objspace.o: $(top_srcdir)/internal/vm.h objspace.o: $(top_srcdir)/internal/warnings.h @@ -617,6 +618,7 @@ objspace_dump.o: $(top_srcdir)/internal/serial.h objspace_dump.o: $(top_srcdir)/internal/set_table.h objspace_dump.o: $(top_srcdir)/internal/static_assert.h objspace_dump.o: $(top_srcdir)/internal/string.h +objspace_dump.o: $(top_srcdir)/internal/struct.h objspace_dump.o: $(top_srcdir)/internal/variable.h objspace_dump.o: $(top_srcdir)/internal/vm.h objspace_dump.o: $(top_srcdir)/internal/warnings.h diff --git a/ext/ripper/depend b/ext/ripper/depend index 0086708d23b0a6..bd2de759065ba2 100644 --- a/ext/ripper/depend +++ b/ext/ripper/depend @@ -605,6 +605,7 @@ ripper.o: $(top_srcdir)/internal/serial.h ripper.o: $(top_srcdir)/internal/set_table.h ripper.o: $(top_srcdir)/internal/static_assert.h ripper.o: $(top_srcdir)/internal/string.h +ripper.o: $(top_srcdir)/internal/struct.h ripper.o: $(top_srcdir)/internal/symbol.h ripper.o: $(top_srcdir)/internal/thread.h ripper.o: $(top_srcdir)/internal/variable.h diff --git a/gc.c b/gc.c index 9ac68ccb40e09d..e81c004bd88bea 100644 --- a/gc.c +++ b/gc.c @@ -3171,7 +3171,7 @@ gc_mark_classext_iclass(rb_classext_t *ext, bool prime, VALUE box_value, void *a void rb_gc_move_obj_during_marking(VALUE from, VALUE to) { - if (rb_obj_gen_fields_p(to)) { + if (rb_obj_using_gen_fields_table_p(to)) { rb_mark_generic_ivar(from); } } @@ -3181,7 +3181,7 @@ rb_gc_mark_children(void *objspace, VALUE obj) { struct gc_mark_classext_foreach_arg foreach_args; - if (rb_obj_gen_fields_p(obj)) { + if (rb_obj_using_gen_fields_table_p(obj)) { rb_mark_generic_ivar(obj); } diff --git a/shape.h b/shape.h index af6add9e08158a..96c78f2bc1a356 100644 --- a/shape.h +++ b/shape.h @@ -2,6 +2,7 @@ #define RUBY_SHAPE_H #include "internal/gc.h" +#include "internal/struct.h" typedef uint16_t attr_index_t; typedef uint32_t shape_id_t; @@ -452,6 +453,25 @@ rb_obj_gen_fields_p(VALUE obj) return rb_shape_obj_has_fields(obj); } +static inline bool +rb_obj_using_gen_fields_table_p(VALUE obj) +{ + switch (BUILTIN_TYPE(obj)) { + case T_DATA: + if (RTYPEDDATA_P(obj)) return false; + break; + + case T_STRUCT: + if (!FL_TEST_RAW(obj, RSTRUCT_GEN_FIELDS)) return false; + break; + + default: + break; + } + + return rb_obj_gen_fields_p(obj); +} + // For ext/objspace RUBY_SYMBOL_EXPORT_BEGIN typedef void each_shape_callback(shape_id_t shape_id, void *data); From 51ab7b0405e39d6defe0b236e23f43b42aa6c1da Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Fri, 9 Jan 2026 09:21:45 +0100 Subject: [PATCH 2/2] YJIT: gen_struct_aset check for frozen status --- yjit/src/codegen.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/yjit/src/codegen.rs b/yjit/src/codegen.rs index 61de6a32dabe8a..0fc39322fb13b6 100644 --- a/yjit/src/codegen.rs +++ b/yjit/src/codegen.rs @@ -8947,6 +8947,12 @@ fn gen_struct_aset( return None; } + // If the comptime receiver is frozen, writing a struct member will raise an exception + // and we don't want to JIT code to deal with that situation. + if comptime_recv.is_frozen() { + return None; + } + if c_method_tracing_currently_enabled(jit) { // Struct accesses need fire c_call and c_return events, which we can't support // See :attr-tracing: