diff options
author | John Hawthorn <[email protected]> | 2025-05-22 16:07:22 -0700 |
---|---|---|
committer | John Hawthorn <[email protected]> | 2025-05-23 10:22:24 -0700 |
commit | e01e89f55c82be8db5d8ccbf305ee38e3769e582 (patch) | |
tree | 2697dd082c8d70b19b315a8ab2b6a90a963a8ca2 | |
parent | 11ad7f5f47b4e4919bcf7a03338a62ef5b5396cc (diff) |
Avoid calling RCLASS_SUPER in rb_class_superclass
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/13420
-rw-r--r-- | benchmark/class_superclass.yml | 23 | ||||
-rw-r--r-- | object.c | 17 |
2 files changed, 31 insertions, 9 deletions
diff --git a/benchmark/class_superclass.yml b/benchmark/class_superclass.yml new file mode 100644 index 0000000000..847ff811f1 --- /dev/null +++ b/benchmark/class_superclass.yml @@ -0,0 +1,23 @@ +prelude: | + class SimpleClass; end + class OneModuleClass + 1.times { include Module.new } + end + class MediumClass + 10.times { include Module.new } + end + class LargeClass + 100.times { include Module.new } + end +benchmark: + object_class_superclass: | + Object.superclass + simple_class_superclass: | + SimpleClass.superclass + one_module_class: | + OneModuleClass.superclass + medium_class_superclass: | + MediumClass.superclass + large_class_superclass: | + LargeClass.superclass +loop_count: 20000000 @@ -2259,23 +2259,22 @@ rb_class_superclass(VALUE klass) { RUBY_ASSERT(RB_TYPE_P(klass, T_CLASS)); - VALUE super = RCLASS_SUPER(klass); - VALUE *superclasses; - size_t superclasses_depth; + VALUE *superclasses = RCLASS_SUPERCLASSES(klass); + size_t superclasses_depth = RCLASS_SUPERCLASS_DEPTH(klass); - if (!super) { - if (klass == rb_cBasicObject) return Qnil; + if (klass == rb_cBasicObject) return Qnil; + + if (!superclasses) { + RUBY_ASSERT(!RCLASS_SUPER(klass)); rb_raise(rb_eTypeError, "uninitialized class"); } - superclasses_depth = RCLASS_SUPERCLASS_DEPTH(klass); if (!superclasses_depth) { return Qnil; } else { - superclasses = RCLASS_SUPERCLASSES(klass); - super = superclasses[superclasses_depth - 1]; - RUBY_ASSERT(RB_TYPE_P(klass, T_CLASS)); + VALUE super = superclasses[superclasses_depth - 1]; + RUBY_ASSERT(RB_TYPE_P(super, T_CLASS)); return super; } } |