summaryrefslogtreecommitdiffhomepage
path: root/src/vm.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2017-04-01 13:18:49 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2017-04-01 13:20:19 +0900
commit1e87dfdf48e3870ed10cd6ad071bc29e6e3dc636 (patch)
tree9b1d55553a109b2d9ddf93872527db45e23f39b8 /src/vm.c
parent8d9d7c929e4987b4332e33c5126b620ba7c0c2b3 (diff)
downloadmruby-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.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/src/vm.c b/src/vm.c
index aa8b171bd..93af6219e 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -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, &regs[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;
}