Skip to content

Commit a2f9dba

Browse files
committed
Fix translating implicit rest in multi-assignment
1 parent 7dc5519 commit a2f9dba

File tree

3 files changed

+42
-2
lines changed

3 files changed

+42
-2
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
subject: "Multi-assignment"
2+
description: "When implicit rest (a, = [])"
3+
notes: >
4+
Implicit rest is just ignored
5+
focused_on_node: "org.truffleruby.core.array.MultipleAssignmentNode"
6+
ruby: |
7+
a, = []
8+
ast: |
9+
MultipleAssignmentNode
10+
attributes:
11+
flags = 1
12+
children:
13+
preNodes = [
14+
WriteFrameSlotNodeGen
15+
attributes:
16+
frameSlot = 2 # a
17+
]
18+
rhsNode =
19+
ArrayLiteralNode$UninitialisedArrayLiteralNode
20+
attributes:
21+
flags = 0
22+
language = org.truffleruby.RubyLanguage@...
23+
splatCastNode =
24+
SplatCastNodeGen
25+
attributes:
26+
conversionMethod = :to_ary
27+
copy = true
28+
flags = 0
29+
nilBehavior = ARRAY_WITH_NIL

src/main/java/org/truffleruby/parser/YARPLoadArgumentsTranslator.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,6 @@ public RubyNode visitImplicitRestNode(Nodes.ImplicitRestNode node) {
262262
throw CompilerDirectives.shouldNotReachHere("handled in #translateWithParameters");
263263
}
264264

265-
266265
@Override
267266
public RubyNode visitKeywordRestParameterNode(Nodes.KeywordRestParameterNode node) {
268267
final RubyNode readNode = new ReadKeywordRestArgumentNode(language, arity);

src/main/java/org/truffleruby/parser/YARPMultiWriteNodeTranslator.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
*/
1010
package org.truffleruby.parser;
1111

12+
import com.oracle.truffle.api.CompilerDirectives;
1213
import org.prism.AbstractNodeVisitor;
1314
import org.prism.Nodes;
1415
import org.truffleruby.RubyLanguage;
@@ -50,7 +51,13 @@ public RubyNode translate() {
5051

5152
final AssignableNode restNode;
5253
if (node.rest != null) {
53-
restNode = node.rest.accept(this);
54+
if (node.rest instanceof Nodes.ImplicitRestNode) {
55+
// a, = []
56+
// do nothing
57+
restNode = null;
58+
} else {
59+
restNode = node.rest.accept(this);
60+
}
5461
} else {
5562
restNode = null;
5663
}
@@ -99,6 +106,11 @@ public AssignableNode visitGlobalVariableTargetNode(Nodes.GlobalVariableTargetNo
99106
return ((AssignableNode) rubyNode).toAssignableNode();
100107
}
101108

109+
@Override
110+
public AssignableNode visitImplicitRestNode(Nodes.ImplicitRestNode node) {
111+
throw CompilerDirectives.shouldNotReachHere("handled in #translate");
112+
}
113+
102114
@Override
103115
public AssignableNode visitIndexTargetNode(Nodes.IndexTargetNode node) {
104116
final RubyNode rubyNode = node.accept(yarpTranslator);

0 commit comments

Comments
 (0)