Skip to content

Commit 6de0cb7

Browse files
committed
consolidate calltargetnode so they can all safe navigate and dry it up
1 parent 5f5b133 commit 6de0cb7

File tree

1 file changed

+15
-20
lines changed

1 file changed

+15
-20
lines changed

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

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

Comments
 (0)