summaryrefslogtreecommitdiff
path: root/class.c
diff options
context:
space:
mode:
authorJean Boussier <[email protected]>2025-05-13 16:27:43 +0200
committerJean Boussier <[email protected]>2025-05-14 10:17:03 +0200
commit130d6aaef297ec43ed24f413624088f41bc616b3 (patch)
tree452251c0e321e5ca86205cd674bd5765e49d611b /class.c
parentf855bcc6b27bd2e67babbb082213ab4c9c15f8c9 (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.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/class.c b/class.c
index 4ca8c77dee..6d81654142 100644
--- a/class.c
+++ b/class.c
@@ -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