diff options
Diffstat (limited to 'class.c')
-rw-r--r-- | class.c | 15 |
1 files changed, 14 insertions, 1 deletions
@@ -442,6 +442,19 @@ rb_singleton_class_attached(VALUE klass, VALUE obj) */ #define META_CLASS_OF_CLASS_CLASS_P(k) (METACLASS_OF(k) == (k)) +static int +rb_singleton_class_has_metaclass_p(VALUE sklass) +{ + return rb_attr_get(METACLASS_OF(sklass), id_attached) == sklass; +} + +int +rb_singleton_class_internal_p(VALUE sklass) +{ + return (RB_TYPE_P(rb_attr_get(sklass, id_attached), T_CLASS) && + !rb_singleton_class_has_metaclass_p(sklass)); +} + /*! * whether k has a metaclass * @retval 1 if \a k has a metaclass @@ -449,7 +462,7 @@ rb_singleton_class_attached(VALUE klass, VALUE obj) */ #define HAVE_METACLASS_P(k) \ (FL_TEST(METACLASS_OF(k), FL_SINGLETON) && \ - rb_ivar_get(METACLASS_OF(k), id_attached) == (k)) + rb_singleton_class_has_metaclass_p(k)) /*! * ensures \a klass belongs to its own eigenclass. |