Skip to content

Commit f404cf1

Browse files
committed
WIP
1 parent 77ae876 commit f404cf1

1 file changed

Lines changed: 25 additions & 19 deletions

File tree

variable.c

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1234,17 +1234,35 @@ rb_obj_fields_no_ractor_check(VALUE obj)
12341234
}
12351235

12361236
void
1237-
rb_obj_set_fields(VALUE obj, VALUE fields_obj, ID field_name, VALUE original_fields_obj)
1237+
rb_free_generic_ivar(VALUE obj)
12381238
{
1239-
RUBY_ASSERT(IMEMO_TYPE_P(fields_obj, imemo_fields));
1239+
if (rb_obj_exivar_p(obj)) {
1240+
st_data_t key = (st_data_t)obj, value;
12401241

1241-
if (fields_obj != original_fields_obj) {
12421242
RB_VM_LOCKING() {
1243-
st_table *tbl = generic_fields_tbl(obj, field_name, false);
1244-
st_insert(tbl, (st_data_t)obj, (st_data_t)fields_obj);
1243+
st_delete(generic_fields_tbl_no_ractor_check(obj), &key, &value);
12451244
}
1245+
}
1246+
}
1247+
1248+
void
1249+
rb_obj_set_fields(VALUE obj, VALUE fields_obj, ID field_name, VALUE original_fields_obj)
1250+
{
1251+
RUBY_ASSERT(!fields_obj || IMEMO_TYPE_P(fields_obj, imemo_fields));
1252+
RUBY_ASSERT(!original_fields_obj || IMEMO_TYPE_P(original_fields_obj, imemo_fields));
1253+
1254+
if (fields_obj != original_fields_obj) {
1255+
if (fields_obj) {
1256+
RB_VM_LOCKING() {
1257+
st_table *tbl = generic_fields_tbl(obj, field_name, false);
1258+
st_insert(tbl, (st_data_t)obj, (st_data_t)fields_obj);
1259+
}
12461260

1247-
RB_OBJ_WRITTEN(obj, original_fields_obj, fields_obj);
1261+
RB_OBJ_WRITTEN(obj, original_fields_obj, fields_obj);
1262+
}
1263+
else {
1264+
rb_free_generic_ivar(obj);
1265+
}
12481266

12491267
if (original_fields_obj) {
12501268
// Clear root shape to avoid triggering cleanup such as free_object_id.
@@ -1257,23 +1275,11 @@ void
12571275
rb_obj_replace_fields(VALUE obj, VALUE fields_obj, ID field_name)
12581276
{
12591277
RB_VM_LOCKING() {
1260-
VALUE original_fields_obj = rb_obj_fields(fields_obj, field_name);
1278+
VALUE original_fields_obj = rb_obj_fields(obj, field_name);
12611279
rb_obj_set_fields(obj, fields_obj, field_name, original_fields_obj);
12621280
}
12631281
}
12641282

1265-
void
1266-
rb_free_generic_ivar(VALUE obj)
1267-
{
1268-
if (rb_obj_exivar_p(obj)) {
1269-
st_data_t key = (st_data_t)obj, value;
1270-
1271-
RB_VM_LOCKING() {
1272-
st_delete(generic_fields_tbl_no_ractor_check(obj), &key, &value);
1273-
}
1274-
}
1275-
}
1276-
12771283
VALUE
12781284
rb_obj_field_get(VALUE obj, shape_id_t target_shape_id)
12791285
{

0 commit comments

Comments
 (0)