From 14b16ff87cf49c8398ac65e786482b17584d482e Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Thu, 5 Mar 2015 21:24:11 +0300 Subject: [PATCH] KT-6916 Slow bytecode for downTo iteration like for (i in max downTo min) #KT-6916 fixed --- .../kotlin/codegen/RangeCodegenUtil.java | 7 +--- .../forLoop/primitiveLiteralRange1.kt | 8 +++++ .../forLoop/primitiveLiteralRange2.kt | 8 +++++ .../forLoop/primitiveProgression.kt | 11 ++++++ .../bytecodeText/forLoop/primitiveRange.kt | 8 +++++ .../codegen/BytecodeTextTestGenerated.java | 34 +++++++++++++++++++ 6 files changed, 70 insertions(+), 6 deletions(-) create mode 100644 compiler/testData/codegen/bytecodeText/forLoop/primitiveLiteralRange1.kt create mode 100644 compiler/testData/codegen/bytecodeText/forLoop/primitiveLiteralRange2.kt create mode 100644 compiler/testData/codegen/bytecodeText/forLoop/primitiveProgression.kt create mode 100644 compiler/testData/codegen/bytecodeText/forLoop/primitiveRange.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/RangeCodegenUtil.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/RangeCodegenUtil.java index 50c8fceca4f..9e9d0385a04 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/RangeCodegenUtil.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/RangeCodegenUtil.java @@ -107,12 +107,7 @@ public class RangeCodegenUtil { @NotNull ImmutableMap map ) { ClassifierDescriptor declarationDescriptor = rangeOrProgression.getConstructor().getDeclarationDescriptor(); - assert declarationDescriptor != null; - if (declarationDescriptor != KotlinBuiltIns.getInstance().getBuiltInsPackageScope().getClassifier(declarationDescriptor.getName())) { - // Must be a standard library class - return null; - } - return map.get(DescriptorUtils.getFqNameSafe(declarationDescriptor)); + return declarationDescriptor == null ? null : map.get(DescriptorUtils.getFqNameSafe(declarationDescriptor)); } @Nullable diff --git a/compiler/testData/codegen/bytecodeText/forLoop/primitiveLiteralRange1.kt b/compiler/testData/codegen/bytecodeText/forLoop/primitiveLiteralRange1.kt new file mode 100644 index 00000000000..20fab8f182a --- /dev/null +++ b/compiler/testData/codegen/bytecodeText/forLoop/primitiveLiteralRange1.kt @@ -0,0 +1,8 @@ +fun f() { + for (i in 1..2) { + } +} + +// 0 iterator +// 0 getStart +// 0 getEnd \ No newline at end of file diff --git a/compiler/testData/codegen/bytecodeText/forLoop/primitiveLiteralRange2.kt b/compiler/testData/codegen/bytecodeText/forLoop/primitiveLiteralRange2.kt new file mode 100644 index 00000000000..1455226d206 --- /dev/null +++ b/compiler/testData/codegen/bytecodeText/forLoop/primitiveLiteralRange2.kt @@ -0,0 +1,8 @@ +fun f(a: Int, b: Int) { + for (i in a..b) { + } +} + +// 0 iterator +// 0 getStart +// 0 getEnd \ No newline at end of file diff --git a/compiler/testData/codegen/bytecodeText/forLoop/primitiveProgression.kt b/compiler/testData/codegen/bytecodeText/forLoop/primitiveProgression.kt new file mode 100644 index 00000000000..2dd83bf5baa --- /dev/null +++ b/compiler/testData/codegen/bytecodeText/forLoop/primitiveProgression.kt @@ -0,0 +1,11 @@ +fun f() { + for (i in 0..5 step 2) { + } + for (i in 5 downTo 1) { + } +} + +// 0 iterator +// 2 getStart +// 2 getEnd +// 2 getIncrement \ No newline at end of file diff --git a/compiler/testData/codegen/bytecodeText/forLoop/primitiveRange.kt b/compiler/testData/codegen/bytecodeText/forLoop/primitiveRange.kt new file mode 100644 index 00000000000..2af7d7ff355 --- /dev/null +++ b/compiler/testData/codegen/bytecodeText/forLoop/primitiveRange.kt @@ -0,0 +1,8 @@ +fun f(r: IntRange) { + for (i in r) { + } +} + +// 0 iterator +// 1 getStart +// 1 getEnd \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java index 362682cd1d0..f02f6b146cd 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java @@ -35,6 +35,7 @@ import java.util.regex.Pattern; BytecodeTextTestGenerated.Constants.class, BytecodeTextTestGenerated.DeadCodeElimination.class, BytecodeTextTestGenerated.DirectInvoke.class, + BytecodeTextTestGenerated.ForLoop.class, BytecodeTextTestGenerated.Inline.class, BytecodeTextTestGenerated.LazyCodegen.class, BytecodeTextTestGenerated.LineNumbers.class, @@ -405,6 +406,39 @@ public class BytecodeTextTestGenerated extends AbstractBytecodeTextTest { } } + @TestMetadata("compiler/testData/codegen/bytecodeText/forLoop") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class ForLoop extends AbstractBytecodeTextTest { + public void testAllFilesPresentInForLoop() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/bytecodeText/forLoop"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("primitiveLiteralRange1.kt") + public void testPrimitiveLiteralRange1() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeText/forLoop/primitiveLiteralRange1.kt"); + doTest(fileName); + } + + @TestMetadata("primitiveLiteralRange2.kt") + public void testPrimitiveLiteralRange2() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeText/forLoop/primitiveLiteralRange2.kt"); + doTest(fileName); + } + + @TestMetadata("primitiveProgression.kt") + public void testPrimitiveProgression() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeText/forLoop/primitiveProgression.kt"); + doTest(fileName); + } + + @TestMetadata("primitiveRange.kt") + public void testPrimitiveRange() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeText/forLoop/primitiveRange.kt"); + doTest(fileName); + } + } + @TestMetadata("compiler/testData/codegen/bytecodeText/inline") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)