Skip to content

Commit b4a6935

Browse files
byrootpeterzhu2118
authored andcommitted
Move FL_SINGLETON to FL_USER1
This frees FL_USER0 on both T_MODULE and T_CLASS. Note: prior to this, FL_SINGLETON was never set on T_MODULE, so checking for `FL_SINGLETON` without first checking that `FL_TYPE` was `T_CLASS` was valid. That's no longer the case.
1 parent b889731 commit b4a6935

File tree

23 files changed

+76
-56
lines changed

23 files changed

+76
-56
lines changed

class.c

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232

3333
/* Flags of T_CLASS
3434
*
35-
* 0: RUBY_FL_SINGLETON
35+
* 1: RUBY_FL_SINGLETON
3636
* This class is a singleton class.
3737
* 2: RCLASS_SUPERCLASSES_INCLUDE_SELF
3838
* The RCLASS_SUPERCLASSES contains the class as the last element.
@@ -340,7 +340,7 @@ rb_check_inheritable(VALUE super)
340340
rb_raise(rb_eTypeError, "superclass must be an instance of Class (given an instance of %"PRIsVALUE")",
341341
rb_obj_class(super));
342342
}
343-
if (RBASIC(super)->flags & FL_SINGLETON) {
343+
if (RCLASS_SINGLETON_P(super)) {
344344
rb_raise(rb_eTypeError, "can't make subclass of singleton class");
345345
}
346346
if (super == rb_cClass) {
@@ -426,7 +426,7 @@ class_init_copy_check(VALUE clone, VALUE orig)
426426
if (RCLASS_SUPER(clone) != 0 || clone == rb_cBasicObject) {
427427
rb_raise(rb_eTypeError, "already initialized class");
428428
}
429-
if (FL_TEST(orig, FL_SINGLETON)) {
429+
if (RCLASS_SINGLETON_P(orig)) {
430430
rb_raise(rb_eTypeError, "can't copy singleton class");
431431
}
432432
}
@@ -544,7 +544,7 @@ rb_mod_init_copy(VALUE clone, VALUE orig)
544544
RCLASS_EXT(clone)->cloned = true;
545545
RCLASS_EXT(orig)->cloned = true;
546546

547-
if (!FL_TEST(CLASS_OF(clone), FL_SINGLETON)) {
547+
if (!RCLASS_SINGLETON_P(CLASS_OF(clone))) {
548548
RBASIC_SET_CLASS(clone, rb_singleton_class_clone(orig));
549549
rb_singleton_class_attached(METACLASS_OF(clone), (VALUE)clone);
550550
}
@@ -650,7 +650,7 @@ rb_singleton_class_clone_and_attach(VALUE obj, VALUE attach)
650650
// attached to an object other than `obj`. In which case `obj` does not have
651651
// a material singleton class attached yet and there is no singleton class
652652
// to clone.
653-
if (!(FL_TEST(klass, FL_SINGLETON) && RCLASS_ATTACHED_OBJECT(klass) == obj)) {
653+
if (!(RCLASS_SINGLETON_P(klass) && RCLASS_ATTACHED_OBJECT(klass) == obj)) {
654654
// nothing to clone
655655
return klass;
656656
}
@@ -701,7 +701,7 @@ rb_singleton_class_clone_and_attach(VALUE obj, VALUE attach)
701701
void
702702
rb_singleton_class_attached(VALUE klass, VALUE obj)
703703
{
704-
if (FL_TEST(klass, FL_SINGLETON)) {
704+
if (RCLASS_SINGLETON_P(klass)) {
705705
RCLASS_SET_ATTACHED_OBJECT(klass, obj);
706706
}
707707
}
@@ -1607,7 +1607,7 @@ class_descendants_recursive(VALUE klass, VALUE v)
16071607
{
16081608
struct subclass_traverse_data *data = (struct subclass_traverse_data *) v;
16091609

1610-
if (BUILTIN_TYPE(klass) == T_CLASS && !FL_TEST(klass, FL_SINGLETON)) {
1610+
if (BUILTIN_TYPE(klass) == T_CLASS && !RCLASS_SINGLETON_P(klass)) {
16111611
if (data->buffer && data->count < data->maxcount && !rb_objspace_garbage_object_p(klass)) {
16121612
// assumes that this does not cause GC as long as the length does not exceed the capacity
16131613
rb_ary_push(data->buffer, klass);
@@ -1712,7 +1712,7 @@ rb_class_subclasses(VALUE klass)
17121712
VALUE
17131713
rb_class_attached_object(VALUE klass)
17141714
{
1715-
if (!FL_TEST(klass, FL_SINGLETON)) {
1715+
if (!RCLASS_SINGLETON_P(klass)) {
17161716
rb_raise(rb_eTypeError, "'%"PRIsVALUE"' is not a singleton class", klass);
17171717
}
17181718

@@ -1815,7 +1815,7 @@ static bool
18151815
particular_class_p(VALUE mod)
18161816
{
18171817
if (!mod) return false;
1818-
if (FL_TEST(mod, FL_SINGLETON)) return true;
1818+
if (RCLASS_SINGLETON_P(mod)) return true;
18191819
if (BUILTIN_TYPE(mod) == T_ICLASS) return true;
18201820
return false;
18211821
}
@@ -2092,19 +2092,19 @@ rb_obj_singleton_methods(int argc, const VALUE *argv, VALUE obj)
20922092
int recur = TRUE;
20932093

20942094
if (rb_check_arity(argc, 0, 1)) recur = RTEST(argv[0]);
2095-
if (RB_TYPE_P(obj, T_CLASS) && FL_TEST(obj, FL_SINGLETON)) {
2095+
if (RCLASS_SINGLETON_P(obj)) {
20962096
rb_singleton_class(obj);
20972097
}
20982098
klass = CLASS_OF(obj);
20992099
origin = RCLASS_ORIGIN(klass);
21002100
me_arg.list = st_init_numtable();
21012101
me_arg.recur = recur;
2102-
if (klass && FL_TEST(klass, FL_SINGLETON)) {
2102+
if (klass && RCLASS_SINGLETON_P(klass)) {
21032103
if ((mtbl = RCLASS_M_TBL(origin)) != 0) rb_id_table_foreach(mtbl, method_entry_i, &me_arg);
21042104
klass = RCLASS_SUPER(klass);
21052105
}
21062106
if (recur) {
2107-
while (klass && (FL_TEST(klass, FL_SINGLETON) || RB_TYPE_P(klass, T_ICLASS))) {
2107+
while (klass && (RCLASS_SINGLETON_P(klass) || RB_TYPE_P(klass, T_ICLASS))) {
21082108
if (klass != origin && (mtbl = RCLASS_M_TBL(klass)) != 0) rb_id_table_foreach(mtbl, method_entry_i, &me_arg);
21092109
klass = RCLASS_SUPER(klass);
21102110
}
@@ -2244,7 +2244,7 @@ singleton_class_of(VALUE obj)
22442244
}
22452245

22462246
klass = METACLASS_OF(obj);
2247-
if (!(FL_TEST(klass, FL_SINGLETON) &&
2247+
if (!(RCLASS_SINGLETON_P(klass) &&
22482248
RCLASS_ATTACHED_OBJECT(klass) == obj)) {
22492249
klass = rb_make_metaclass(obj, klass);
22502250
}
@@ -2258,7 +2258,7 @@ void
22582258
rb_freeze_singleton_class(VALUE x)
22592259
{
22602260
/* should not propagate to meta-meta-class, and so on */
2261-
if (!(RBASIC(x)->flags & FL_SINGLETON)) {
2261+
if (!RCLASS_SINGLETON_P(x)) {
22622262
VALUE klass = RBASIC_CLASS(x);
22632263
if (klass && // no class when hidden from ObjectSpace
22642264
FL_TEST(klass, (FL_SINGLETON|FL_FREEZE)) == FL_SINGLETON) {
@@ -2283,7 +2283,7 @@ rb_singleton_class_get(VALUE obj)
22832283
return rb_special_singleton_class(obj);
22842284
}
22852285
klass = METACLASS_OF(obj);
2286-
if (!FL_TEST(klass, FL_SINGLETON)) return Qnil;
2286+
if (!RCLASS_SINGLETON_P(klass)) return Qnil;
22872287
if (RCLASS_ATTACHED_OBJECT(klass) != obj) return Qnil;
22882288
return klass;
22892289
}

common.mk

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6537,6 +6537,7 @@ error.$(OBJEXT): {$(VPATH)}backward/2/stdarg.h
65376537
error.$(OBJEXT): {$(VPATH)}builtin.h
65386538
error.$(OBJEXT): {$(VPATH)}config.h
65396539
error.$(OBJEXT): {$(VPATH)}constant.h
6540+
error.$(OBJEXT): {$(VPATH)}debug_counter.h
65406541
error.$(OBJEXT): {$(VPATH)}defines.h
65416542
error.$(OBJEXT): {$(VPATH)}encoding.h
65426543
error.$(OBJEXT): {$(VPATH)}error.c
@@ -6709,7 +6710,9 @@ error.$(OBJEXT): {$(VPATH)}thread_$(THREAD_MODEL).h
67096710
error.$(OBJEXT): {$(VPATH)}thread_native.h
67106711
error.$(OBJEXT): {$(VPATH)}util.h
67116712
error.$(OBJEXT): {$(VPATH)}vm_core.h
6713+
error.$(OBJEXT): {$(VPATH)}vm_debug.h
67126714
error.$(OBJEXT): {$(VPATH)}vm_opts.h
6715+
error.$(OBJEXT): {$(VPATH)}vm_sync.h
67136716
error.$(OBJEXT): {$(VPATH)}warning.rbinc
67146717
error.$(OBJEXT): {$(VPATH)}yjit.h
67156718
eval.$(OBJEXT): $(CCAN_DIR)/check_type/check_type.h
@@ -8353,6 +8356,7 @@ io.$(OBJEXT): {$(VPATH)}backward/2/stdarg.h
83538356
io.$(OBJEXT): {$(VPATH)}builtin.h
83548357
io.$(OBJEXT): {$(VPATH)}config.h
83558358
io.$(OBJEXT): {$(VPATH)}constant.h
8359+
io.$(OBJEXT): {$(VPATH)}debug_counter.h
83568360
io.$(OBJEXT): {$(VPATH)}defines.h
83578361
io.$(OBJEXT): {$(VPATH)}dln.h
83588362
io.$(OBJEXT): {$(VPATH)}encindex.h
@@ -8531,7 +8535,9 @@ io.$(OBJEXT): {$(VPATH)}thread_$(THREAD_MODEL).h
85318535
io.$(OBJEXT): {$(VPATH)}thread_native.h
85328536
io.$(OBJEXT): {$(VPATH)}util.h
85338537
io.$(OBJEXT): {$(VPATH)}vm_core.h
8538+
io.$(OBJEXT): {$(VPATH)}vm_debug.h
85348539
io.$(OBJEXT): {$(VPATH)}vm_opts.h
8540+
io.$(OBJEXT): {$(VPATH)}vm_sync.h
85358541
io_buffer.$(OBJEXT): $(CCAN_DIR)/check_type/check_type.h
85368542
io_buffer.$(OBJEXT): $(CCAN_DIR)/container_of/container_of.h
85378543
io_buffer.$(OBJEXT): $(CCAN_DIR)/list/list.h
@@ -10790,6 +10796,7 @@ node_dump.$(OBJEXT): $(top_srcdir)/internal/array.h
1079010796
node_dump.$(OBJEXT): $(top_srcdir)/internal/basic_operators.h
1079110797
node_dump.$(OBJEXT): $(top_srcdir)/internal/bignum.h
1079210798
node_dump.$(OBJEXT): $(top_srcdir)/internal/bits.h
10799+
node_dump.$(OBJEXT): $(top_srcdir)/internal/class.h
1079310800
node_dump.$(OBJEXT): $(top_srcdir)/internal/compilers.h
1079410801
node_dump.$(OBJEXT): $(top_srcdir)/internal/complex.h
1079510802
node_dump.$(OBJEXT): $(top_srcdir)/internal/fixnum.h
@@ -10818,6 +10825,7 @@ node_dump.$(OBJEXT): {$(VPATH)}backward/2/stdalign.h
1081810825
node_dump.$(OBJEXT): {$(VPATH)}backward/2/stdarg.h
1081910826
node_dump.$(OBJEXT): {$(VPATH)}config.h
1082010827
node_dump.$(OBJEXT): {$(VPATH)}constant.h
10828+
node_dump.$(OBJEXT): {$(VPATH)}debug_counter.h
1082110829
node_dump.$(OBJEXT): {$(VPATH)}defines.h
1082210830
node_dump.$(OBJEXT): {$(VPATH)}encoding.h
1082310831
node_dump.$(OBJEXT): {$(VPATH)}id.h
@@ -10987,7 +10995,9 @@ node_dump.$(OBJEXT): {$(VPATH)}subst.h
1098710995
node_dump.$(OBJEXT): {$(VPATH)}thread_$(THREAD_MODEL).h
1098810996
node_dump.$(OBJEXT): {$(VPATH)}thread_native.h
1098910997
node_dump.$(OBJEXT): {$(VPATH)}vm_core.h
10998+
node_dump.$(OBJEXT): {$(VPATH)}vm_debug.h
1099010999
node_dump.$(OBJEXT): {$(VPATH)}vm_opts.h
11000+
node_dump.$(OBJEXT): {$(VPATH)}vm_sync.h
1099111001
numeric.$(OBJEXT): $(CCAN_DIR)/check_type/check_type.h
1099211002
numeric.$(OBJEXT): $(CCAN_DIR)/container_of/container_of.h
1099311003
numeric.$(OBJEXT): $(CCAN_DIR)/list/list.h

error.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
#endif
3333

3434
#include "internal.h"
35+
#include "internal/class.h"
3536
#include "internal/error.h"
3637
#include "internal/eval.h"
3738
#include "internal/hash.h"
@@ -2388,7 +2389,7 @@ name_err_mesg_to_str(VALUE obj)
23882389
VALUE klass;
23892390
object:
23902391
klass = CLASS_OF(obj);
2391-
if (RB_TYPE_P(klass, T_CLASS) && FL_TEST(klass, FL_SINGLETON)) {
2392+
if (RB_TYPE_P(klass, T_CLASS) && RCLASS_SINGLETON_P(klass)) {
23922393
s = FAKE_CSTR(&s_str, "");
23932394
if (obj == rb_vm_top_self()) {
23942395
c = FAKE_CSTR(&c_str, "main");

eval.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -428,7 +428,7 @@ rb_class_modify_check(VALUE klass)
428428
if (OBJ_FROZEN(klass)) {
429429
const char *desc;
430430

431-
if (FL_TEST(klass, FL_SINGLETON)) {
431+
if (RCLASS_SINGLETON_P(klass)) {
432432
desc = "object";
433433
klass = RCLASS_ATTACHED_OBJECT(klass);
434434
if (!SPECIAL_CONST_P(klass)) {

ext/objspace/objspace_dump.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -560,7 +560,7 @@ dump_object(VALUE obj, struct dump_config *dc)
560560
}
561561
}
562562

563-
if (FL_TEST(obj, FL_SINGLETON)) {
563+
if (RCLASS_SINGLETON_P(obj)) {
564564
dump_append(dc, ", \"singleton\":true");
565565
}
566566
}

gc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3763,7 +3763,7 @@ internal_object_p(VALUE obj)
37633763
break;
37643764
case T_CLASS:
37653765
if (!p->as.basic.klass) break;
3766-
if (FL_TEST(obj, FL_SINGLETON)) {
3766+
if (RCLASS_SINGLETON_P(obj)) {
37673767
return rb_singleton_class_internal_p(obj);
37683768
}
37693769
return 0;

include/ruby/internal/fl_type.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -395,7 +395,7 @@ ruby_fl_type {
395395
* 3rd parties. It must be an implementation detail that they should never
396396
* know. Might better be hidden.
397397
*/
398-
RUBY_FL_SINGLETON = RUBY_FL_USER0,
398+
RUBY_FL_SINGLETON = RUBY_FL_USER1,
399399
};
400400

401401
enum {

internal/class.h

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -195,10 +195,16 @@ static inline void RCLASS_SET_INCLUDER(VALUE iclass, VALUE klass);
195195
VALUE rb_class_inherited(VALUE, VALUE);
196196
VALUE rb_keyword_error_new(const char *, VALUE);
197197

198+
static inline bool
199+
RCLASS_SINGLETON_P(VALUE klass)
200+
{
201+
return RB_TYPE_P(klass, T_CLASS) && FL_TEST_RAW(klass, FL_SINGLETON);
202+
}
203+
198204
static inline rb_alloc_func_t
199205
RCLASS_ALLOCATOR(VALUE klass)
200206
{
201-
if (FL_TEST_RAW(klass, FL_SINGLETON)) {
207+
if (RCLASS_SINGLETON_P(klass)) {
202208
return 0;
203209
}
204210
return RCLASS_EXT(klass)->as.class.allocator;
@@ -207,7 +213,7 @@ RCLASS_ALLOCATOR(VALUE klass)
207213
static inline void
208214
RCLASS_SET_ALLOCATOR(VALUE klass, rb_alloc_func_t allocator)
209215
{
210-
assert(!FL_TEST(klass, FL_SINGLETON));
216+
assert(!RCLASS_SINGLETON_P(klass));
211217
RCLASS_EXT(klass)->as.class.allocator = allocator;
212218
}
213219

@@ -267,8 +273,7 @@ RCLASS_SET_CLASSPATH(VALUE klass, VALUE classpath, bool permanent)
267273
static inline VALUE
268274
RCLASS_SET_ATTACHED_OBJECT(VALUE klass, VALUE attached_object)
269275
{
270-
assert(BUILTIN_TYPE(klass) == T_CLASS);
271-
assert(FL_TEST_RAW(klass, FL_SINGLETON));
276+
assert(RCLASS_SINGLETON_P(klass));
272277

273278
RB_OBJ_WRITE(klass, &RCLASS_EXT(klass)->as.singleton_class.attached_object, attached_object);
274279
return attached_object;

io.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@
112112
#include "encindex.h"
113113
#include "id.h"
114114
#include "internal.h"
115+
#include "internal/class.h"
115116
#include "internal/encoding.h"
116117
#include "internal/error.h"
117118
#include "internal/inits.h"
@@ -2276,7 +2277,7 @@ rb_io_writev(VALUE io, int argc, const VALUE *argv)
22762277
if (argc > 1 && rb_obj_method_arity(io, id_write) == 1) {
22772278
if (io != rb_ractor_stderr() && RTEST(ruby_verbose)) {
22782279
VALUE klass = CLASS_OF(io);
2279-
char sep = FL_TEST(klass, FL_SINGLETON) ? (klass = io, '.') : '#';
2280+
char sep = RCLASS_SINGLETON_P(klass) ? (klass = io, '.') : '#';
22802281
rb_category_warning(
22812282
RB_WARN_CATEGORY_DEPRECATED, "%+"PRIsVALUE"%c""write is outdated interface"
22822283
" which accepts just one argument",

lib/ruby_vm/rjit/insn_compiler.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3736,7 +3736,7 @@ def jit_guard_known_klass(jit, ctx, asm, known_klass, obj_opnd, insn_opnd, compt
37363736

37373737
ctx.upgrade_opnd_type(insn_opnd, Type::Flonum)
37383738
end
3739-
elsif C.FL_TEST(known_klass, C::RUBY_FL_SINGLETON) && comptime_obj == C.rb_class_attached_object(known_klass)
3739+
elsif C.RCLASS_SINGLETON_P(known_klass) && comptime_obj == C.rb_class_attached_object(known_klass)
37403740
# Singleton classes are attached to one specific object, so we can
37413741
# avoid one memory access (and potentially the is_heap check) by
37423742
# looking for the expected object directly.

0 commit comments

Comments
 (0)