diff options
| author | Satoshi Tagomori <s-tagomori@sakura.ad.jp> | 2025-10-07 12:42:03 +0900 |
|---|---|---|
| committer | Satoshi Tagomori <tagomoris@gmail.com> | 2025-10-07 14:19:26 +0900 |
| commit | 2548c476a379cebe85166f20e264ae68c2a68dc4 (patch) | |
| tree | 29d272818bc4f4c6b7602f3c4a91693b6ecf9b2f /internal | |
| parent | 52c6b32f806b1b812069235fde48e68167eaa0d1 (diff) | |
Add namespace debug methods and assertions
Diffstat (limited to 'internal')
| -rw-r--r-- | internal/class.h | 14 |
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); } } |
