summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Hawthorn <[email protected]>2025-05-22 16:07:22 -0700
committerJohn Hawthorn <[email protected]>2025-05-23 10:22:24 -0700
commite01e89f55c82be8db5d8ccbf305ee38e3769e582 (patch)
tree2697dd082c8d70b19b315a8ab2b6a90a963a8ca2
parent11ad7f5f47b4e4919bcf7a03338a62ef5b5396cc (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.yml23
-rw-r--r--object.c17
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
diff --git a/object.c b/object.c
index f5f5759d11..b9b6f928aa 100644
--- a/object.c
+++ b/object.c
@@ -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;
}
}