summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Zhu <peter@peterzhu.ca>2023-06-14 08:01:15 -0400
committerPeter Zhu <peter@peterzhu.ca>2023-06-14 10:42:40 -0400
commit813a5f4fc46a24ca1695d23c159250b9e1080ac7 (patch)
tree1bd011d57bfd9b636737e07c1901bc655ce6d514
parent37513490442322e82961bf6d06c1c86d55cb3830 (diff)
Directly allocate FrozenCore as an ICLASS
It's a bad idea to overwrite the flags as the garbage collector may have set other flags.
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/7940
-rw-r--r--class.c10
-rw-r--r--internal/class.h3
-rw-r--r--vm.c5
3 files changed, 11 insertions, 7 deletions
diff --git a/class.c b/class.c
index 4ffb47c27a..9608e9b41a 100644
--- a/class.c
+++ b/class.c
@@ -1130,9 +1130,15 @@ rb_define_module_id_under(VALUE outer, ID id)
}
VALUE
+rb_iclass_alloc(VALUE klass)
+{
+ return class_alloc(T_ICLASS, klass);
+}
+
+VALUE
rb_include_class_new(VALUE module, VALUE super)
{
- VALUE klass = class_alloc(T_ICLASS, rb_cClass);
+ VALUE klass = rb_iclass_alloc(rb_cClass);
RCLASS_M_TBL(klass) = RCLASS_M_TBL(module);
@@ -1409,7 +1415,7 @@ ensure_origin(VALUE klass)
{
VALUE origin = RCLASS_ORIGIN(klass);
if (origin == klass) {
- origin = class_alloc(T_ICLASS, klass);
+ origin = rb_iclass_alloc(klass);
RCLASS_SET_SUPER(origin, RCLASS_SUPER(klass));
RCLASS_SET_SUPER(klass, origin);
RCLASS_SET_ORIGIN(klass, origin);
diff --git a/internal/class.h b/internal/class.h
index d76da84bd1..146123005e 100644
--- a/internal/class.h
+++ b/internal/class.h
@@ -119,6 +119,7 @@ VALUE rb_module_s_alloc(VALUE klass);
void rb_module_set_initialized(VALUE module);
void rb_module_check_initializable(VALUE module);
VALUE rb_make_metaclass(VALUE, VALUE);
+VALUE rb_iclass_alloc(VALUE klass);
VALUE rb_include_class_new(VALUE, VALUE);
void rb_class_foreach_subclass(VALUE klass, void (*f)(VALUE, VALUE), VALUE);
void rb_class_detach_subclasses(VALUE);
@@ -205,7 +206,7 @@ RCLASS_SET_SUPER(VALUE klass, VALUE super)
static inline void
RCLASS_SET_CLASSPATH(VALUE klass, VALUE classpath, bool permanent)
{
- assert(BUILTIN_TYPE(klass) == T_CLASS || BUILTIN_TYPE(klass) == T_MODULE);
+ assert(BUILTIN_TYPE(klass) == T_CLASS || BUILTIN_TYPE(klass) == T_MODULE || klass == rb_mRubyVMFrozenCore);
assert(classpath == 0 || BUILTIN_TYPE(classpath) == T_STRING);
RB_OBJ_WRITE(klass, &(RCLASS_EXT(klass)->classpath), classpath);
diff --git a/vm.c b/vm.c
index 93e51dd847..39fb7dc821 100644
--- a/vm.c
+++ b/vm.c
@@ -3638,7 +3638,6 @@ Init_VM(void)
{
VALUE opts;
VALUE klass;
- VALUE fcore;
/*
* Document-class: RubyVM
@@ -3664,9 +3663,8 @@ Init_VM(void)
#endif
/* FrozenCore (hidden) */
- fcore = rb_class_new(rb_cBasicObject);
+ VALUE fcore = rb_mRubyVMFrozenCore = rb_iclass_alloc(rb_cBasicObject);
rb_set_class_path(fcore, rb_cRubyVM, "FrozenCore");
- RBASIC(fcore)->flags = T_ICLASS;
klass = rb_singleton_class(fcore);
rb_define_method_id(klass, id_core_set_method_alias, m_core_set_method_alias, 3);
rb_define_method_id(klass, id_core_set_variable_alias, m_core_set_variable_alias, 2);
@@ -3685,7 +3683,6 @@ Init_VM(void)
RBASIC_CLEAR_CLASS(klass);
rb_obj_freeze(klass);
rb_gc_register_mark_object(fcore);
- rb_mRubyVMFrozenCore = fcore;
/*
* Document-class: Thread