@@ -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