From 3806ad65fcd43415278998e67fd63efbfd263807 Mon Sep 17 00:00:00 2001 From: Michael Bogdanov Date: Thu, 1 Oct 2015 11:25:13 +0300 Subject: [PATCH] Fixed error with wrong parameter size calculation --- .../kotlin/codegen/inline/MethodInliner.java | 2 +- .../boxInline/argumentOrder/captured.1.kt | 29 +++++++++++++++++++ .../boxInline/argumentOrder/captured.2.kt | 5 ++++ .../argumentOrder/capturedInExtension.1.kt | 28 ++++++++++++++++++ .../argumentOrder/capturedInExtension.2.kt | 6 ++++ .../BlackBoxInlineCodegenTestGenerated.java | 6 ++++ ...otlinAgainstInlineKotlinTestGenerated.java | 6 ++++ 7 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/boxInline/argumentOrder/captured.1.kt create mode 100644 compiler/testData/codegen/boxInline/argumentOrder/captured.2.kt create mode 100644 compiler/testData/codegen/boxInline/argumentOrder/capturedInExtension.1.kt create mode 100644 compiler/testData/codegen/boxInline/argumentOrder/capturedInExtension.2.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/MethodInliner.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/MethodInliner.java index 7480ef02111..8d222398fea 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/MethodInliner.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/MethodInliner.java @@ -428,7 +428,7 @@ public class MethodInliner { String desc = methodInsnNode.desc; String name = methodInsnNode.name; //TODO check closure - int paramLength = Type.getArgumentTypes(desc).length + 1;//non static + int paramLength = Type.getArgumentsAndReturnSizes(desc) >> 2;//non static if (isInvokeOnLambda(owner, name) /*&& methodInsnNode.owner.equals(INLINE_RUNTIME)*/) { SourceValue sourceValue = frame.getStack(frame.getStackSize() - paramLength); diff --git a/compiler/testData/codegen/boxInline/argumentOrder/captured.1.kt b/compiler/testData/codegen/boxInline/argumentOrder/captured.1.kt new file mode 100644 index 00000000000..60e2061d073 --- /dev/null +++ b/compiler/testData/codegen/boxInline/argumentOrder/captured.1.kt @@ -0,0 +1,29 @@ +import test.* + +fun box(): String { + var invokeOrder = ""; + val expectedResult = "0_1_9" + val expectedInvokeOrder = "1_0_9" + var l = 1L + var i = 0 + val captured = 9L + + var result = test(b = {invokeOrder += "1_"; l}(), a = {invokeOrder+="0_"; i}(), c = {invokeOrder += "$captured"; "$captured"}) + if (invokeOrder != expectedInvokeOrder || result != expectedResult) return "fail 1: $invokeOrder != $expectedInvokeOrder or $result != $expectedResult" + + invokeOrder = ""; + result = test(b = {invokeOrder += "1_"; l}(), c = {invokeOrder += "$captured"; "$captured"}, a = {invokeOrder+="0_"; i}()) + if (invokeOrder != expectedInvokeOrder || result != expectedResult) return "fail 2: $invokeOrder != $expectedInvokeOrder or $result != $expectedResult" + + + invokeOrder = ""; + result = test(c = {invokeOrder += "$captured"; "$captured"}, b = {invokeOrder += "1_"; l}(), a = {invokeOrder+="0_"; i}()) + if (invokeOrder != expectedInvokeOrder || result != expectedResult) return "fail 3: $invokeOrder != $expectedInvokeOrder or $result != $expectedResult" + + + invokeOrder = ""; + result = test(a = {invokeOrder+="0_"; i}(), c = {invokeOrder += "$captured"; "$captured"}, b = {invokeOrder += "1_"; l}()) + if (invokeOrder != "0_1_9" || result != expectedResult) return "fail 4: $invokeOrder != 0_1_9 or $result != $expectedResult" + + return "OK" +} \ No newline at end of file diff --git a/compiler/testData/codegen/boxInline/argumentOrder/captured.2.kt b/compiler/testData/codegen/boxInline/argumentOrder/captured.2.kt new file mode 100644 index 00000000000..1051e47d9a0 --- /dev/null +++ b/compiler/testData/codegen/boxInline/argumentOrder/captured.2.kt @@ -0,0 +1,5 @@ +package test + +inline fun test(a: Int, b: Long, crossinline c: () -> String): String { + return { "${a}_${b}_${c()}"} () +} \ No newline at end of file diff --git a/compiler/testData/codegen/boxInline/argumentOrder/capturedInExtension.1.kt b/compiler/testData/codegen/boxInline/argumentOrder/capturedInExtension.1.kt new file mode 100644 index 00000000000..3fe3354b186 --- /dev/null +++ b/compiler/testData/codegen/boxInline/argumentOrder/capturedInExtension.1.kt @@ -0,0 +1,28 @@ +import test.* + +fun box(): String { + var invokeOrder = ""; + val expectedResult = "1.0_0_1_9" + val expectedInvokeOrder = "1_0_9" + var l = 1L + var i = 0 + val captured = 9L + + var result = 1.0.test(b = {invokeOrder += "1_"; l}(), a = {invokeOrder+="0_"; i}(), c = {invokeOrder += "$captured"; "$captured"}) + if (invokeOrder != expectedInvokeOrder || result != expectedResult) return "fail 1: $invokeOrder != $expectedInvokeOrder or $result != $expectedResult" + + invokeOrder = ""; + result = 1.0.test(b = {invokeOrder += "1_"; l}(), c = {invokeOrder += "${captured}"; "${captured}"}, a = {invokeOrder+="0_"; i}()) + if (invokeOrder != expectedInvokeOrder || result != expectedResult) return "fail 2: $invokeOrder != $expectedInvokeOrder or $result != $expectedResult" + + + invokeOrder = ""; + result = 1.0.test(c = {invokeOrder += "${captured}"; "${captured}"}, b = {invokeOrder += "1_"; l}(), a = {invokeOrder+="0_"; i}()) + if (invokeOrder != expectedInvokeOrder || result != expectedResult) return "fail 3: $invokeOrder != $expectedInvokeOrder or $result != $expectedResult" + + invokeOrder = ""; + result = 1.0.test(a = {invokeOrder+="0_"; i}(), c = {invokeOrder += "${captured}"; "${captured}"}, b = {invokeOrder += "1_"; l}()) + if (invokeOrder != "0_1_9" || result != expectedResult) return "fail 4: $invokeOrder != 0_1_9 or $result != $expectedResult" + + return "OK" +} \ No newline at end of file diff --git a/compiler/testData/codegen/boxInline/argumentOrder/capturedInExtension.2.kt b/compiler/testData/codegen/boxInline/argumentOrder/capturedInExtension.2.kt new file mode 100644 index 00000000000..2b23d24c452 --- /dev/null +++ b/compiler/testData/codegen/boxInline/argumentOrder/capturedInExtension.2.kt @@ -0,0 +1,6 @@ +package test + +inline fun Double.test(a: Int, b: Long, crossinline c: () -> String): String { + + return { "${this}_${a}_${b}_${c()}"} () +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxInlineCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxInlineCodegenTestGenerated.java index 216f42935b0..fa4f1cf6258 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxInlineCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxInlineCodegenTestGenerated.java @@ -130,6 +130,12 @@ public class BlackBoxInlineCodegenTestGenerated extends AbstractBlackBoxInlineCo doTestMultiFileWithInlineCheck(fileName); } + @TestMetadata("capturedInExtension.1.kt") + public void testCapturedInExtension() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/argumentOrder/capturedInExtension.1.kt"); + doTestMultiFileWithInlineCheck(fileName); + } + @TestMetadata("extension.1.kt") public void testExtension() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/argumentOrder/extension.1.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstInlineKotlinTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstInlineKotlinTestGenerated.java index 939279da666..d629aa6e49d 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstInlineKotlinTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstInlineKotlinTestGenerated.java @@ -130,6 +130,12 @@ public class CompileKotlinAgainstInlineKotlinTestGenerated extends AbstractCompi doBoxTestWithInlineCheck(fileName); } + @TestMetadata("capturedInExtension.1.kt") + public void testCapturedInExtension() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/argumentOrder/capturedInExtension.1.kt"); + doBoxTestWithInlineCheck(fileName); + } + @TestMetadata("extension.1.kt") public void testExtension() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/argumentOrder/extension.1.kt");