diff options
| author | Christopher Aue <[email protected]> | 2017-08-22 14:42:59 +0200 |
|---|---|---|
| committer | Christopher Aue <[email protected]> | 2017-08-23 18:12:35 +0200 |
| commit | c6596cf26a125e9759e01425bea8782ff58dbf4f (patch) | |
| tree | e544d7531c3b7612b6a5ccdc3d7aada5983faa49 /mrbgems/mruby-compiler/core/codegen.c | |
| parent | 64e5208404d37326c071506d861b8bd9776218df (diff) | |
| download | mruby-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.c | 5 |
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); |
