diff options
| author | Michael Williamson <mike@zwobble.org> | 2025-02-05 19:16:59 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2025-02-05 19:18:35 +0000 |
| commit | 9b56f880febd39cb705d658a50512ef3ae1a9162 (patch) | |
| tree | e785d8939758dfc05494e7f2d0a636dc19f4c80f /src/main/java | |
| parent | 79c758d217d2c467e26bf65638bd22e885f2826d (diff) | |
Optimise method calls
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/shid/ShidCodeGen.java | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/src/main/java/org/shedlang/compiler/shid/ShidCodeGen.java b/src/main/java/org/shedlang/compiler/shid/ShidCodeGen.java index 78226cce..bf6d2072 100644 --- a/src/main/java/org/shedlang/compiler/shid/ShidCodeGen.java +++ b/src/main/java/org/shedlang/compiler/shid/ShidCodeGen.java @@ -111,7 +111,23 @@ public class ShidCodeGen { } private static Context compileCall(TypedCallNode node, Context context) { - context = compileExpression(node.receiver(), context); + var extraArgumentCount = 0; + if ( + node.receiver() instanceof TypedMemberAccessNode receiverNode && + receiverNode.memberKind() == MemberKind.METHOD + ) { + extraArgumentCount = 1; + var methodCallReceiver = receiverTypeToReceiver(receiverNode.receiver().type()); + var methodCallReceiverType = ((ShidFieldLoad.Receiver.Struct) methodCallReceiver).type(); + context = context.addInstruction(new ShidMethodLoad( + methodCallReceiverType, + receiverNode.memberName(), + receiverNode.source() + )); + context = compileExpression(receiverNode.receiver(), context); + } else { + context = compileExpression(node.receiver(), context); + } for (var arg : node.args().positional()) { context = compileExpression(arg, context); @@ -122,7 +138,7 @@ public class ShidCodeGen { } var callInstruction = new ShidCall( - node.args().positional().size(), + node.args().positional().size() + extraArgumentCount, node.args().named().stream() .map(arg -> arg.name()) .toList(), |
