diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2020-07-22 14:21:05 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2020-07-22 15:01:53 +0900 |
| commit | 5533c2983373a9fca5a97074ebe9258841ce4d00 (patch) | |
| tree | e899a38e6482a78e4a456e0643d6aa907ea430be /src | |
| parent | 0bb4d10ca7dacaeb5873cfd2e61423e8a4222350 (diff) | |
| download | mruby-5533c2983373a9fca5a97074ebe9258841ce4d00.tar.gz mruby-5533c2983373a9fca5a97074ebe9258841ce4d00.zip | |
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.
Diffstat (limited to 'src')
| -rw-r--r-- | src/array.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/src/array.c b/src/array.c index dae2fbf34..eb94fc6c7 100644 --- a/src/array.c +++ b/src/array.c @@ -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; } |
