From b929af430c39df6597d2f3f53b82c38b1d76217b Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Fri, 24 Sep 2021 01:30:00 +0900 Subject: Use the flag for uninitialized module [Bug #18185] Make `Module#ancestors` not to include `BasicObject`. --- class.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) (limited to 'class.c') diff --git a/class.c b/class.c index 8e37f8a93e..ca8bdc2e79 100644 --- a/class.c +++ b/class.c @@ -351,19 +351,22 @@ copy_tables(VALUE clone, VALUE orig) static bool ensure_origin(VALUE klass); +/** + * If this flag is set, that module is allocated but not initialized yet. + */ +enum {RMODULE_ALLOCATED_BUT_NOT_INITIALIZED = RUBY_FL_USER5}; + static inline bool RMODULE_UNINITIALIZED(VALUE module) { - return RCLASS_SUPER(module) == rb_cBasicObject; + return FL_TEST_RAW(module, RMODULE_ALLOCATED_BUT_NOT_INITIALIZED); } void rb_module_set_initialized(VALUE mod) { - if (RMODULE_UNINITIALIZED(mod)) { - RB_OBJ_WRITE(mod, &RCLASS(mod)->super, 0); - /* no more re-initialization */ - } + FL_UNSET_RAW(mod, RMODULE_ALLOCATED_BUT_NOT_INITIALIZED); + /* no more re-initialization */ } void @@ -817,7 +820,7 @@ rb_module_s_alloc(VALUE klass) { VALUE mod = class_alloc(T_MODULE, klass); RCLASS_M_TBL_INIT(mod); - RB_OBJ_WRITE(mod, &RCLASS(mod)->super, rb_cBasicObject); + FL_SET(mod, RMODULE_ALLOCATED_BUT_NOT_INITIALIZED); return mod; } -- cgit v1.2.1