@@ -375,8 +375,8 @@ private Operand buildArray(ArrayNode node) {
375375 protected void buildAssignment (Node node , Operand rhsVal ) {
376376 if (node == null ) return ; // case of 'a, = something'
377377
378- if (node instanceof CallTargetNode ) {
379- buildAttrAssignAssignment ((( CallTargetNode ) node ). receiver , (( CallTargetNode ) node ). name , Node . EMPTY_ARRAY , rhsVal );
378+ if (node instanceof CallTargetNode call ) {
379+ buildCallTarget ( call , build ( call . receiver ) , rhsVal );
380380 } else if (node instanceof IndexTargetNode ) {
381381 Node [] arguments = ((IndexTargetNode ) node ).arguments == null ? Node .EMPTY_ARRAY : ((IndexTargetNode ) node ).arguments .arguments ;
382382 buildAttrAssignAssignment (((IndexTargetNode ) node ).receiver , symbol ("[]=" ), arguments , rhsVal );
@@ -417,6 +417,16 @@ protected void buildAssignment(Node node, Operand rhsVal) {
417417 }
418418 }
419419
420+ private void buildCallTarget (CallTargetNode call , Operand receiver , Operand rhsVal ) {
421+ CallType callType = call .isIgnoreVisibility () ? CallType .FUNCTIONAL : CallType .NORMAL ;
422+ if (call .isSafeNavigation ()) {
423+ if_not (receiver , nil (),
424+ () -> _call (temp (), callType , receiver , call .name , rhsVal ));
425+ } else {
426+ _call (temp (), callType , receiver , call .name , rhsVal );
427+ }
428+ }
429+
420430 @ Override
421431 protected Operand [] buildAttrAssignCallArgs (Node argsNode , Operand [] rhs , boolean containsAssignment ) {
422432 Operand [] args = buildCallArgs (argsNode , new int [] { 0 });
@@ -1561,16 +1571,7 @@ protected void buildAssignment(Map<Node, Operand> reads, List<Tuple<Node, Result
15611571 var rhs = assign .b .getResult ();
15621572
15631573 switch (node ) {
1564- case CallTargetNode call -> {
1565- CallType callType = call .isIgnoreVisibility () ? CallType .FUNCTIONAL : CallType .NORMAL ;
1566- var receiver = reads .get (call .receiver );
1567- if (call .isSafeNavigation ()) {
1568- if_not (receiver , nil (),
1569- () -> _call (temp (), callType , receiver , call .name , rhs ));
1570- } else {
1571- _call (temp (), callType , receiver , call .name , rhs );
1572- }
1573- }
1574+ case CallTargetNode call -> buildCallTarget (call , reads .get (call .receiver ), rhs );
15741575 case IndexTargetNode index -> {
15751576 // FIXME: we determine self.foo[] by requiring receiver to be `self` in AttrAssignInstr but we could
15761577 // use isIgnoreVisibility() that the parser provides. We have no code path to do this though in AttrAssignInstr.
@@ -2182,15 +2183,9 @@ public void receivePreArg(Node node, Variable keywords, int argIndex) {
21822183 Variable v = temp ();
21832184 addInstr (new ReceivePreReqdArgInstr (v , keywords , argIndex ));
21842185 addInstr (new PutGlobalVarInstr (target .name , v ));
2185- } else if (node instanceof CallTargetNode target ) {
2186+ } else if (node instanceof CallTargetNode call ) {
21862187 var v = addResultInstr (new ReceivePreReqdArgInstr (temp (), keywords , argIndex ));
2187- if (target .isSafeNavigation ()) {
2188- var receiver = build (target .receiver );
2189- if_not (receiver , nil (),
2190- () -> call (temp (), receiver , target .name , v ));
2191- } else {
2192- call (temp (), build (target .receiver ), target .name , v );
2193- }
2188+ buildCallTarget (call , build (call .receiver ), v );
21942189 } else if (node instanceof IndexTargetNode target ) {
21952190 var v = addResultInstr (new ReceivePreReqdArgInstr (temp (), keywords , argIndex ));
21962191 if (target .isSafeNavigation ()) {
0 commit comments