Skip to content

Commit 3f2e280

Browse files
committed
Fix assertion in RubyCallNode#assign when isSplatted
(cherry picked from commit 973ba7c)
1 parent 2ef23fc commit 3f2e280

File tree

2 files changed

+11
-4
lines changed

2 files changed

+11
-4
lines changed

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
import com.oracle.truffle.api.profiles.ConditionProfile;
2626

2727
@NodeChild(value = "array", type = RubyNode.class)
28-
@NodeChild(value = "value", type = RubyNode.class)
28+
@NodeChild(value = "valueNode", type = RubyNode.class)
2929
@ImportStatic(ArrayGuards.class)
3030
public abstract class ArrayAppendOneNode extends RubyContextSourceNode {
3131

@@ -37,6 +37,8 @@ public static ArrayAppendOneNode create() {
3737

3838
public abstract RubyArray executeAppendOne(RubyArray array, Object value);
3939

40+
public abstract RubyNode getValueNode();
41+
4042
// Append of the correct type
4143

4244
@Specialization(

src/main/java/org/truffleruby/language/dispatch/RubyCallNode.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
import org.truffleruby.RubyContext;
1313
import org.truffleruby.RubyLanguage;
14+
import org.truffleruby.core.array.ArrayAppendOneNode;
1415
import org.truffleruby.core.array.ArrayToObjectArrayNode;
1516
import org.truffleruby.core.array.ArrayToObjectArrayNodeGen;
1617
import org.truffleruby.core.array.AssignableNode;
@@ -100,8 +101,8 @@ public Object execute(VirtualFrame frame) {
100101

101102
@Override
102103
public void assign(VirtualFrame frame, Object value) {
103-
assert getLastArgumentNode() instanceof NilLiteralNode &&
104-
((NilLiteralNode) getLastArgumentNode()).isImplicit() : getLastArgumentNode();
104+
assert (getLastArgumentNode() instanceof NilLiteralNode &&
105+
((NilLiteralNode) getLastArgumentNode()).isImplicit()) : getLastArgumentNode();
105106

106107
final Object receiverObject = receiver.execute(frame);
107108
if (isSafeNavigation && nilProfile.profile(receiverObject == nil)) {
@@ -195,7 +196,11 @@ public boolean hasLiteralBlock() {
195196
}
196197

197198
private RubyNode getLastArgumentNode() {
198-
return arguments[arguments.length - 1];
199+
final RubyNode lastArg = arguments[arguments.length - 1];
200+
if (isSplatted && lastArg instanceof ArrayAppendOneNode) {
201+
return ((ArrayAppendOneNode) lastArg).getValueNode();
202+
}
203+
return lastArg;
199204
}
200205

201206
@Override

0 commit comments

Comments
 (0)