summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-compiler/core/codegen.c
diff options
context:
space:
mode:
authorChristopher Aue <[email protected]>2017-08-22 14:42:59 +0200
committerChristopher Aue <[email protected]>2017-08-23 18:12:35 +0200
commitc6596cf26a125e9759e01425bea8782ff58dbf4f (patch)
treee544d7531c3b7612b6a5ccdc3d7aada5983faa49 /mrbgems/mruby-compiler/core/codegen.c
parent64e5208404d37326c071506d861b8bd9776218df (diff)
downloadmruby-c6596cf26a125e9759e01425bea8782ff58dbf4f.tar.gz
mruby-c6596cf26a125e9759e01425bea8782ff58dbf4f.zip
Fixed register windows of OP_SENDs generated by NODE_{SCALL,CASE,YIELD,UNDEF}; ref #3783
Diffstat (limited to 'mrbgems/mruby-compiler/core/codegen.c')
-rw-r--r--mrbgems/mruby-compiler/core/codegen.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c
index c63533fef..167ceb3cb 100644
--- a/mrbgems/mruby-compiler/core/codegen.c
+++ b/mrbgems/mruby-compiler/core/codegen.c
@@ -870,7 +870,7 @@ gen_call(codegen_scope *s, node *tree, mrb_sym name, int sp, int val, int safe)
genop(s, MKOP_A(OP_LOADNIL, cursp()));
push();
genop(s, MKOP_AB(OP_MOVE, cursp(), recv));
- push(); pop(); /* space for a block */
+ push_n(2); pop_n(2); /* space for one arg and a block */
pop();
idx = new_msym(s, mrb_intern_lit(s->mrb, "=="));
genop(s, MKOP_ABC(OP_EQ, cursp(), idx, 1));
@@ -1542,6 +1542,7 @@ codegen(codegen_scope *s, node *tree, int val)
codegen(s, n->car, VAL);
if (head) {
genop(s, MKOP_AB(OP_MOVE, cursp(), head));
+ push_n(2); pop_n(2); /* space for one arg and a block */
pop();
if (nint(n->car->car) == NODE_SPLAT) {
genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "__case_eqq")), 1));
@@ -2049,6 +2050,7 @@ codegen(codegen_scope *s, node *tree, int val)
push();
}
}
+ push();pop(); /* space for a block */
pop_n(n+1);
genop(s, MKOP_ABx(OP_BLKPUSH, cursp(), (ainfo<<4)|(lv & 0xf)));
if (sendv) n = CALL_MAXARGS;
@@ -2644,6 +2646,7 @@ codegen(codegen_scope *s, node *tree, int val)
t = t->cdr;
num++;
}
+ push();pop(); /* space for a block */
pop();
if (num < CALL_MAXARGS) {
pop_n(num);