@@ -615,7 +615,8 @@ protected void receiveForArgs(Node node) {
615615 buildBlockArgsAssignment (node , null , 0 , false );
616616 } else if (node instanceof ClassVariableTargetNode || node instanceof LocalVariableTargetNode ||
617617 node instanceof InstanceVariableTargetNode || node instanceof ConstantTargetNode ||
618- node instanceof GlobalVariableTargetNode || node instanceof CallTargetNode ) {
618+ node instanceof GlobalVariableTargetNode || node instanceof CallTargetNode ||
619+ node instanceof IndexTargetNode ) {
619620 receivePreArg (node , keywords , 0 );
620621 } else {
621622 throw notCompilable ("missing arg processing for `for`" , node );
@@ -2205,9 +2206,23 @@ public void receivePreArg(Node node, Variable keywords, int argIndex) {
22052206 addInstr (new ReceivePreReqdArgInstr (v , keywords , argIndex ));
22062207 addInstr (new PutGlobalVarInstr (target .name , v ));
22072208 } else if (node instanceof CallTargetNode target ) {
2208- Variable v = temp ();
2209- addInstr (new ReceivePreReqdArgInstr (v , keywords , argIndex ));
2210- call (temp (), build (target .receiver ), target .name , v );
2209+ var v = addResultInstr (new ReceivePreReqdArgInstr (temp (), keywords , argIndex ));
2210+ if (target .isSafeNavigation ()) {
2211+ var receiver = build (target .receiver );
2212+ if_not (receiver , nil (),
2213+ () -> call (temp (), receiver , target .name , v ));
2214+ } else {
2215+ call (temp (), build (target .receiver ), target .name , v );
2216+ }
2217+ } else if (node instanceof IndexTargetNode target ) {
2218+ var v = addResultInstr (new ReceivePreReqdArgInstr (temp (), keywords , argIndex ));
2219+ if (target .isSafeNavigation ()) {
2220+ var receiver = build (target .receiver );
2221+ if_not (receiver , nil (),
2222+ () -> call (temp (), receiver , symbol ("[]=" ), addArg (buildArguments (target .arguments ), v )));
2223+ } else {
2224+ call (temp (), build (target .receiver ), symbol ("[]=" ), addArg (buildArguments (target .arguments ), v ));
2225+ }
22112226 } else {
22122227 throw notCompilable ("Can't build required parameter node" , node );
22132228 }
0 commit comments