diff options
| author | Takeshi Watanabe <[email protected]> | 2018-04-04 15:14:46 +0900 |
|---|---|---|
| committer | Takeshi Watanabe <[email protected]> | 2018-04-05 11:53:30 +0900 |
| commit | 26e436e24797f0c3228bc9900615afe7d2e29ddf (patch) | |
| tree | 6902da5a975e21a747fc9084eb5b8eff3e8c8137 /src/vm.c | |
| parent | 951ebbafdce2828a4ac539fe2e2342fbb378e999 (diff) | |
| download | mruby-26e436e24797f0c3228bc9900615afe7d2e29ddf.tar.gz mruby-26e436e24797f0c3228bc9900615afe7d2e29ddf.zip | |
Adjust environment when `mrb_exec_irep` happened.
Diffstat (limited to 'src/vm.c')
| -rw-r--r-- | src/vm.c | 12 |
1 files changed, 12 insertions, 0 deletions
@@ -156,6 +156,18 @@ envadjust(mrb_state *mrb, mrb_value *oldbase, mrb_value *newbase, size_t size) e->stack = newbase + off; } + + if (ci->proc && MRB_PROC_ENV_P(ci->proc) && ci->env != MRB_PROC_ENV(ci->proc)) { + e = MRB_PROC_ENV(ci->proc); + + if (e && MRB_ENV_STACK_SHARED_P(e) && + (st = e->stack) && oldbase <= st && st < oldbase+size) { + ptrdiff_t off = e->stack - oldbase; + + e->stack = newbase + off; + } + } + ci->stackent = newbase + (ci->stackent - oldbase); ci++; } |
