summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean Boussier <jean.boussier@gmail.com>2025-08-30 13:32:44 +0200
committerJean Boussier <jean.boussier@gmail.com>2025-08-30 14:14:10 +0200
commitd89e73471db85f60ce45021f85487194124fe594 (patch)
tree5467c7d110f9d232add982d96ebc9a4e7a642ecf
parentf5da6395bd3fdf4b76a480f174cd304823ddc57f (diff)
object.c: refactor rb_obj_class and rb_class_real
-rw-r--r--object.c25
1 files changed, 15 insertions, 10 deletions
diff --git a/object.c b/object.c
index 1ac14ec634..f2e307c547 100644
--- a/object.c
+++ b/object.c
@@ -289,11 +289,21 @@ fake_class_p(VALUE klass)
return FL_TEST_RAW(klass, T_ICLASS | FL_SINGLETON);
}
+static inline VALUE
+class_real(VALUE cl)
+{
+ RUBY_ASSERT(cl);
+ while (RB_UNLIKELY(fake_class_p(cl))) {
+ cl = RCLASS_SUPER(cl);
+ }
+ return cl;
+}
+
VALUE
rb_class_real(VALUE cl)
{
- while (RB_UNLIKELY(cl && fake_class_p(cl))) {
- cl = RCLASS_SUPER(cl);
+ if (cl) {
+ cl = class_real(cl);
}
return cl;
}
@@ -302,8 +312,8 @@ VALUE
rb_obj_class(VALUE obj)
{
VALUE cl = CLASS_OF(obj);
- while (RB_UNLIKELY(cl && fake_class_p(cl))) {
- cl = RCLASS_SUPER(cl);
+ if (cl) {
+ cl = class_real(cl);
}
return cl;
}
@@ -311,12 +321,7 @@ rb_obj_class(VALUE obj)
VALUE
rb_obj_class_must(VALUE obj)
{
- VALUE cl = CLASS_OF(obj);
- RUBY_ASSERT(cl);
- while (RB_UNLIKELY(fake_class_p(cl))) {
- cl = RCLASS_SUPER(cl);
- }
- return cl;
+ return class_real(CLASS_OF(obj));
}
/*