From fae5b8da4bc2a47b2258d4dd996d79a86e460db9 Mon Sep 17 00:00:00 2001 From: Mads Ager Date: Tue, 1 Dec 2020 13:41:24 +0100 Subject: [PATCH] [JVM] Do not put the name of default lambda parameter in LVT. If we do, the local variable table will not make sense. As as example: ``` inline fun foo(getString: () -> String = { "OK" }) { println(getString()) } inline fun bar() { } fun main() { bar() foo() } ``` leads to the following bytecode: ``` public static final void main(); descriptor: ()V flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL Code: stack=2, locals=4, args_size=0 0: iconst_0 1: istore_0 2: nop 3: nop 4: iconst_0 5: istore_1 6: nop 7: ldc #53 // String OK 9: astore_2 10: iconst_0 11: istore_3 12: getstatic #30 // Field java/lang/System.out:Ljava/io/PrintStream; 15: aload_2 16: invokevirtual #36 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V 19: nop 20: return LineNumberTable: line 9: 0 line 13: 2 line 10: 3 line 14: 4 line 15: 6 line 16: 7 line 17: 19 line 11: 20 LocalVariableTable: Start Length Slot Name Signature 2 1 0 $i$f$bar I 6 14 1 $i$f$foo I 4 16 0 getString$iv Lkotlin/jvm/functions/Function0; ``` The `getString$iv` local should not be there. It has been inlined away. Leaving it in the local variable table leads to inconsistent locals info. Local 0 contains an int but we declare a local of type Function0. --- .../codegen/inline/defaultMethodUtil.kt | 4 +++- .../ir/FirBlackBoxCodegenTestGenerated.java | 5 +++++ .../codegen/box/coroutines/kt42554.kt | 9 +++++++++ .../function/defaultLambdaInline.kt | 7 +++++++ .../lambdaInlining/genericLambda.kt | 3 --- .../lambdaInlining/simpleGeneric.kt | 3 --- .../jetbrains/kotlin/codegen/D8Checker.java | 20 ++++++++++++++++++- .../codegen/BlackBoxCodegenTestGenerated.java | 5 +++++ .../LightAnalysisModeTestGenerated.java | 5 +++++ .../ir/IrBlackBoxCodegenTestGenerated.java | 5 +++++ .../IrJsCodegenBoxES6TestGenerated.java | 5 +++++ .../IrJsCodegenBoxTestGenerated.java | 5 +++++ .../semantics/JsCodegenBoxTestGenerated.java | 5 +++++ .../IrCodegenBoxWasmTestGenerated.java | 5 +++++ 14 files changed, 78 insertions(+), 8 deletions(-) create mode 100644 compiler/testData/codegen/box/defaultArguments/function/defaultLambdaInline.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/defaultMethodUtil.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/defaultMethodUtil.kt index e4653049b18..f83e2d48305 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/defaultMethodUtil.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/defaultMethodUtil.kt @@ -130,7 +130,9 @@ fun expandMaskConditionsAndUpdateVariableNodes( node.instructions.insert(position, newInsn) } - node.localVariables.removeIf { it.start in toDelete && it.end in toDelete } + node.localVariables.removeIf { + (it.start in toDelete && it.end in toDelete) || defaultLambdas.contains(it.index) + } node.remove(toDelete) diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java index da2726859e0..0ede1cab971 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java @@ -9843,6 +9843,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/defaultArguments/function/covariantOverrideGeneric.kt"); } + @TestMetadata("defaultLambdaInline.kt") + public void testDefaultLambdaInline() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/function/defaultLambdaInline.kt"); + } + @TestMetadata("extensionFunctionManyArgs.kt") public void testExtensionFunctionManyArgs() throws Exception { runTest("compiler/testData/codegen/box/defaultArguments/function/extensionFunctionManyArgs.kt"); diff --git a/compiler/testData/codegen/box/coroutines/kt42554.kt b/compiler/testData/codegen/box/coroutines/kt42554.kt index 24b0dbf609c..9db7f4ff185 100644 --- a/compiler/testData/codegen/box/coroutines/kt42554.kt +++ b/compiler/testData/codegen/box/coroutines/kt42554.kt @@ -1,5 +1,14 @@ // WITH_RUNTIME +// Need to ignore dexing for now. This generates invalid inner-class attributes on the IR backend. +// +// java.lang.AssertionError: D8 dexing error: D8 dexing info: Malformed inner-class attribute: +// outerTypeInternal: C$result$1 +// innerTypeInternal: C$no_name_in_PSI_3d19d79d_1ba9_4cd0_b7f5_b46aa3cd5d40$WhenMappings +// innerName: WhenMappings +// +// IGNORE_DEXING + import kotlin.coroutines.* fun launch(block: suspend () -> String): String { diff --git a/compiler/testData/codegen/box/defaultArguments/function/defaultLambdaInline.kt b/compiler/testData/codegen/box/defaultArguments/function/defaultLambdaInline.kt new file mode 100644 index 00000000000..5ea7219d744 --- /dev/null +++ b/compiler/testData/codegen/box/defaultArguments/function/defaultLambdaInline.kt @@ -0,0 +1,7 @@ +inline fun f(getString: () -> String = { "OK" }) = getString() +inline fun g() { } + +fun box(): String { + g() + return f() +} \ No newline at end of file diff --git a/compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/genericLambda.kt b/compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/genericLambda.kt index f425be21738..9886812a50b 100644 --- a/compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/genericLambda.kt +++ b/compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/genericLambda.kt @@ -1,6 +1,3 @@ -// Enable for dexing once we have a D8 version with a fix for -// https://issuetracker.google.com/148661132 -// IGNORE_DEXING // NO_CHECK_LAMBDA_INLINING // FILE: 1.kt package test diff --git a/compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/simpleGeneric.kt b/compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/simpleGeneric.kt index a12b033da38..8a5c76bffdb 100644 --- a/compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/simpleGeneric.kt +++ b/compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/simpleGeneric.kt @@ -1,6 +1,3 @@ -// Enable for dexing once we have a D8 version with a fix for -// https://issuetracker.google.com/148661132 -// IGNORE_DEXING // FILE: 1.kt // SKIP_INLINE_CHECK_IN: inlineFun$default package test diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/codegen/D8Checker.java b/compiler/tests-common/tests/org/jetbrains/kotlin/codegen/D8Checker.java index c7856c4bc25..e91232a3cbd 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/codegen/D8Checker.java +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/codegen/D8Checker.java @@ -40,9 +40,27 @@ public class D8Checker { }); } + // Compilation with D8 should proceed with no output. There should be no info, warnings, or errors. + static class TestDiagnosticsHandler implements DiagnosticsHandler { + @Override + public void error(Diagnostic diagnostic) { + Assert.fail("D8 dexing error: " + diagnostic.getDiagnosticMessage()); + } + + @Override + public void warning(Diagnostic diagnostic) { + Assert.fail("D8 dexing warning: " + diagnostic.getDiagnosticMessage()); + } + + @Override + public void info(Diagnostic diagnostic) { + Assert.fail("D8 dexing info: " + diagnostic.getDiagnosticMessage()); + } + } + private static void runD8(Consumer addInput) { ProgramConsumer ignoreOutputConsumer = new DexIndexedConsumer.ForwardingConsumer(null); - D8Command.Builder builder = D8Command.builder() + D8Command.Builder builder = D8Command.builder(new TestDiagnosticsHandler()) .setMinApiLevel(28) .setMode(CompilationMode.DEBUG) .setProgramConsumer(ignoreOutputConsumer); diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 2b539076b31..f04fc8ffa0e 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -11243,6 +11243,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/defaultArguments/function/covariantOverrideGeneric.kt"); } + @TestMetadata("defaultLambdaInline.kt") + public void testDefaultLambdaInline() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/function/defaultLambdaInline.kt"); + } + @TestMetadata("extensionFunctionManyArgs.kt") public void testExtensionFunctionManyArgs() throws Exception { runTest("compiler/testData/codegen/box/defaultArguments/function/extensionFunctionManyArgs.kt"); diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index a190e8c247f..2c3efe42faa 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -11243,6 +11243,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/defaultArguments/function/covariantOverrideGeneric.kt"); } + @TestMetadata("defaultLambdaInline.kt") + public void testDefaultLambdaInline() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/function/defaultLambdaInline.kt"); + } + @TestMetadata("extensionFunctionManyArgs.kt") public void testExtensionFunctionManyArgs() throws Exception { runTest("compiler/testData/codegen/box/defaultArguments/function/extensionFunctionManyArgs.kt"); diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 856d146d81d..de8382c8918 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -9843,6 +9843,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/defaultArguments/function/covariantOverrideGeneric.kt"); } + @TestMetadata("defaultLambdaInline.kt") + public void testDefaultLambdaInline() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/function/defaultLambdaInline.kt"); + } + @TestMetadata("extensionFunctionManyArgs.kt") public void testExtensionFunctionManyArgs() throws Exception { runTest("compiler/testData/codegen/box/defaultArguments/function/extensionFunctionManyArgs.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java index ab656bc1582..78071508f99 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java @@ -8353,6 +8353,11 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes runTest("compiler/testData/codegen/box/defaultArguments/function/covariantOverrideGeneric.kt"); } + @TestMetadata("defaultLambdaInline.kt") + public void testDefaultLambdaInline() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/function/defaultLambdaInline.kt"); + } + @TestMetadata("extensionFunctionManyArgs.kt") public void testExtensionFunctionManyArgs() throws Exception { runTest("compiler/testData/codegen/box/defaultArguments/function/extensionFunctionManyArgs.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java index 191c494524a..fdac53b6054 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java @@ -8353,6 +8353,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/defaultArguments/function/covariantOverrideGeneric.kt"); } + @TestMetadata("defaultLambdaInline.kt") + public void testDefaultLambdaInline() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/function/defaultLambdaInline.kt"); + } + @TestMetadata("extensionFunctionManyArgs.kt") public void testExtensionFunctionManyArgs() throws Exception { runTest("compiler/testData/codegen/box/defaultArguments/function/extensionFunctionManyArgs.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index 82fc5e0759a..22d7d2d69cc 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -8353,6 +8353,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/defaultArguments/function/covariantOverrideGeneric.kt"); } + @TestMetadata("defaultLambdaInline.kt") + public void testDefaultLambdaInline() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/function/defaultLambdaInline.kt"); + } + @TestMetadata("extensionFunctionManyArgs.kt") public void testExtensionFunctionManyArgs() throws Exception { runTest("compiler/testData/codegen/box/defaultArguments/function/extensionFunctionManyArgs.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java index 38e97a4ec19..d7532a786f2 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java @@ -4033,6 +4033,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest runTest("compiler/testData/codegen/box/defaultArguments/function/covariantOverrideGeneric.kt"); } + @TestMetadata("defaultLambdaInline.kt") + public void testDefaultLambdaInline() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/function/defaultLambdaInline.kt"); + } + @TestMetadata("extensionFunctionManyArgs.kt") public void testExtensionFunctionManyArgs() throws Exception { runTest("compiler/testData/codegen/box/defaultArguments/function/extensionFunctionManyArgs.kt");