summaryrefslogtreecommitdiff
path: root/internal
diff options
context:
space:
mode:
authorSatoshi Tagomori <s-tagomori@sakura.ad.jp>2025-10-07 12:42:03 +0900
committerSatoshi Tagomori <tagomoris@gmail.com>2025-10-07 14:19:26 +0900
commit2548c476a379cebe85166f20e264ae68c2a68dc4 (patch)
tree29d272818bc4f4c6b7602f3c4a91693b6ecf9b2f /internal
parent52c6b32f806b1b812069235fde48e68167eaa0d1 (diff)
Add namespace debug methods and assertions
Diffstat (limited to 'internal')
-rw-r--r--internal/class.h14
1 files changed, 10 insertions, 4 deletions
diff --git a/internal/class.h b/internal/class.h
index 29b3526cf5..f5c5142b45 100644
--- a/internal/class.h
+++ b/internal/class.h
@@ -336,10 +336,14 @@ RCLASS_SET_NAMESPACE_CLASSEXT(VALUE obj, const rb_namespace_t *ns, rb_classext_t
return first_set;
}
+#define VM_ASSERT_NAMESPACEABLE_TYPE(klass) \
+ VM_ASSERT(RB_TYPE_P(klass, T_CLASS) || RB_TYPE_P(klass, T_MODULE) || RB_TYPE_P(klass, T_ICLASS), "%s is not namespaceable type", rb_type_str(BUILTIN_TYPE(klass)))
+
static inline bool
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));
+ VM_ASSERT(klass != 0, "klass should be a valid object");
+ VM_ASSERT_NAMESPACEABLE_TYPE(klass);
// if the lookup table exists, then it means the prime classext is NOT directly readable.
return !FL_TEST_RAW(klass, RCLASS_NAMESPACEABLE) || RCLASS_CLASSEXT_TBL(klass) == NULL;
}
@@ -347,15 +351,16 @@ RCLASS_PRIME_CLASSEXT_READABLE_P(VALUE klass)
static inline bool
RCLASS_PRIME_CLASSEXT_WRITABLE_P(VALUE klass)
{
- VM_ASSERT(RB_TYPE_P(klass, T_CLASS) || RB_TYPE_P(klass, T_MODULE) || RB_TYPE_P(klass, T_ICLASS));
+ VM_ASSERT(klass != 0, "klass should be a valid object");
+ VM_ASSERT_NAMESPACEABLE_TYPE(klass);
return FL_TEST(klass, RCLASS_PRIME_CLASSEXT_WRITABLE);
}
static inline void
RCLASS_SET_PRIME_CLASSEXT_WRITABLE(VALUE klass, bool writable)
{
- VM_ASSERT(RB_TYPE_P(klass, T_CLASS) || RB_TYPE_P(klass, T_MODULE) || RB_TYPE_P(klass, T_ICLASS));
-
+ VM_ASSERT(klass != 0, "klass should be a valid object");
+ VM_ASSERT_NAMESPACEABLE_TYPE(klass);
if (writable) {
FL_SET(klass, RCLASS_PRIME_CLASSEXT_WRITABLE);
}
@@ -429,6 +434,7 @@ RCLASS_EXT_WRITABLE_LOOKUP(VALUE obj, const rb_namespace_t *ns)
ext = rb_class_duplicate_classext(RCLASS_EXT_PRIME(obj), obj, ns);
first_set = RCLASS_SET_NAMESPACE_CLASSEXT(obj, ns, ext);
if (first_set) {
+ // TODO: are there any case that a class/module become non-writable after its birthtime?
RCLASS_SET_PRIME_CLASSEXT_WRITABLE(obj, false);
}
}