Skip to content

Commit 9abedae

Browse files
committed
More complex class updates
1 parent ebabe67 commit 9abedae

4 files changed

Lines changed: 41 additions & 11 deletions

File tree

imemo.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ VALUE
133133
rb_imemo_class_fields_new_complex(VALUE klass, st_table *tbl)
134134
{
135135
VALUE fields = rb_imemo_class_fields_new(klass, sizeof(tbl));
136+
FL_SET_RAW(fields, OBJ_FIELD_COMPLEX);
136137
IMEMO_OBJ_FIELDS(fields)->as.complex.table = tbl;
137138
return fields;
138139
}

internal/class.h

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ static inline void RCLASSEXT_SET_INCLUDER(rb_classext_t *ext, VALUE klass, VALUE
217217
// To invalidate CC by inserting&invalidating method entry into tables containing the target cme
218218
// See clear_method_cache_by_id_in_class()
219219
#define RCLASS_PRIME_FIELDS(c) (rb_imemo_class_fields_ptr(RCLASS_EXT_PRIME(c)->fields_obj))
220-
#define RCLASS_PRIME_FIELDS_VALUE(c) (RCLASS_EXT_PRIME(c)->fields_obj)
220+
#define RCLASS_PRIME_FIELDS_OBJ(c) (RCLASS_EXT_PRIME(c)->fields_obj)
221221

222222
static inline void
223223
RCLASS_PRIME_SET_FIELDS_OBJ(VALUE klass, VALUE fields)
@@ -270,8 +270,8 @@ RCLASS_PRIME_SET_FIELDS_OBJ(VALUE klass, VALUE fields)
270270

271271
static inline void RCLASS_SET_SUPER(VALUE klass, VALUE super);
272272
static inline void RCLASS_WRITE_SUPER(VALUE klass, VALUE super);
273-
static inline st_table * RCLASS_FIELDS_HASH(VALUE obj);
274-
static inline st_table * RCLASS_WRITABLE_FIELDS_HASH(VALUE obj);
273+
static inline st_table *RCLASS_FIELDS_HASH(VALUE obj);
274+
static inline st_table *RCLASS_WRITABLE_FIELDS_HASH(VALUE obj);
275275
static inline uint32_t RCLASS_FIELDS_COUNT(VALUE obj);
276276
static inline void RCLASS_SET_FIELDS_HASH(VALUE obj, st_table *table);
277277
static inline void RCLASS_WRITE_FIELDS_HASH(VALUE obj, st_table *table);
@@ -551,15 +551,18 @@ RCLASS_FIELDS_HASH(VALUE obj)
551551
{
552552
RUBY_ASSERT(RB_TYPE_P(obj, RUBY_T_CLASS) || RB_TYPE_P(obj, RUBY_T_MODULE));
553553
RUBY_ASSERT(rb_shape_obj_too_complex_p(obj));
554-
return (st_table *)RCLASSEXT_FIELDS(RCLASS_EXT_READABLE(obj));
554+
VALUE fields_obj = RCLASS_EXT_READABLE(obj)->fields_obj;
555+
return rb_imemo_class_fields_complex_tbl(fields_obj);
555556
}
556557

557558
static inline st_table *
558559
RCLASS_WRITABLE_FIELDS_HASH(VALUE obj)
559560
{
560561
RUBY_ASSERT(RB_TYPE_P(obj, RUBY_T_CLASS) || RB_TYPE_P(obj, RUBY_T_MODULE));
561562
RUBY_ASSERT(rb_shape_obj_too_complex_p(obj));
562-
return (st_table *)RCLASSEXT_FIELDS(RCLASS_EXT_WRITABLE(obj));
563+
564+
VALUE fields_obj = RCLASS_EXT_WRITABLE(obj)->fields_obj;
565+
return rb_imemo_class_fields_complex_tbl(fields_obj);
563566
}
564567

565568
static inline void
@@ -568,8 +571,8 @@ RCLASS_SET_FIELDS_HASH(VALUE obj, st_table *tbl)
568571
RUBY_ASSERT(RB_TYPE_P(obj, RUBY_T_CLASS) || RB_TYPE_P(obj, RUBY_T_MODULE));
569572
RUBY_ASSERT(rb_shape_obj_too_complex_p(obj));
570573

571-
VALUE fields = rb_imemo_class_fields_new(obj, sizeof(tbl));
572-
IMEMO_OBJ_FIELDS(fields)->as.complex.table = tbl;
574+
VALUE fields = rb_imemo_class_fields_new_complex(obj, tbl);
575+
rb_shape_set_shape_id(fields, RBASIC_SHAPE_ID(obj));
573576
RCLASSEXT_SET_FIELDS_OBJ(obj, RCLASS_EXT_PRIME(obj), fields);
574577
}
575578

