summaryrefslogtreecommitdiff
path: root/object.c
diff options
context:
space:
mode:
Diffstat (limited to 'object.c')
-rw-r--r--object.c22
1 files changed, 11 insertions, 11 deletions
diff --git a/object.c b/object.c
index 9a770e64f9..dc5ab2d934 100644
--- a/object.c
+++ b/object.c
@@ -278,25 +278,25 @@ rb_obj_not_equal(VALUE obj1, VALUE obj2)
return rb_obj_not(result);
}
+static inline VALUE
+fake_class_p(VALUE klass)
+{
+ RUBY_ASSERT(RB_TYPE_P(klass, T_CLASS) || RB_TYPE_P(klass, T_MODULE) || RB_TYPE_P(klass, T_ICLASS));
+ STATIC_ASSERT(t_iclass_overlap_t_class, !(T_CLASS & T_ICLASS));
+ STATIC_ASSERT(t_iclass_overlap_t_module, !(T_MODULE & T_ICLASS));
+
+ return FL_TEST_RAW(klass, T_ICLASS | FL_SINGLETON);
+}
+
VALUE
rb_class_real(VALUE cl)
{
- while (cl &&
- (RCLASS_SINGLETON_P(cl) || BUILTIN_TYPE(cl) == T_ICLASS)) {
+ while (RB_UNLIKELY(cl && fake_class_p(cl))) {
cl = RCLASS_SUPER(cl);
}
return cl;
}
-static inline VALUE
-fake_class_p(VALUE klass)
-{
- RUBY_ASSERT(RB_TYPE_P(klass, T_CLASS) || RB_TYPE_P(klass, T_ICLASS));
- STATIC_ASSERT(t_iclass_overlap, !(T_CLASS & T_ICLASS));
-
- return FL_TEST_RAW(klass, T_ICLASS | FL_SINGLETON);
-}
-
VALUE
rb_obj_class(VALUE obj)
{