diff options
| author | Jean Boussier <jean.boussier@gmail.com> | 2025-06-18 11:24:48 +0100 |
|---|---|---|
| committer | Jean Boussier <jean.boussier@gmail.com> | 2025-06-23 10:04:58 +0100 |
| commit | ea4a53c59561985df8b56e00890c75333b641788 (patch) | |
| tree | 4ccd45cf29438b0f907e8b9af5909e8e9746801e /internal | |
| parent | 071b9affe6d132def0937cb7562582d96c5d0bb3 (diff) | |
Avoid creating namespace table for classes that can't be namespaced.
Diffstat (limited to 'internal')
| -rw-r--r-- | internal/class.h | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/internal/class.h b/internal/class.h index bbc17d05e2..68cd813cb1 100644 --- a/internal/class.h +++ b/internal/class.h @@ -171,8 +171,6 @@ static inline rb_classext_t * RCLASS_EXT_WRITABLE_IN_NS(VALUE obj, const rb_name static inline rb_classext_t * RCLASS_EXT_WRITABLE(VALUE obj); // Raw accessor -#define RCLASS_CLASSEXT_TBL(klass) (RCLASS(klass)->ns_classext_tbl) - #define RCLASSEXT_NS(ext) (ext->ns) #define RCLASSEXT_SUPER(ext) (ext->super) #define RCLASSEXT_FIELDS(ext) (ext->fields_obj ? ROBJECT_FIELDS(ext->fields_obj) : NULL) @@ -295,6 +293,22 @@ static inline void RCLASS_WRITE_CLASSPATH(VALUE klass, VALUE classpath, bool per // 3 is RMODULE_IS_REFINEMENT for RMODULE #define RCLASS_NAMESPACEABLE FL_USER4 +static inline st_table * +RCLASS_CLASSEXT_TBL(VALUE klass) +{ + if (FL_TEST_RAW(klass, RCLASS_NAMESPACEABLE)) { + return RCLASS(klass)->ns_classext_tbl; + } + return NULL; +} + +static inline void +RCLASS_SET_CLASSEXT_TBL(VALUE klass, st_table *tbl) +{ + RUBY_ASSERT(FL_TEST_RAW(klass, RCLASS_NAMESPACEABLE)); + RCLASS(klass)->ns_classext_tbl = tbl; +} + /* class.c */ rb_classext_t * rb_class_duplicate_classext(rb_classext_t *orig, VALUE obj, const rb_namespace_t *ns); void rb_class_ensure_writable(VALUE obj); @@ -308,7 +322,8 @@ RCLASS_SET_NAMESPACE_CLASSEXT(VALUE obj, const rb_namespace_t *ns, rb_classext_t VM_ASSERT(ns->ns_object); VM_ASSERT(RCLASSEXT_NS(ext) == ns); if (!tbl) { - RCLASS_CLASSEXT_TBL(obj) = tbl = st_init_numtable_with_size(1); + tbl = st_init_numtable_with_size(1); + RCLASS_SET_CLASSEXT_TBL(obj, tbl); } if (rb_st_table_size(tbl) == 0) { first_set = 1; @@ -322,7 +337,7 @@ RCLASS_PRIME_CLASSEXT_READABLE_P(VALUE klass) { VM_ASSERT(RB_TYPE_P(klass, T_CLASS) || RB_TYPE_P(klass, T_MODULE) || RB_TYPE_P(klass, T_ICLASS)); // if the lookup table exists, then it means the prime classext is NOT directly readable. - return RCLASS_CLASSEXT_TBL(klass) == NULL; + return !FL_TEST_RAW(klass, RCLASS_NAMESPACEABLE) || RCLASS_CLASSEXT_TBL(klass) == NULL; } static inline bool |
