From a8541475d1339ce242357822dd49d775645ce76d Mon Sep 17 00:00:00 2001 From: John Hawthorn Date: Fri, 4 Mar 2022 23:31:37 -0800 Subject: Faster rb_class_superclass This uses the RCLASS_SUPERCLASSES array to quickly find the next SUPERCLASS of klass which is a T_CLASS. --- object.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) (limited to 'object.c') diff --git a/object.c b/object.c index eaf30e0dff..47ccedc4f7 100644 --- a/object.c +++ b/object.c @@ -2038,19 +2038,18 @@ rb_class_new_instance(int argc, const VALUE *argv, VALUE klass) VALUE rb_class_superclass(VALUE klass) { + RUBY_ASSERT(RB_TYPE_P(klass, T_CLASS)); + VALUE super = RCLASS_SUPER(klass); if (!super) { if (klass == rb_cBasicObject) return Qnil; rb_raise(rb_eTypeError, "uninitialized class"); + } else { + super = RCLASS_SUPERCLASSES(klass)[RCLASS_SUPERCLASS_DEPTH(klass) - 1]; + RUBY_ASSERT(RB_TYPE_P(klass, T_CLASS)); + return super; } - while (RB_TYPE_P(super, T_ICLASS)) { - super = RCLASS_SUPER(super); - } - if (!super) { - return Qnil; - } - return super; } VALUE -- cgit v1.2.1