Commit 7f630d41 authored by Yukihiro "Matz" Matsumoto's avatar Yukihiro "Matz" Matsumoto

Merge pull request #2684 from kou/fix-splat-and-multiple-assignments

Fix splat and multiple assignments
parents e6184388 5ec676aa
...@@ -1001,7 +1001,9 @@ gen_vmassignment(codegen_scope *s, node *tree, int rhs, int val) ...@@ -1001,7 +1001,9 @@ gen_vmassignment(codegen_scope *s, node *tree, int rhs, int val)
} }
if (val) { if (val) {
genop(s, MKOP_AB(OP_MOVE, cursp(), rhs)); genop(s, MKOP_AB(OP_MOVE, cursp(), rhs));
push(); }
else {
pop();
} }
genop(s, MKOP_ABC(OP_APOST, cursp(), n, post)); genop(s, MKOP_ABC(OP_APOST, cursp(), n, post));
n = 1; n = 1;
...@@ -1016,6 +1018,7 @@ gen_vmassignment(codegen_scope *s, node *tree, int rhs, int val) ...@@ -1016,6 +1018,7 @@ gen_vmassignment(codegen_scope *s, node *tree, int rhs, int val)
n++; n++;
} }
} }
push();
} }
} }
......
...@@ -181,6 +181,38 @@ assert('Splat and multiple assignment') do ...@@ -181,6 +181,38 @@ assert('Splat and multiple assignment') do
assert_equal [1,nil,2], [a,b,c] assert_equal [1,nil,2], [a,b,c]
end end
assert('Splat and multiple assignment from variable') do
a = [1, 2, 3]
b, *c = a
assert_equal 1, b
assert_equal [2, 3], c
end
assert('Splat and multiple assignment from variables') do
a = [1, 2, 3]
b = [4, 5, 6, 7]
c, d, *e, f, g = *a, *b
assert_equal 1, c
assert_equal 2, d
assert_equal [3, 4, 5], e
assert_equal 6, f
assert_equal 7, g
end
assert('Splat and multiple assignment in for') do
a = [1, 2, 3, 4, 5, 6, 7]
for b, c, *d, e, f in [a] do
end
assert_equal 1, b
assert_equal 2, c
assert_equal [3, 4, 5], d
assert_equal 6, e
assert_equal 7, f
end
assert('Return values of case statements') do assert('Return values of case statements') do
a = [] << case 1 a = [] << case 1
when 3 then 2 when 3 then 2
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment