diff options
author | John Hawthorn <[email protected]> | 2025-05-24 22:49:54 -0700 |
---|---|---|
committer | John Hawthorn <[email protected]> | 2025-05-28 11:10:09 -0400 |
commit | 3935b1c401d00f52b9ee0ce0b58767cc32e280fc (patch) | |
tree | 3d2dcd7add4f227170e58901ae7c924e4fed3a85 /class.c | |
parent | 749bda96e59240f43f8938545990da505807eb36 (diff) |
Make class_alloc only accept type
If any other flags were passed other than type they were ignored, so we
might as well be more explicit that that's all this accepts. This also
fixes the incorrect (internal) documentation.
It also turns out type is always known in the caller, so I made it
explicit in the two places additional flags were being passed.
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/13446
Diffstat (limited to 'class.c')
-rw-r--r-- | class.c | 23 |
1 files changed, 12 insertions, 11 deletions
@@ -634,19 +634,17 @@ class_switch_superclass(VALUE super, VALUE klass) } /** - * Allocates a struct RClass for a new class. + * Allocates a struct RClass for a new class, iclass, or module. * - * @param flags initial value for basic.flags of the returned class. - * @param klass the class of the returned class. - * @return an uninitialized Class object. - * @pre `klass` must refer `Class` class or an ancestor of Class. - * @pre `(flags | T_CLASS) != 0` - * @post the returned class can safely be `#initialize` 'd. + * @param type The type of the RClass (T_CLASS, T_ICLASS, or T_MODULE) + * @param klass value for basic.klass of the returned object. + * @return an uninitialized Class/IClass/Module object. + * @pre `klass` must refer to a class or module * * @note this function is not Class#allocate. */ static VALUE -class_alloc(VALUE flags, VALUE klass) +class_alloc(enum ruby_value_type type, VALUE klass) { rb_ns_subclasses_t *ns_subclasses; rb_subclass_anchor_t *anchor; @@ -666,7 +664,9 @@ class_alloc(VALUE flags, VALUE klass) anchor->ns_subclasses = ns_subclasses; anchor->head = ZALLOC(rb_subclass_entry_t); - flags &= T_MASK; + RUBY_ASSERT(type == T_CLASS || type == T_ICLASS || type == T_MODULE); + + VALUE flags = type; if (RGENGC_WB_PROTECTED_CLASS) flags |= FL_WB_PROTECTED; NEWOBJ_OF(obj, struct RClass, klass, flags, alloc_size, 0); @@ -1064,7 +1064,7 @@ rb_mod_init_copy(VALUE clone, VALUE orig) if (BUILTIN_TYPE(p) != T_ICLASS) { rb_bug("non iclass between module/class and origin"); } - clone_p = class_alloc(RBASIC(p)->flags, METACLASS_OF(p)); + clone_p = class_alloc(T_ICLASS, METACLASS_OF(p)); /* We should set the m_tbl right after allocation before anything * that can trigger GC to avoid clone_p from becoming old and * needing to fire write barriers. */ @@ -1141,7 +1141,8 @@ rb_singleton_class_clone_and_attach(VALUE obj, VALUE attach) else { /* copy singleton(unnamed) class */ bool klass_of_clone_is_new; - VALUE clone = class_alloc(RBASIC(klass)->flags, 0); + RUBY_ASSERT(RB_TYPE_P(klass, T_CLASS)); + VALUE clone = class_alloc(T_CLASS, 0); if (BUILTIN_TYPE(obj) == T_CLASS) { klass_of_clone_is_new = true; |