diff options
| author | Jean Boussier <jean.boussier@gmail.com> | 2025-08-30 12:15:11 +0200 |
|---|---|---|
| committer | Jean Boussier <jean.boussier@gmail.com> | 2025-08-30 14:14:10 +0200 |
| commit | 01b89528cb663e1e533375d4282d906e49ca1496 (patch) | |
| tree | a6be43ca0e7388152acd93f7e8fa0a9f081050ba /object.c | |
| parent | fd0c772db7e5098c2b8e03559317a3592074dfe7 (diff) | |
object.c: improve fake_class_p to also handle T_MODULE
This requires ensuring T_MODULE never has FL_SINGLETON set,
so RMODULE_IS_REFINEMENT had to be moved.
Diffstat (limited to 'object.c')
| -rw-r--r-- | object.c | 22 |
1 files changed, 11 insertions, 11 deletions
@@ -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) { |
