diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-04-25 22:31:02 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-04-25 22:31:02 +0900 |
| commit | cef523cc19d7e8c0471942bf5fac75fc63faf54a (patch) | |
| tree | 48dbb803d92c69778c336aecef93c8186891053b | |
| parent | a3d80e8e733deddddd7ed36ec07e8f29a7b928c2 (diff) | |
| download | mruby-cef523cc19d7e8c0471942bf5fac75fc63faf54a.tar.gz mruby-cef523cc19d7e8c0471942bf5fac75fc63faf54a.zip | |
Avoid duplicated `envadjust()` of env stacks; fix #3637
| -rw-r--r-- | src/vm.c | 11 |
1 files changed, 7 insertions, 4 deletions
@@ -115,14 +115,17 @@ stack_init(mrb_state *mrb) } static inline void -envadjust(mrb_state *mrb, mrb_value *oldbase, mrb_value *newbase) +envadjust(mrb_state *mrb, mrb_value *oldbase, mrb_value *newbase, size_t size) { mrb_callinfo *ci = mrb->c->cibase; if (newbase == oldbase) return; while (ci <= mrb->c->ci) { struct REnv *e = ci->env; - if (e && MRB_ENV_STACK_SHARED_P(e)) { + mrb_value *st; + + 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; @@ -164,7 +167,7 @@ stack_extend_alloc(mrb_state *mrb, int room) mrb_exc_raise(mrb, mrb_obj_value(mrb->stack_err)); } stack_clear(&(newstack[oldsize]), size - oldsize); - envadjust(mrb, oldbase, newstack); + envadjust(mrb, oldbase, newstack, size); mrb->c->stbase = newstack; mrb->c->stack = mrb->c->stbase + off; mrb->c->stend = mrb->c->stbase + size; @@ -297,7 +300,7 @@ ecall(mrb_state *mrb, int i) mrb_callinfo *ci = mrb->c->ci; mrb_value *self = mrb->c->stack; struct RObject *exc; - int cioff; + ptrdiff_t cioff; if (i<0) return; if (ci - mrb->c->cibase > MRB_FUNCALL_DEPTH_MAX) { |
