Skip to content

Commit 848da7d

Browse files
committed
fixup 'for' allowing lazy op in value assignment for method calls
1 parent e7da75e commit 848da7d

File tree

1 file changed

+19
-4
lines changed

1 file changed

+19
-4
lines changed

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

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)