internal/imemo.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,7 @@ rb_imemo_class_fields_ptr(VALUE obj_fields)
289289
}
290290

291291
RUBY_ASSERT(IMEMO_TYPE_P(obj_fields, imemo_class_fields));
292+
RUBY_ASSERT(!FL_TEST_RAW(obj_fields, OBJ_FIELD_COMPLEX));
292293

293294
if (RB_UNLIKELY(FL_TEST_RAW(obj_fields, OBJ_FIELD_EXTERNAL))) {
294295
return IMEMO_OBJ_FIELDS(obj_fields)->as.external.ptr;
@@ -298,4 +299,17 @@ rb_imemo_class_fields_ptr(VALUE obj_fields)
298299
}
299300
}
300301

302+
static inline st_table *
303+
rb_imemo_class_fields_complex_tbl(VALUE obj_fields)
304+
{
305+
if (!obj_fields) {
306+
return NULL;
307+
}
308+
309+
RUBY_ASSERT(IMEMO_TYPE_P(obj_fields, imemo_class_fields));
310+
RUBY_ASSERT(FL_TEST_RAW(obj_fields, OBJ_FIELD_COMPLEX));
311+
312+
return IMEMO_OBJ_FIELDS(obj_fields)->as.complex.table;
313+
}
314+
301315
#endif /* INTERNAL_IMEMO_H */

variable.c

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1417,7 +1417,7 @@ rb_ivar_lookup(VALUE obj, ID id, VALUE undef)
14171417
bool found = false;
14181418
VALUE val = undef;
14191419

1420-
VALUE fields_obj = RCLASS_PRIME_FIELDS_VALUE(obj); // TODO: figure namespaces
1420+
VALUE fields_obj = RCLASS_PRIME_FIELDS_OBJ(obj); // TODO: figure namespaces
14211421
if (fields_obj) {
14221422
#if !SHAPE_IN_BASIC_FLAGS
14231423
shape_id = get_shape_id_from_flags(fields_obj);
@@ -2043,6 +2043,18 @@ rb_shape_set_shape_id(VALUE obj, shape_id_t shape_id)
20432043

20442044
#if SHAPE_IN_BASIC_FLAGS
20452045
RBASIC_SET_SHAPE_ID(obj, shape_id);
2046+
switch (BUILTIN_TYPE(obj)) {
2047+
case T_CLASS:
2048+
case T_MODULE: {
2049+
VALUE fields_obj = RCLASS_PRIME_FIELDS_OBJ(obj);
2050+
if (fields_obj) {
2051+
RBASIC_SET_SHAPE_ID(fields_obj, shape_id);
2052+
}
2053+
break;
2054+
}
2055+
default:
2056+
break;
2057+
}
20462058
#else
20472059
switch (BUILTIN_TYPE(obj)) {
20482060
case T_OBJECT:
@@ -4769,7 +4781,7 @@ class_atomic_ivar_set(VALUE obj, ID id, VALUE val)
47694781
{
47704782
bool existing = true;
47714783

4772-
VALUE original_fields_obj = RCLASS_PRIME_FIELDS_VALUE(obj); // TODO: figure out namespaces
4784+
VALUE original_fields_obj = RCLASS_PRIME_FIELDS_OBJ(obj); // TODO: figure out namespaces
47734785
VALUE fields_obj = original_fields_obj;
47744786

47754787
if (!fields_obj) {
@@ -4815,7 +4827,7 @@ class_atomic_ivar_set(VALUE obj, ID id, VALUE val)
48154827
}
48164828

48174829
if (fields_obj != original_fields_obj) {
4818-
RUBY_ATOMIC_VALUE_SET(RCLASS_PRIME_FIELDS_VALUE(obj), fields_obj);
4830+
RUBY_ATOMIC_VALUE_SET(RCLASS_PRIME_FIELDS_OBJ(obj), fields_obj);
48194831
}
48204832

48214833
return existing;
@@ -4874,7 +4886,7 @@ rb_fields_tbl_copy(VALUE dst, VALUE src)
48744886
RUBY_ASSERT(RB_TYPE_P(dst, T_CLASS) || RB_TYPE_P(dst, T_MODULE));
48754887

48764888
RUBY_ASSERT(rb_obj_shape(dst)->type == SHAPE_ROOT);
4877-
RUBY_ASSERT(!RCLASS_PRIME_FIELDS_VALUE(dst));
4889+
RUBY_ASSERT(!RCLASS_PRIME_FIELDS_OBJ(dst));
48784890

48794891
rb_ivar_foreach(src, tbl_copy_i, dst);
48804892
}

0 commit comments

Comments
 (0)