From 970d6f683434157941c5633e64da8c4155b91536 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Mon, 1 Feb 2016 18:45:41 +0100 Subject: [PATCH] generate local variables table for @JvmOverloads-generated methods #KT-7319 Fixed --- .../DefaultParameterValueSubstitutor.kt | 12 ++++++++++++ .../kotlin/codegen/FunctionCodegen.java | 19 ++++++++++++++++--- .../nullabilityAnnotations/JvmOverloads.java | 4 ++-- .../checkLocalVariablesTable/jvmOverloads.kt | 7 +++++++ ...CheckLocalVariablesTableTestGenerated.java | 6 ++++++ 5 files changed, 43 insertions(+), 5 deletions(-) create mode 100644 compiler/testData/checkLocalVariablesTable/jvmOverloads.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/DefaultParameterValueSubstitutor.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/DefaultParameterValueSubstitutor.kt index 87606e4c7d6..dde5a08be7d 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/DefaultParameterValueSubstitutor.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/DefaultParameterValueSubstitutor.kt @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.hasDefaultValue import org.jetbrains.kotlin.resolve.jvm.AsmTypes import org.jetbrains.kotlin.resolve.jvm.annotations.hasJvmOverloadsAnnotation import org.jetbrains.kotlin.resolve.jvm.diagnostics.OtherOrigin +import org.jetbrains.org.objectweb.asm.Label import org.jetbrains.org.objectweb.asm.Opcodes import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter @@ -134,6 +135,7 @@ class DefaultParameterValueSubstitutor(val state: GenerationState) { } if (state.classBuilderMode == ClassBuilderMode.LIGHT_CLASSES) { + FunctionCodegen.generateLocalVariablesForParameters(mv, signature, null, Label(), Label(), remainingParameters, isStatic) mv.visitEnd() return } @@ -142,6 +144,9 @@ class DefaultParameterValueSubstitutor(val state: GenerationState) { val v = InstructionAdapter(mv) mv.visitCode() + val methodBegin = Label() + mv.visitLabel(methodBegin) + val methodOwner = typeMapper.mapToCallableMethod(delegateFunctionDescriptor, false).owner if (!isStatic) { val thisIndex = frameMap.enterTemp(AsmTypes.OBJECT_TYPE) @@ -201,6 +206,13 @@ class DefaultParameterValueSubstitutor(val state: GenerationState) { v.invokestatic(methodOwner.internalName, defaultMethod.name, defaultMethod.descriptor, false) } v.areturn(signature.returnType) + + val methodEnd = Label() + mv.visitLabel(methodEnd) + + FunctionCodegen.generateLocalVariablesForParameters(mv, signature, null, methodBegin, methodEnd, + remainingParameters, isStatic) + FunctionCodegen.endVisit(mv, null, methodElement) } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java index a429b504c3a..1a336b368ac 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java @@ -400,11 +400,24 @@ public class FunctionCodegen { @NotNull Label methodEnd, @NotNull OwnerKind ownerKind ) { - Iterator valueParameters = functionDescriptor.getValueParameters().iterator(); + generateLocalVariablesForParameters(mv, jvmMethodSignature, thisType, methodBegin, methodEnd, + functionDescriptor.getValueParameters(), + AsmUtil.isStaticMethod(ownerKind, functionDescriptor)); + } + + public static void generateLocalVariablesForParameters( + @NotNull MethodVisitor mv, + @NotNull JvmMethodSignature jvmMethodSignature, + @Nullable Type thisType, + @NotNull Label methodBegin, + @NotNull Label methodEnd, + Collection valueParameters, + boolean isStatic + ) { + Iterator valueParameterIterator = valueParameters.iterator(); List params = jvmMethodSignature.getValueParameters(); int shift = 0; - boolean isStatic = AsmUtil.isStaticMethod(ownerKind, functionDescriptor); if (!isStatic) { //add this if (thisType != null) { @@ -422,7 +435,7 @@ public class FunctionCodegen { String parameterName; if (kind == JvmMethodParameterKind.VALUE) { - ValueParameterDescriptor parameter = valueParameters.next(); + ValueParameterDescriptor parameter = valueParameterIterator.next(); parameterName = parameter.getName().asString(); } else { diff --git a/compiler/testData/asJava/lightClasses/nullabilityAnnotations/JvmOverloads.java b/compiler/testData/asJava/lightClasses/nullabilityAnnotations/JvmOverloads.java index 82eaf50d61a..8faae74ef77 100644 --- a/compiler/testData/asJava/lightClasses/nullabilityAnnotations/JvmOverloads.java +++ b/compiler/testData/asJava/lightClasses/nullabilityAnnotations/JvmOverloads.java @@ -5,11 +5,11 @@ public final class C { @kotlin.jvm.JvmOverloads @org.jetbrains.annotations.NotNull - public java.lang.String foo(@org.jetbrains.annotations.NotNull java.lang.String p, @org.jetbrains.annotations.NotNull java.lang.String p1, @org.jetbrains.annotations.Nullable java.lang.String p2) { /* compiled code */ } + public java.lang.String foo(@org.jetbrains.annotations.NotNull java.lang.String o, @org.jetbrains.annotations.NotNull java.lang.String o1, @org.jetbrains.annotations.Nullable java.lang.String o4) { /* compiled code */ } @kotlin.jvm.JvmOverloads @org.jetbrains.annotations.NotNull - public java.lang.String foo(@org.jetbrains.annotations.NotNull java.lang.String p, @org.jetbrains.annotations.Nullable java.lang.String p1) { /* compiled code */ } + public java.lang.String foo(@org.jetbrains.annotations.NotNull java.lang.String o1, @org.jetbrains.annotations.Nullable java.lang.String o4) { /* compiled code */ } public C() { /* compiled code */ } } \ No newline at end of file diff --git a/compiler/testData/checkLocalVariablesTable/jvmOverloads.kt b/compiler/testData/checkLocalVariablesTable/jvmOverloads.kt new file mode 100644 index 00000000000..88bc6135abb --- /dev/null +++ b/compiler/testData/checkLocalVariablesTable/jvmOverloads.kt @@ -0,0 +1,7 @@ +class C { + @kotlin.jvm.JvmOverloads fun foo(firstParam: Int, secondParam: String = "") { + } +} + +// METHOD : C.foo(I)V +// VARIABLE : NAME=firstParam TYPE=I INDEX=1 diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/CheckLocalVariablesTableTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/CheckLocalVariablesTableTestGenerated.java index c1a82391d07..06c9d1b93e8 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/CheckLocalVariablesTableTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/CheckLocalVariablesTableTestGenerated.java @@ -83,6 +83,12 @@ public class CheckLocalVariablesTableTestGenerated extends AbstractCheckLocalVar doTest(fileName); } + @TestMetadata("jvmOverloads.kt") + public void testJvmOverloads() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/checkLocalVariablesTable/jvmOverloads.kt"); + doTest(fileName); + } + @TestMetadata("lambdaAsVar.kt") public void testLambdaAsVar() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/checkLocalVariablesTable/lambdaAsVar.kt");