summaryrefslogtreecommitdiff
path: root/internal
diff options
context:
space:
mode:
authorJean Boussier <jean.boussier@gmail.com>2025-06-18 11:24:48 +0100
committerJean Boussier <jean.boussier@gmail.com>2025-06-23 10:04:58 +0100
commitea4a53c59561985df8b56e00890c75333b641788 (patch)
tree4ccd45cf29438b0f907e8b9af5909e8e9746801e /internal
parent071b9affe6d132def0937cb7562582d96c5d0bb3 (diff)
Avoid creating namespace table for classes that can't be namespaced.
Diffstat (limited to 'internal')
-rw-r--r--internal/class.h23
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