summaryrefslogtreecommitdiff
path: root/class.c
diff options
context:
space:
mode:
authortenderlove <tenderlove@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2019-04-20 01:19:47 +0000
committertenderlove <tenderlove@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2019-04-20 01:19:47 +0000
commit91793b8967e0531bd1159a8ff0cc7e50739c7620 (patch)
tree87ba81af05456fe8bdeb29227a968a413e480635 /class.c
parente3d547f6df76a48834cfd9893baf4f51567b3afb (diff)
Add `GC.compact` again.
🙏 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67620 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'class.c')
-rw-r--r--class.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/class.c b/class.c
index b76af26..d0ff92b 100644
--- a/class.c
+++ b/class.c
@@ -539,6 +539,7 @@ boot_defclass(const char *name, VALUE super)
rb_name_class(obj, id);
rb_const_set((rb_cObject ? rb_cObject : obj), id, obj);
+ rb_vm_add_root_module(id, obj);
return obj;
}
@@ -730,6 +731,9 @@ rb_define_class_id_under(VALUE outer, ID id, VALUE super)
" (%"PRIsVALUE" is given but was %"PRIsVALUE")",
outer, rb_id2str(id), RCLASS_SUPER(klass), super);
}
+ /* Class may have been defined in Ruby and not pin-rooted */
+ rb_vm_add_root_module(id, klass);
+
return klass;
}
if (!super) {
@@ -740,6 +744,7 @@ rb_define_class_id_under(VALUE outer, ID id, VALUE super)
rb_set_class_path_string(klass, outer, rb_id2str(id));
rb_const_set(outer, id, klass);
rb_class_inherited(super, klass);
+ rb_vm_add_root_module(id, klass);
rb_gc_register_mark_object(klass);
return klass;
@@ -777,10 +782,13 @@ rb_define_module(const char *name)
rb_raise(rb_eTypeError, "%s is not a module (%"PRIsVALUE")",
name, rb_obj_class(module));
}
+ /* Module may have been defined in Ruby and not pin-rooted */
+ rb_vm_add_root_module(id, module);
return module;
}
module = rb_define_module_id(id);
rb_vm_add_root_module(id, module);
+ rb_gc_register_mark_object(module);
rb_const_set(rb_cObject, id, module);
return module;