From 432ba62143606e0b71689c49735b03e6662c2689 Mon Sep 17 00:00:00 2001 From: pyos Date: Fri, 4 Oct 2019 12:57:08 +0200 Subject: [PATCH] JVM_IR: omit annotations on outer this parameters --- .../backend/jvm/codegen/FunctionCodegen.kt | 26 +++++-------------- .../backend/jvm/codegen/IrCallableMethod.kt | 2 +- .../jvm/codegen/MethodSignatureMapper.kt | 6 ++++- .../innerNested/innerGenericClassFromJava.kt | 1 - .../box/parametersMetadata/innerClass.kt | 1 - .../call/bound/innerClassConstructor.kt | 1 - .../reflection/call/innerClassConstructor.kt | 1 - .../reflection/mapping/types/constructors.kt | 1 - .../class/InnerClass.kt | 1 - .../class/InnerClassConstructors.kt | 1 - .../class/InnerClassOfGeneric.kt | 1 - 11 files changed, 12 insertions(+), 30 deletions(-) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt index d3a47c597aa..a3c0716a021 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt @@ -76,7 +76,7 @@ open class FunctionCodegen( if (!state.classBuilderMode.generateBodies || flags.and(Opcodes.ACC_ABSTRACT) != 0 || irFunction.isExternal) { generateAnnotationDefaultValueIfNeeded(methodVisitor) } else { - val frameMap = createFrameMapWithReceivers(signature) + val frameMap = createFrameMapWithReceivers() val irClass = context.suspendFunctionContinuations[irFunction] val element = (irFunction.symbol.descriptor.psiElement ?: context.suspendLambdaToOriginalFunctionMap[irFunction.parent]?.symbol?.descriptor?.psiElement) as? KtElement @@ -189,7 +189,7 @@ open class FunctionCodegen( enter(parameter, type) } - private fun createFrameMapWithReceivers(signature: JvmMethodSignature): IrFrameMap { + private fun createFrameMapWithReceivers(): IrFrameMap { val frameMap = IrFrameMap() val functionView = irFunction.getOrCreateSuspendFunctionViewIfNeeded(context) @@ -198,20 +198,9 @@ open class FunctionCodegen( } else if (functionView.dispatchReceiverParameter != null) { frameMap.enterDispatchReceiver(functionView.dispatchReceiverParameter!!) } - - for (parameter in signature.valueParameters) { - if (parameter.kind == JvmMethodParameterKind.RECEIVER) { - val receiverParameter = functionView.extensionReceiverParameter - if (receiverParameter != null) { - frameMap.enter(receiverParameter, classCodegen.typeMapper.mapType(receiverParameter)) - } else { - frameMap.enterTemp(parameter.asmType) - } - } else if (parameter.kind != JvmMethodParameterKind.VALUE) { - frameMap.enterTemp(parameter.asmType) - } + functionView.extensionReceiverParameter?.let { + frameMap.enter(it, classCodegen.typeMapper.mapType(it)) } - for (parameter in functionView.valueParameters) { frameMap.enter(parameter, classCodegen.typeMapper.mapType(parameter.type)) } @@ -247,15 +236,12 @@ fun generateParameterAnnotations( kotlinParameterTypes.forEachIndexed { i, parameterSignature -> val kind = parameterSignature.kind - if (kind.isSkippedInGenericSignature) return@forEachIndexed - val annotated = when (kind) { - JvmMethodParameterKind.VALUE -> iterator.next() JvmMethodParameterKind.RECEIVER -> irFunction.extensionReceiverParameter - else -> null + else -> iterator.next() } - if (annotated != null) { + if (!kind.isSkippedInGenericSignature) { AnnotationCodegen(innerClassConsumer, context) { descriptor, visible -> mv.visitParameterAnnotation( if (AsmUtil.IS_BUILT_WITH_ASM6) i else i - syntheticParameterCount, diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrCallableMethod.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrCallableMethod.kt index e544b24e681..737bd54db8e 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrCallableMethod.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrCallableMethod.kt @@ -20,7 +20,7 @@ class IrCallableMethod( val asmMethod: Method = signature.asmMethod val valueParameterTypes: List = - signature.valueParameters.filter { it.kind == JvmMethodParameterKind.VALUE }.map { it.asmType } + signature.valueParameters.filter { it.kind != JvmMethodParameterKind.RECEIVER }.map { it.asmType } override fun toString(): String = "${Printer.OPCODES[invokeOpcode]} $owner.$asmMethod" + (if (isInterfaceMethod) " (itf)" else "") diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/MethodSignatureMapper.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/MethodSignatureMapper.kt index 6dcb259f64c..12e6f438161 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/MethodSignatureMapper.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/MethodSignatureMapper.kt @@ -224,8 +224,12 @@ class MethodSignatureMapper(private val context: JvmBackendContext) { } for (parameter in function.valueParameters) { + val kind = when (parameter.origin) { + JvmLoweredDeclarationOrigin.FIELD_FOR_OUTER_THIS -> JvmMethodParameterKind.OUTER + else -> JvmMethodParameterKind.VALUE + } val type = if (forceSingleValueParameterBoxing(function.descriptor)) parameter.type.makeNullable() else parameter.type - writeParameter(sw, JvmMethodParameterKind.VALUE, type, function) + writeParameter(sw, kind, type, function) } sw.writeReturnType() diff --git a/compiler/testData/codegen/box/innerNested/innerGenericClassFromJava.kt b/compiler/testData/codegen/box/innerNested/innerGenericClassFromJava.kt index 60609c7822b..3490ee65894 100644 --- a/compiler/testData/codegen/box/innerNested/innerGenericClassFromJava.kt +++ b/compiler/testData/codegen/box/innerNested/innerGenericClassFromJava.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR // TARGET_BACKEND: JVM // FILE: JavaClass.java diff --git a/compiler/testData/codegen/box/parametersMetadata/innerClass.kt b/compiler/testData/codegen/box/parametersMetadata/innerClass.kt index fd7445e0f35..7d6d6cd9ef9 100644 --- a/compiler/testData/codegen/box/parametersMetadata/innerClass.kt +++ b/compiler/testData/codegen/box/parametersMetadata/innerClass.kt @@ -1,5 +1,4 @@ // SKIP_JDK6 -// IGNORE_BACKEND: JVM_IR // TARGET_BACKEND: JVM // WITH_RUNTIME // FULL_JDK diff --git a/compiler/testData/codegen/box/reflection/call/bound/innerClassConstructor.kt b/compiler/testData/codegen/box/reflection/call/bound/innerClassConstructor.kt index 808c90a603e..4cc6189a7a1 100644 --- a/compiler/testData/codegen/box/reflection/call/bound/innerClassConstructor.kt +++ b/compiler/testData/codegen/box/reflection/call/bound/innerClassConstructor.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR // IGNORE_BACKEND: JS_IR // TODO: investigate should it be ran for JS or not // IGNORE_BACKEND: JS, NATIVE diff --git a/compiler/testData/codegen/box/reflection/call/innerClassConstructor.kt b/compiler/testData/codegen/box/reflection/call/innerClassConstructor.kt index 97be8a231b2..287fcec73c1 100644 --- a/compiler/testData/codegen/box/reflection/call/innerClassConstructor.kt +++ b/compiler/testData/codegen/box/reflection/call/innerClassConstructor.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR // IGNORE_BACKEND: JS_IR // TODO: muted automatically, investigate should it be ran for JS or not // IGNORE_BACKEND: JS, NATIVE diff --git a/compiler/testData/codegen/box/reflection/mapping/types/constructors.kt b/compiler/testData/codegen/box/reflection/mapping/types/constructors.kt index 525389ba8b9..9b0784a1cea 100644 --- a/compiler/testData/codegen/box/reflection/mapping/types/constructors.kt +++ b/compiler/testData/codegen/box/reflection/mapping/types/constructors.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR // TARGET_BACKEND: JVM // WITH_REFLECT diff --git a/compiler/testData/compileJavaAgainstKotlin/class/InnerClass.kt b/compiler/testData/compileJavaAgainstKotlin/class/InnerClass.kt index 3eacf3a60f5..647e36c0a79 100644 --- a/compiler/testData/compileJavaAgainstKotlin/class/InnerClass.kt +++ b/compiler/testData/compileJavaAgainstKotlin/class/InnerClass.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR package test class Outer { diff --git a/compiler/testData/compileJavaAgainstKotlin/class/InnerClassConstructors.kt b/compiler/testData/compileJavaAgainstKotlin/class/InnerClassConstructors.kt index 57bfaf4b200..5e72b6867a6 100644 --- a/compiler/testData/compileJavaAgainstKotlin/class/InnerClassConstructors.kt +++ b/compiler/testData/compileJavaAgainstKotlin/class/InnerClassConstructors.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR package test class Outer { diff --git a/compiler/testData/compileJavaAgainstKotlin/class/InnerClassOfGeneric.kt b/compiler/testData/compileJavaAgainstKotlin/class/InnerClassOfGeneric.kt index f4e5a3b4308..7f4718e12f8 100644 --- a/compiler/testData/compileJavaAgainstKotlin/class/InnerClassOfGeneric.kt +++ b/compiler/testData/compileJavaAgainstKotlin/class/InnerClassOfGeneric.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR package test class Outer {