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 (patch) | |
tree | 4dd0954969e05925932b38ebd275d125f2304339 /internal/class.h | |
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.
Diffstat (limited to 'internal/class.h')
-rw-r--r-- | internal/class.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/internal/class.h b/internal/class.h index 7f700c675c..8a6c956233 100644 --- a/internal/class.h +++ b/internal/class.h @@ -108,6 +108,7 @@ struct RClass_and_rb_classext_t { #define RCLASS_SUPERCLASSES(c) (RCLASS_EXT(c)->superclasses) #define RCLASS_ATTACHED_OBJECT(c) (RCLASS_EXT(c)->as.singleton_class.attached_object) +#define RCLASS_IS_ROOT FL_USER0 #define RICLASS_IS_ORIGIN FL_USER0 #define RCLASS_SUPERCLASSES_INCLUDE_SELF FL_USER2 #define RICLASS_ORIGIN_SHARED_MTBL FL_USER3 |