From 130d6aaef297ec43ed24f413624088f41bc616b3 Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Tue, 13 May 2025 16:27:43 +0200 Subject: 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. --- class.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'class.c') 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 -- cgit v1.2.3