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 --- .../compiler/shid/ShidCodeGenCallTests.java | 38 ++++++++++++++++++++++ .../shid/ShidCodeGenMemberAccessTests.java | 1 - 2 files changed, 38 insertions(+), 1 deletion(-) (limited to 'src/test/java') diff --git a/src/test/java/org/shedlang/compiler/shid/ShidCodeGenCallTests.java b/src/test/java/org/shedlang/compiler/shid/ShidCodeGenCallTests.java index e315b752..6a63be8f 100644 --- a/src/test/java/org/shedlang/compiler/shid/ShidCodeGenCallTests.java +++ b/src/test/java/org/shedlang/compiler/shid/ShidCodeGenCallTests.java @@ -2,6 +2,9 @@ package org.shedlang.compiler.shid; import org.junit.jupiter.api.Test; import org.shedlang.compiler.ast.typed.Typed; +import org.shedlang.compiler.types.FunctionType; +import org.shedlang.compiler.types.NamespaceName; +import org.shedlang.compiler.types.Types; import java.util.List; @@ -38,4 +41,39 @@ public class ShidCodeGenCallTests { isShidCall(2, List.of("x2", "x1")) )); } + + @Test + public void methodCallIsCompiledToDirectCallWithoutMethodReference() { + var namespaceName = NamespaceName.of("Example", "Project"); + var structType = Types.struct(namespaceName, "User"); + var node = Typed.call( + Typed.methodAccess( + Typed.reference("x", structType), + "f", + FunctionType.builder().build() + ), + List.of( + Typed.stringLiteral("p1"), + Typed.stringLiteral("p2") + ), + List.of( + Typed.namedArg("x2", Typed.stringLiteral("n2")), + Typed.namedArg("x1", Typed.stringLiteral("n1")) + ) + ); + var context = ShidCodeGen.Context.EMPTY + .addShedVal("x"); + + var result = ShidCodeGen.compileExpression(node, context); + + assertThat(result.instructions(), isSequence( + isShidMethodLoad(structType, "f"), + isShidLocalLoad("x__0"), + isShidPushString("p1"), + isShidPushString("p2"), + isShidPushString("n2"), + isShidPushString("n1"), + isShidCall(3, List.of("x2", "x1")) + )); + } } diff --git a/src/test/java/org/shedlang/compiler/shid/ShidCodeGenMemberAccessTests.java b/src/test/java/org/shedlang/compiler/shid/ShidCodeGenMemberAccessTests.java index d2a0e5ce..09c8103f 100644 --- a/src/test/java/org/shedlang/compiler/shid/ShidCodeGenMemberAccessTests.java +++ b/src/test/java/org/shedlang/compiler/shid/ShidCodeGenMemberAccessTests.java @@ -72,7 +72,6 @@ public class ShidCodeGenMemberAccessTests { var result = ShidCodeGen.compileExpression(node, context); - // TODO: optimise calls assertThat(result.instructions(), isSequence( isShidLocalLoad("user__0"), isShidLocalStore("receiver__0"), -- cgit v1.2.3