JVM_IR: omit annotations on outer this parameters
This commit is contained in:
+6
-20
@@ -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,
|
||||
|
||||
+1
-1
@@ -20,7 +20,7 @@ class IrCallableMethod(
|
||||
val asmMethod: Method = signature.asmMethod
|
||||
|
||||
val valueParameterTypes: List<Type> =
|
||||
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 "")
|
||||
|
||||
+5
-1
@@ -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()
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND: JVM_IR
|
||||
// TARGET_BACKEND: JVM
|
||||
// FILE: JavaClass.java
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
// SKIP_JDK6
|
||||
// IGNORE_BACKEND: JVM_IR
|
||||
// TARGET_BACKEND: JVM
|
||||
// WITH_RUNTIME
|
||||
// FULL_JDK
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND: JVM_IR
|
||||
// TARGET_BACKEND: JVM
|
||||
|
||||
// WITH_REFLECT
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND: JVM_IR
|
||||
package test
|
||||
|
||||
class Outer {
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND: JVM_IR
|
||||
package test
|
||||
|
||||
class Outer {
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND: JVM_IR
|
||||
package test
|
||||
|
||||
class Outer<T> {
|
||||
|
||||
Reference in New Issue
Block a user