Skip to content

Commit 5a270b8

Browse files
committed
Share a common empty array for mass assignment cases where either the pre- or post- node argument lists are empty.
1 parent d6eb84d commit 5a270b8

File tree

2 files changed

+18
-8
lines changed

2 files changed

+18
-8
lines changed

src/main/java/org/truffleruby/core/array/MultipleAssignmentNode.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,10 @@ public RubyNode cloneUninitialized() {
144144
}
145145

146146
protected AssignableNode[] cloneUninitializedAssignable(AssignableNode[] nodes) {
147+
if (nodes.length == 0) {
148+
return AssignableNode.EMPTY_ARRAY;
149+
}
150+
147151
AssignableNode[] copies = new AssignableNode[nodes.length];
148152
for (int i = 0; i < nodes.length; i++) {
149153
copies[i] = nodes[i].cloneUninitializedAssignable();

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

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -78,10 +78,7 @@ public MultipleAssignmentNode translate() {
7878
true,
7979
null);
8080

81-
final AssignableNode[] preNodes = new AssignableNode[node.lefts.length];
82-
for (int i = 0; i < node.lefts.length; i++) {
83-
preNodes[i] = node.lefts[i].accept(this);
84-
}
81+
final AssignableNode[] preNodes = processAssignables(node.lefts);
8582

8683
final AssignableNode restNode;
8784
if (node.rest != null) {
@@ -97,10 +94,7 @@ public MultipleAssignmentNode translate() {
9794
restNode = null;
9895
}
9996

100-
final AssignableNode[] postNodes = new AssignableNode[node.rights.length];
101-
for (int i = 0; i < node.rights.length; i++) {
102-
postNodes[i] = node.rights[i].accept(this);
103-
}
97+
final AssignableNode[] postNodes = processAssignables(node.rights);
10498

10599
// prolog is supposed to be executed in the outer MultipleAssignmentNode (in multi-assignment only)
106100
final var multipleAssignmentNode = new MultipleAssignmentNode(
@@ -113,6 +107,18 @@ public MultipleAssignmentNode translate() {
113107
return multipleAssignmentNode;
114108
}
115109

110+
private AssignableNode[] processAssignables(Nodes.Node[] nodes) {
111+
if (nodes.length == 0) {
112+
return MultipleAssignmentNode.EMPTY_ASSIGNABLES;
113+
}
114+
115+
final AssignableNode[] assignables = new AssignableNode[nodes.length];
116+
for (int i = 0; i < nodes.length; i++) {
117+
assignables[i] = nodes[i].accept(this);
118+
}
119+
return assignables;
120+
}
121+
116122
@Override
117123
public AssignableNode visitClassVariableTargetNode(Nodes.ClassVariableTargetNode node) {
118124
final RubyNode rubyNode = node.accept(yarpTranslator);

0 commit comments

Comments
 (0)