aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2025-02-05 19:16:59 +0000
committerMichael Williamson <mike@zwobble.org>2025-02-05 19:18:35 +0000
commit9b56f880febd39cb705d658a50512ef3ae1a9162 (patch)
treee785d8939758dfc05494e7f2d0a636dc19f4c80f /src/main/java
parent79c758d217d2c467e26bf65638bd22e885f2826d (diff)
Optimise method calls
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/shid/ShidCodeGen.java20
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(),