aboutsummaryrefslogtreecommitdiff
path: root/src/test/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/test/java
parent79c758d217d2c467e26bf65638bd22e885f2826d (diff)
Optimise method calls
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/shid/ShidCodeGenCallTests.java38
-rw-r--r--src/test/java/org/shedlang/compiler/shid/ShidCodeGenMemberAccessTests.java1
2 files changed, 38 insertions, 1 deletions
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"),