summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorChristopher Aue <[email protected]>2017-08-22 15:17:12 +0200
committerChristopher Aue <[email protected]>2017-08-23 18:15:27 +0200
commit1221f7676eda4e656f120a21fd0f354d242df457 (patch)
tree700bc483bd422eaef7913e3f7e2c665e59799202
parentc040c8d92bc940cd6f7b451c9f8968df5d21c945 (diff)
downloadmruby-1221f7676eda4e656f120a21fd0f354d242df457.tar.gz
mruby-1221f7676eda4e656f120a21fd0f354d242df457.zip
Fixed register windows of OP_SENDs generated by NODE_{FOR,SYMBOLS}; ref #3783
-rw-r--r--mrbgems/mruby-compiler/core/codegen.c2
-rw-r--r--test/t/codegen.rb10
2 files changed, 12 insertions, 0 deletions
diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c
index 9586ade52..1e92fbd19 100644
--- a/mrbgems/mruby-compiler/core/codegen.c
+++ b/mrbgems/mruby-compiler/core/codegen.c
@@ -631,6 +631,7 @@ for_body(codegen_scope *s, node *tree)
scope_finish(s);
s = prev;
genop(s, MKOP_Abc(OP_LAMBDA, cursp(), s->irep->rlen-1, OP_L_BLOCK));
+ push();pop(); /* space for a block */
pop();
idx = new_msym(s, mrb_intern_lit(s->mrb, "each"));
genop(s, MKOP_ABC(OP_SENDB, cursp(), idx, 0));
@@ -1095,6 +1096,7 @@ gen_vmassignment(codegen_scope *s, node *tree, int rhs, int val)
static void
gen_send_intern(codegen_scope *s)
{
+ push();pop(); /* space for a block */
pop();
genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "intern")), 0));
push();
diff --git a/test/t/codegen.rb b/test/t/codegen.rb
index 106790507..afec94a69 100644
--- a/test/t/codegen.rb
+++ b/test/t/codegen.rb
@@ -75,6 +75,16 @@ assert('negate literal register alignment') do
end
assert('register window of calls (#3783)') do
+ # NODE_FOR
+ assert_nothing_raised do
+ for i in []; end
+ end
+
+ # NODE_SYMBOLS
+ assert_nothing_raised do
+ %i(sym)
+ end
+
# NODE_SCALL
assert_nothing_raised do
Object.new&.__id__