From 4ed744428b4eaa18ef6c3cece3a59092422408a7 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Fri, 19 Sep 2014 16:04:11 +0400 Subject: [PATCH] Generate substatements as statements too Preventing pushing on stack redundant Unit instances #KT-5667 fixed --- .../jet/codegen/ExpressionCodegen.java | 2 +- .../statements/statementsComposition.kt | 36 +++++++++++++++++++ .../codegen/BytecodeTextTestGenerated.java | 6 ++++ 3 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/bytecodeText/statements/statementsComposition.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 03e7f873bed..842d6bbaaf4 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -261,7 +261,7 @@ public class ExpressionCodegen extends JetVisitor implem } public void gen(JetElement expr, Type type) { - StackValue value = gen(expr); + StackValue value = Type.VOID_TYPE.equals(type) ? genStatement(expr) : gen(expr); value.put(type, v); } diff --git a/compiler/testData/codegen/bytecodeText/statements/statementsComposition.kt b/compiler/testData/codegen/bytecodeText/statements/statementsComposition.kt new file mode 100644 index 00000000000..7a7419770c1 --- /dev/null +++ b/compiler/testData/codegen/bytecodeText/statements/statementsComposition.kt @@ -0,0 +1,36 @@ + +fun foo() { + val array = intArray(1,2,3) + + var count = 0 + for (element in array) if (element > 0) count++ + while (count > 0) if (count > 0) count++ + + if (count == 1) + if (count != 1) + count++ + else + print("1") + else + print("2") + + when (count) { + 1 -> if (count == 1) count++ else print("123") + else -> if (count == 1) count++ else print("123") + } + + for (element in array) + when (element) { + 1 -> if (count == 1) count++ else print("123") + else -> if (count == 1) count++ else print("123") + } + + while (count > 0) + when (count) { + 1 -> if (count == 1) count++ else print("123") + else -> if (count == 1) count++ else print("123") + } +} + +// 0 valueOf +// 0 GETSTATIC diff --git a/compiler/tests/org/jetbrains/jet/codegen/BytecodeTextTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/BytecodeTextTestGenerated.java index 09ea3f57791..4076fb3130b 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/BytecodeTextTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/BytecodeTextTestGenerated.java @@ -341,6 +341,12 @@ public class BytecodeTextTestGenerated extends AbstractBytecodeTextTest { doTest(fileName); } + @TestMetadata("statementsComposition.kt") + public void testStatementsComposition() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeText/statements/statementsComposition.kt"); + doTest(fileName); + } + @TestMetadata("tryCatchFinally.kt") public void testTryCatchFinally() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeText/statements/tryCatchFinally.kt");