diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-04-01 13:18:49 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-04-01 13:20:19 +0900 |
| commit | 1e87dfdf48e3870ed10cd6ad071bc29e6e3dc636 (patch) | |
| tree | 9b1d55553a109b2d9ddf93872527db45e23f39b8 /src/vm.c | |
| parent | 8d9d7c929e4987b4332e33c5126b620ba7c0c2b3 (diff) | |
| download | mruby-1e87dfdf48e3870ed10cd6ad071bc29e6e3dc636.tar.gz mruby-1e87dfdf48e3870ed10cd6ad071bc29e6e3dc636.zip | |
The stack may be reallocated in the func call; fix #3560
Diffstat (limited to 'src/vm.c')
| -rw-r--r-- | src/vm.c | 8 |
1 files changed, 6 insertions, 2 deletions
@@ -1449,13 +1449,16 @@ RETRY_TRY_BLOCK: mrb->c->stack[0] = recv; if (MRB_PROC_CFUNC_P(m)) { + mrb_value v; + if (n == CALL_MAXARGS) { ci->nregs = 3; } else { ci->nregs = n + 2; } - mrb->c->stack[0] = m->body.func(mrb, recv); + v = m->body.func(mrb, recv); + mrb->c->stack[0] = v; mrb_gc_arena_restore(mrb, ai); if (mrb->exc) goto L_RAISE; /* pop stackpos */ @@ -1862,7 +1865,8 @@ RETRY_TRY_BLOCK: value_move(mrb->c->stack, ®s[a], ci->argc+1); if (MRB_PROC_CFUNC_P(m)) { - mrb->c->stack[0] = m->body.func(mrb, recv); + mrb_value v = m->body.func(mrb, recv); + mrb->c->stack[0] = v; mrb_gc_arena_restore(mrb, ai); goto L_RETURN; } |
