summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorChristopher Aue <[email protected]>2017-08-23 15:17:20 +0200
committerChristopher Aue <[email protected]>2017-08-23 18:15:44 +0200
commit84d8ecc1d75f0af4703e9d5fca3d740fa66d2ca1 (patch)
treecccf7c2d1c52f7f41dd53e5842ab8e9aaa897136
parent4aca9ef98efc62f16d23ed1fb442e48ddbb7b51f (diff)
downloadmruby-84d8ecc1d75f0af4703e9d5fca3d740fa66d2ca1.tar.gz
mruby-84d8ecc1d75f0af4703e9d5fca3d740fa66d2ca1.zip
Fixed register windows of OP_SENDs generated by NODE_OP_ASGN; ref #3783
-rw-r--r--mrbgems/mruby-compiler/core/codegen.c2
-rw-r--r--test/t/codegen.rb27
2 files changed, 28 insertions, 1 deletions
diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c
index 9d7392c2d..a457705fb 100644
--- a/mrbgems/mruby-compiler/core/codegen.c
+++ b/mrbgems/mruby-compiler/core/codegen.c
@@ -1841,7 +1841,7 @@ codegen(codegen_scope *s, node *tree, int val)
for (i=0; i<nargs; i++) {
genop(s, MKOP_AB(OP_MOVE, cursp()+i+1, base+i+1));
}
- push_n(nargs+1);pop_n(nargs+1);
+ push_n(nargs+2);pop_n(nargs+2); /* space for receiver, arguments and a block */
genop(s, MKOP_ABC(OP_SEND, cursp(), idx, callargs));
push();
}
diff --git a/test/t/codegen.rb b/test/t/codegen.rb
index afec94a69..12c35f2b3 100644
--- a/test/t/codegen.rb
+++ b/test/t/codegen.rb
@@ -130,6 +130,33 @@ assert('register window of calls (#3783)') do
120=>120, 121=>121, 122=>122, 123=>123, 124=>124, 125=>125, 126=>126)
end
+ # NODE_OP_ASGN
+ o = Object.new
+ class << o
+ attr_accessor :a
+ end
+
+ o.a = 1
+ assert_nothing_raised{ o.a += 1 }
+ o.a = 1
+ assert_nothing_raised{ o.a <<= 1 }
+ o.a = 1
+ assert_nothing_raised{ o.a &&= 1 }
+
+ o = { k: 1 }
+ assert_nothing_raised{ o[:k] += 1 }
+ o = { k: 1 }
+ assert_nothing_raised{ o[:k] <<= 1 }
+ o = { k: 1 }
+ assert_nothing_raised{ o[:k] &&= 1 }
+
+ o = { k: 1 }
+ assert_nothing_raised{ o[*[:k]] += 1 }
+ o = { k: 1 }
+ assert_nothing_raised{ o[*[:k]] <<= 1 }
+ o = { k: 1 }
+ assert_nothing_raised{ o[*[:k]] &&= 1 }
+
# NODE_YIELD
def check_node_yield
yield