diff options
author | Jean Boussier <[email protected]> | 2024-03-03 10:46:46 +0100 |
---|---|---|
committer | Peter Zhu <[email protected]> | 2024-03-06 15:33:43 -0500 |
commit | d4f3dcf4dff80ded472ba3061e62c6c676ffab8c () | |
tree | 4dd0954969e05925932b38ebd275d125f2304339 /struct.c | |
parent | 16ec54ec4177f959b6912745460fd6a96d906d82 (diff) |
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.
-rw-r--r-- | struct.c | 4 |
1 files changed, 2 insertions, 2 deletions
@@ -496,7 +496,7 @@ rb_struct_define(const char *name, ...) } else { st = new_struct(rb_str_new2(name), rb_cStruct); - rb_vm_add_root_module(st); } return setup_struct(st, ary); } @@ -1705,7 +1705,7 @@ rb_data_define(VALUE super, ...) va_end(ar); if (!super) super = rb_cData; VALUE klass = setup_data(anonymous_struct(super), ary); - rb_vm_add_root_module(klass); return klass; } |