From 9b56f880febd39cb705d658a50512ef3ae1a9162 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Wed, 5 Feb 2025 19:16:59 +0000 Subject: Optimise method calls --- .../java/org/shedlang/compiler/shid/ShidCodeGen.java | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) (limited to 'src/main/java') 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(), -- cgit v1.2.3