From 87b6ec499092bf442981bb2c872ab3b971f09f1d Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Mon, 2 Dec 2013 21:55:58 +0400 Subject: [PATCH] Proper read instructions for function literals --- .../jet/lang/cfg/JetControlFlowBuilder.java | 1 + .../cfg/JetControlFlowBuilderAdapter.java | 5 +++ .../jet/lang/cfg/JetControlFlowProcessor.java | 1 + .../JetControlFlowInstructionsGenerator.java | 5 +++ .../cfg/unusedFunctionLiteral.instructions | 40 +++++++++++++++++++ .../testData/cfg/unusedFunctionLiteral.kt | 3 ++ .../jet/cfg/ControlFlowTestGenerated.java | 5 +++ 7 files changed, 60 insertions(+) create mode 100644 compiler/testData/cfg/unusedFunctionLiteral.instructions create mode 100644 compiler/testData/cfg/unusedFunctionLiteral.kt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilder.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilder.java index a86a7ed2bfd..6bc45e7a26c 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilder.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilder.java @@ -88,6 +88,7 @@ public interface JetControlFlowBuilder { void loadUnit(@NotNull JetExpression expression); void loadConstant(@NotNull JetExpression expression, @Nullable CompileTimeConstant constant); void createAnonymousObject(@NotNull JetObjectLiteralExpression expression); + void createFunctionLiteral(@NotNull JetFunctionLiteralExpression expression); void loadStringTemplate(@NotNull JetStringTemplateExpression expression); void readThis(@NotNull JetExpression expression, @Nullable ReceiverParameterDescriptor parameterDescriptor); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilderAdapter.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilderAdapter.java index 95801dc33ce..7947341a7c4 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilderAdapter.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilderAdapter.java @@ -47,6 +47,11 @@ public abstract class JetControlFlowBuilderAdapter implements JetControlFlowBuil getDelegateBuilder().createAnonymousObject(expression); } + @Override + public void createFunctionLiteral(@NotNull JetFunctionLiteralExpression expression) { + getDelegateBuilder().createFunctionLiteral(expression); + } + @Override public void loadStringTemplate(@NotNull JetStringTemplateExpression expression) { getDelegateBuilder().loadStringTemplate(expression); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java index 03b6e3c2f69..6c926a10170 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java @@ -700,6 +700,7 @@ public class JetControlFlowProcessor { public void visitFunctionLiteralExpression(@NotNull JetFunctionLiteralExpression expression) { JetFunctionLiteral functionLiteral = expression.getFunctionLiteral(); processLocalDeclaration(functionLiteral); + builder.createFunctionLiteral(expression); } @Override diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/JetControlFlowInstructionsGenerator.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/JetControlFlowInstructionsGenerator.java index a67d8013585..24869f8ccba 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/JetControlFlowInstructionsGenerator.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/JetControlFlowInstructionsGenerator.java @@ -346,6 +346,11 @@ public class JetControlFlowInstructionsGenerator extends JetControlFlowBuilderAd read(expression); } + @Override + public void createFunctionLiteral(@NotNull JetFunctionLiteralExpression expression) { + read(expression); + } + @Override public void loadStringTemplate(@NotNull JetStringTemplateExpression expression) { read(expression); diff --git a/compiler/testData/cfg/unusedFunctionLiteral.instructions b/compiler/testData/cfg/unusedFunctionLiteral.instructions new file mode 100644 index 00000000000..82239e3eb30 --- /dev/null +++ b/compiler/testData/cfg/unusedFunctionLiteral.instructions @@ -0,0 +1,40 @@ +== foo == +fun foo() { + {} +} +--------------------- +L0: + NEXT:[jmp?(L2)] PREV:[] + jmp?(L2) NEXT:[r({}), d({})] PREV:[] + d({}) NEXT:[] PREV:[jmp?(L2)] +L2: + r({}) NEXT:[] PREV:[jmp?(L2)] +L1: + NEXT:[] PREV:[r({})] +error: + NEXT:[] PREV:[] +sink: + NEXT:[] PREV:[, , d({})] +L3: + NEXT:[read (Unit)] PREV:[] + read (Unit) NEXT:[] PREV:[] +L4: + NEXT:[] PREV:[read (Unit)] +error: + NEXT:[] PREV:[] +sink: + NEXT:[] PREV:[, ] +===================== +== anonymous_0 == +{} +--------------------- +L3: + NEXT:[read (Unit)] PREV:[] + read (Unit) NEXT:[] PREV:[] +L4: + NEXT:[] PREV:[read (Unit)] +error: + NEXT:[] PREV:[] +sink: + NEXT:[] PREV:[, ] +===================== diff --git a/compiler/testData/cfg/unusedFunctionLiteral.kt b/compiler/testData/cfg/unusedFunctionLiteral.kt new file mode 100644 index 00000000000..69c0e22a29f --- /dev/null +++ b/compiler/testData/cfg/unusedFunctionLiteral.kt @@ -0,0 +1,3 @@ +fun foo() { + {} +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/cfg/ControlFlowTestGenerated.java b/compiler/tests/org/jetbrains/jet/cfg/ControlFlowTestGenerated.java index 1732b0c3260..9bb99d23851 100644 --- a/compiler/tests/org/jetbrains/jet/cfg/ControlFlowTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/cfg/ControlFlowTestGenerated.java @@ -166,4 +166,9 @@ public class ControlFlowTestGenerated extends AbstractControlFlowTest { doTest("compiler/testData/cfg/unresolved.kt"); } + @TestMetadata("unusedFunctionLiteral.kt") + public void testUnusedFunctionLiteral() throws Exception { + doTest("compiler/testData/cfg/unusedFunctionLiteral.kt"); + } + }