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/test/java | |
| parent | 79c758d217d2c467e26bf65638bd22e885f2826d (diff) | |
Optimise method calls
Diffstat (limited to 'src/test/java')
| -rw-r--r-- | src/test/java/org/shedlang/compiler/shid/ShidCodeGenCallTests.java | 38 | ||||
| -rw-r--r-- | src/test/java/org/shedlang/compiler/shid/ShidCodeGenMemberAccessTests.java | 1 |
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"), |
