From d4f3dcf4dff80ded472ba3061e62c6c676ffab8c Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Sun, 3 Mar 2024 10:46:46 +0100 Subject: Refactor VM root modules This `st_table` is used to both mark and pin classes defined from the C API. But `vm->mark_object_ary` already does both much more efficiently. Currently a Ruby process starts with 252 rooted classes, which uses `7224B` in an `st_table` or `2016B` in an `RArray`. So a baseline of 5kB saved, but since `mark_object_ary` is preallocated with `1024` slots but only use `405` of them, it's a net `7kB` save. `vm->mark_object_ary` is also being refactored. Prior to this changes, `mark_object_ary` was a regular `RArray`, but since this allows for references to be moved, it was marked a second time from `rb_vm_mark()` to pin these objects. This has the detrimental effect of marking these references on every minors even though it's a mostly append only list. But using a custom TypedData we can save from having to mark all the references on minor GC runs. Addtionally, immediate values are now ignored and not appended to `vm->mark_object_ary` as it's just wasted space. --- complex.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'complex.c') diff --git a/complex.c b/complex.c index 92245bc9e8..4e2bff5df4 100644 --- a/complex.c +++ b/complex.c @@ -2723,7 +2723,7 @@ Init_Complex(void) f_complex_new_bang2(rb_cComplex, ZERO, ONE)); #if !USE_FLONUM - rb_gc_register_mark_object(RFLOAT_0 = DBL2NUM(0.0)); + rb_vm_register_global_object(RFLOAT_0 = DBL2NUM(0.0)); #endif rb_provide("complex.so"); /* for backward compatibility */ -- cgit v1.2.3