diff options
author | Jean Boussier <[email protected]> | 2025-05-13 16:27:43 +0200 |
---|---|---|
committer | Jean Boussier <[email protected]> | 2025-05-14 10:17:03 +0200 |
commit | 130d6aaef297ec43ed24f413624088f41bc616b3 (patch) | |
tree | 452251c0e321e5ca86205cd674bd5765e49d611b /class.c | |
parent | f855bcc6b27bd2e67babbb082213ab4c9c15f8c9 (diff) |
Reclaim one `VALUE` from `rb_classext_t` by shrinking `super_classdepth`
By making `super_classdepth` `uint16_t`, classes and modules can
now fit in 160B slots again.
The downside of course is that before `super_classdepth` was large
enough we never had to care about overflow, as you couldn't
realistically create enough classes to ever go over it.
With this change, while it is stupid, you could realistically
create an ancestor chain containing 65k classes and modules.
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/13319
Diffstat (limited to 'class.c')
-rw-r--r-- | class.c | 4 |
1 files changed, 3 insertions, 1 deletions
@@ -827,7 +827,9 @@ rb_class_update_superclasses(VALUE klass) superclasses = class_superclasses_including_self(super); RCLASS_WRITE_SUPERCLASSES(super, super_depth, superclasses, true, true); } - RCLASS_WRITE_SUPERCLASSES(klass, super_depth + 1, superclasses, false, false); + + size_t depth = super_depth == RCLASS_MAX_SUPERCLASS_DEPTH ? super_depth : super_depth + 1; + RCLASS_WRITE_SUPERCLASSES(klass, depth, superclasses, false, false); } void |