Avoid calling RCLASS_SUPER in rb_class_superclass
This commit is contained in:
parent
11ad7f5f47
commit
e01e89f55c
Notes:
git
2025-05-23 17:22:37 +00:00
23
benchmark/class_superclass.yml
Normal file
23
benchmark/class_superclass.yml
Normal file
@ -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
|
17
object.c
17
object.c
@ -2259,23 +2259,22 @@ rb_class_superclass(VALUE klass)
|
|||||||
{
|
{
|
||||||
RUBY_ASSERT(RB_TYPE_P(klass, T_CLASS));
|
RUBY_ASSERT(RB_TYPE_P(klass, T_CLASS));
|
||||||
|
|
||||||
VALUE super = RCLASS_SUPER(klass);
|
VALUE *superclasses = RCLASS_SUPERCLASSES(klass);
|
||||||
VALUE *superclasses;
|
size_t superclasses_depth = RCLASS_SUPERCLASS_DEPTH(klass);
|
||||||
size_t superclasses_depth;
|
|
||||||
|
|
||||||
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");
|
rb_raise(rb_eTypeError, "uninitialized class");
|
||||||
}
|
}
|
||||||
|
|
||||||
superclasses_depth = RCLASS_SUPERCLASS_DEPTH(klass);
|
|
||||||
if (!superclasses_depth) {
|
if (!superclasses_depth) {
|
||||||
return Qnil;
|
return Qnil;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
superclasses = RCLASS_SUPERCLASSES(klass);
|
VALUE super = superclasses[superclasses_depth - 1];
|
||||||
super = superclasses[superclasses_depth - 1];
|
RUBY_ASSERT(RB_TYPE_P(super, T_CLASS));
|
||||||
RUBY_ASSERT(RB_TYPE_P(klass, T_CLASS));
|
|
||||||
return super;
|
return super;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user