Use mrb_field_write_barrier instead of mrb_write_barrier for push.

When the array is very big, the simpler `mrb_write_barrier` causes
calling `gc_mark_children` for big arrays repeatedly. That would hinder
performance very badly.
This commit is contained in:
Yukihiro "Matz" Matsumoto
2020-07-22 14:21:05 +09:00
parent 0bb4d10ca7
commit 5533c29833
+4 -2
View File
@@ -522,8 +522,10 @@ mrb_ary_push_m(mrb_state *mrb, mrb_value self)
}
array_copy(ARY_PTR(a)+len, argv, alen);
ARY_SET_LEN(a, len2);
mrb_write_barrier(mrb, (struct RBasic*)a);
while (alen--) {
mrb_field_write_barrier_value(mrb, (struct RBasic*)a, *argv);
argv++;
}
return self;
}