Skip to content

Commit bd203b5

Browse files
committed
Mark class fields objects as internal
1 parent 1295058 commit bd203b5

3 files changed

Lines changed: 15 additions & 3 deletions

File tree

gc.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1486,6 +1486,8 @@ internal_object_p(VALUE obj)
14861486
return rb_singleton_class_internal_p(obj);
14871487
}
14881488
return 0;
1489+
case T_OBJECT:
1490+
if (FL_TEST_RAW(obj, ROBJECT_HIDDEN)) break;
14891491
default:
14901492
if (!RBASIC(obj)->klass) break;
14911493
return 0;

include/ruby/internal/core/robject.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,9 @@ enum ruby_robject_flags {
7171
* 3rd parties must not be aware that there even is more than one way to
7272
* store instance variables. Might better be hidden.
7373
*/
74-
ROBJECT_EMBED = RUBY_FL_USER1
74+
ROBJECT_EMBED = RUBY_FL_USER1,
75+
76+
ROBJECT_HIDDEN = RUBY_FL_USER2, // HACK
7577
};
7678

7779
struct st_table;

internal/class.h

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -540,13 +540,21 @@ RCLASS_FIELDS_OBJ(VALUE obj)
540540
return RCLASSEXT_FIELDS_OBJ(RCLASS_EXT_READABLE(obj));
541541
}
542542

543+
static inline VALUE
544+
rb_allocate_fields_obj(VALUE klass)
545+
{
546+
VALUE fields_obj = rb_class_allocate_instance(rb_singleton_class(klass));
547+
FL_SET_RAW(fields_obj, ROBJECT_HIDDEN); // HACK
548+
return fields_obj;
549+
}
550+
543551
static inline VALUE
544552
RCLASS_ENSURE_FIELDS_OBJ(VALUE obj)
545553
{
546554
RUBY_ASSERT(RB_TYPE_P(obj, RUBY_T_CLASS) || RB_TYPE_P(obj, RUBY_T_MODULE));
547555
rb_classext_t *ext = RCLASS_EXT_READABLE(obj);
548556
if (!ext->fields_obj) {
549-
RB_OBJ_WRITE(obj, &ext->fields_obj, rb_class_allocate_instance(rb_singleton_class(obj)));
557+
RB_OBJ_WRITE(obj, &ext->fields_obj, rb_allocate_fields_obj(obj));
550558
}
551559
return ext->fields_obj;
552560
}
@@ -582,7 +590,7 @@ RCLASSEXT_SET_FIELDS_HASH(VALUE obj, rb_classext_t *ext, const st_table *tbl)
582590

583591
if (!ext->fields_obj) {
584592
// FIXME: We can trigger GC here and `*tbl` may not be marked
585-
RB_OBJ_WRITE(obj, &ext->fields_obj, rb_class_allocate_instance(rb_singleton_class(obj)));
593+
RB_OBJ_WRITE(obj, &ext->fields_obj, rb_allocate_fields_obj(obj));
586594
}
587595
ROBJECT_SET_FIELDS_HASH(ext->fields_obj, tbl);
588596
}

0 commit comments

Comments
 (0)