Skip to content

Commit 5fdb09c

Browse files
committed
calltarget should do same game of adding receiver before processing rhs assignment code
1 parent bb8b5cd commit 5fdb09c

File tree

1 file changed

+22
-6
lines changed

1 file changed

+22
-6
lines changed

src/main/java/org/jruby/prism/builder/IRBuilderPrism.java

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1694,15 +1694,28 @@ protected void buildAssignment(Map<Node, Operand> reads, List<Tuple<Node, Result
16941694
var rhs = assign.b.getResult();
16951695

16961696
switch (node) {
1697-
case CallTargetNode call -> buildAttrAssignAssignment(call.receiver, call.name, Node.EMPTY_ARRAY, rhs);
1697+
case CallTargetNode call -> {
1698+
var receiver = reads.get(call.receiver);
1699+
if (call.isSafeNavigation()) {
1700+
if_not(receiver, nil(),
1701+
() -> call(temp(), receiver, call.name, rhs));
1702+
} else {
1703+
call(temp(), receiver, call.name, rhs);
1704+
}
1705+
}
16981706
case IndexTargetNode index -> {
16991707
var receiver = reads.get(index.receiver);
17001708
Array holders = (Array) reads.get(index.arguments);
17011709
int flags = ((Integer) holders.get(holders.size() - 1)).value;
1702-
Operand[] args = new Operand[holders.size() - 1];
1703-
System.arraycopy(holders.getElts(), 0, args, 0, args.length);
1704-
args = addArg(args, rhs);
1705-
addInstr(AttrAssignInstr.create(scope, receiver, symbol("[]="), args, flags, scope.maybeUsingRefinements()));
1710+
Operand[] nargs = new Operand[holders.size() - 1];
1711+
System.arraycopy(holders.getElts(), 0, nargs, 0, nargs.length);
1712+
Operand[] args = addArg(nargs, rhs);
1713+
if (index.isSafeNavigation()) {
1714+
if_not(receiver, nil(),
1715+
() -> addInstr(AttrAssignInstr.create(scope, receiver, symbol("[]="), args, flags, scope.maybeUsingRefinements())));
1716+
} else {
1717+
addInstr(AttrAssignInstr.create(scope, receiver, symbol("[]="), args, flags, scope.maybeUsingRefinements()));
1718+
}
17061719
}
17071720
case ClassVariableTargetNode cvar -> addInstr(new PutClassVariableInstr(classVarDefinitionContainer(), cvar.name, rhs));
17081721
case ConstantPathTargetNode constpath -> putConstant(reads.get(constpath), constpath.name, rhs);
@@ -1759,6 +1772,9 @@ private void buildMultiAssignment(Node[] pre, Node rest, Node[] post, Operand va
17591772
private void processReads(Variable result, List<Tuple<Node, ResultInstr>> assigns, Map<Node, Operand> reads,
17601773
Node node) {
17611774
switch(node) {
1775+
case CallTargetNode call:
1776+
reads.put(call.receiver, build(call.receiver));
1777+
break;
17621778
case IndexTargetNode index:
17631779
reads.put(index.receiver, build(index.receiver));
17641780
Node[] arguments = index.arguments == null ? Node.EMPTY_ARRAY : index.arguments.arguments;
@@ -1773,7 +1789,7 @@ private void processReads(Variable result, List<Tuple<Node, ResultInstr>> assign
17731789
reads.put(node, classVarDefinitionContainer());
17741790
break;
17751791
case ConstantPathTargetNode constpath:
1776-
reads.put(node, buildModuleParent(((ConstantPathTargetNode) node).parent));
1792+
reads.put(node, buildModuleParent(constpath.parent));
17771793
break;
17781794
case MultiTargetNode multi:
17791795
var subRet = temp();

0 commit comments

Comments
 (0)