diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2021-07-19 07:40:22 +0900 |
|---|---|---|
| committer | GitHub <[email protected]> | 2021-07-19 07:40:22 +0900 |
| commit | ed2a6a160eb546852adfe3661bb4face9d07820b (patch) | |
| tree | a920c66e900a25d1aed2ef8334e29e21cd0349ba | |
| parent | 71c778dbfcff017b64f36a777fe19ca37fa0b83d (diff) | |
| parent | de4523f793bb81bb52a80f55222b28e00c86b96c (diff) | |
| download | mruby-ed2a6a160eb546852adfe3661bb4face9d07820b.tar.gz mruby-ed2a6a160eb546852adfe3661bb4face9d07820b.zip | |
Merge pull request #5511 from dearblue/binding.3
Explicit write barrier for binding
| -rw-r--r-- | mrbgems/mruby-binding-core/src/binding-core.c | 3 | ||||
| -rw-r--r-- | src/proc.c | 5 |
2 files changed, 8 insertions, 0 deletions
diff --git a/mrbgems/mruby-binding-core/src/binding-core.c b/mrbgems/mruby-binding-core/src/binding-core.c index 7b70cfb78..5e104e720 100644 --- a/mrbgems/mruby-binding-core/src/binding-core.c +++ b/mrbgems/mruby-binding-core/src/binding-core.c @@ -151,6 +151,9 @@ binding_local_variable_set(mrb_state *mrb, mrb_value self) mrb_value *e = binding_local_variable_search(mrb, proc, env, varname); if (e) { *e = obj; + if (!mrb_immediate_p(obj)) { + mrb_field_write_barrier(mrb, (struct RBasic*)env, (struct RBasic*)mrb_obj_ptr(obj)); + } } else { mrb_proc_merge_lvar(mrb, (mrb_irep*)proc->body.irep, env, 1, &varname, &obj); diff --git a/src/proc.c b/src/proc.c index 1d5a4aa76..6b3e19a6b 100644 --- a/src/proc.c +++ b/src/proc.c @@ -419,6 +419,11 @@ mrb_proc_merge_lvar(mrb_state *mrb, mrb_irep *irep, struct REnv *env, int num, c memmove(destlv, lv, sizeof(mrb_sym) * num); if (stack) { memmove(destst, stack, sizeof(mrb_value) * num); + for (int i = 0; i < num; i++) { + if (!mrb_immediate_p(stack[i])) { + mrb_field_write_barrier(mrb, (struct RBasic*)env, (struct RBasic*)mrb_obj_ptr(stack[i])); + } + } } else { for (int i = num; i > 0; i--, destst++) { |
