[JVM IR] Do not put destructuring params or underscores in LVT.

Putting them in the local variable table means that the debugger
needs to have special handling for parameters with specific names.
That forces us to generate mangled names for these.

Instead of also implementing the name mangling for FIR, this
change gets rid of the parameters from the LVT instead.
This commit is contained in:
Mads Ager
2021-10-28 11:44:02 +02:00
committed by Dmitry Petrov
parent 1b4ee63f30
commit 6622846bc1
21 changed files with 119 additions and 64 deletions
@@ -65,7 +65,7 @@ open class JvmIrCodegenFactory(
if (externalSymbolTable != null) externalMangler!! to externalSymbolTable if (externalSymbolTable != null) externalMangler!! to externalSymbolTable
else { else {
val mangler = JvmDescriptorMangler(MainFunctionDetector(input.bindingContext, input.languageVersionSettings)) val mangler = JvmDescriptorMangler(MainFunctionDetector(input.bindingContext, input.languageVersionSettings))
val symbolTable = SymbolTable(JvmIdSignatureDescriptor(mangler), IrFactoryImpl, JvmNameProvider) val symbolTable = SymbolTable(JvmIdSignatureDescriptor(mangler), IrFactoryImpl)
mangler to symbolTable mangler to symbolTable
} }
val psi2ir = Psi2IrTranslator(input.languageVersionSettings, Psi2IrConfiguration(input.ignoreErrors)) val psi2ir = Psi2IrTranslator(input.languageVersionSettings, Psi2IrConfiguration(input.ignoreErrors))
@@ -178,7 +178,7 @@ private class SuspendLambdaLowering(context: JvmBackendContext) : SuspendLowerin
isFinal = false isFinal = false
visibility = if (it.index < 0) DescriptorVisibilities.PRIVATE else JavaDescriptorVisibilities.PACKAGE_VISIBILITY visibility = if (it.index < 0) DescriptorVisibilities.PRIVATE else JavaDescriptorVisibilities.PACKAGE_VISIBILITY
} else null } else null
ParameterInfo(field, it.type, it.name) ParameterInfo(field, it.type, it.name, it.origin)
} }
context.continuationClassesVarsCountByType[attributeOwnerId] = varsCountByType context.continuationClassesVarsCountByType[attributeOwnerId] = varsCountByType
@@ -219,7 +219,7 @@ private class SuspendLambdaLowering(context: JvmBackendContext) : SuspendLowerin
parent = this, parent = this,
startOffset = UNDEFINED_OFFSET, startOffset = UNDEFINED_OFFSET,
endOffset = UNDEFINED_OFFSET, endOffset = UNDEFINED_OFFSET,
origin = IrDeclarationOrigin.DEFINED, origin = param.origin,
name = param.name, name = param.name,
type = param.type type = param.type
).apply { ).apply {
@@ -353,6 +353,6 @@ private class SuspendLambdaLowering(context: JvmBackendContext) : SuspendLowerin
} }
} }
private data class ParameterInfo(val field: IrField?, val type: IrType, val name: Name) { private data class ParameterInfo(val field: IrField?, val type: IrType, val name: Name, val origin: IrDeclarationOrigin) {
val isUsed = field != null val isUsed = field != null
} }
@@ -1,32 +0,0 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.backend.jvm
import org.jetbrains.kotlin.codegen.getNameForDestructuredParameterOrNull
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
import org.jetbrains.kotlin.ir.util.NameProvider
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.KtParameter
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
import org.jetbrains.kotlin.resolve.calls.util.isSingleUnderscore
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
object JvmNameProvider : NameProvider {
override fun nameForDeclaration(descriptor: DeclarationDescriptor): Name {
if (descriptor is ValueParameterDescriptor)
return nameForValueParameter(descriptor)
return NameProvider.DEFAULT.nameForDeclaration(descriptor)
}
private fun nameForValueParameter(descriptor: ValueParameterDescriptor): Name {
getNameForDestructuredParameterOrNull(descriptor)?.let { return Name.identifier(it) }
if (DescriptorToSourceUtils.getSourceFromDescriptor(descriptor)?.safeAs<KtParameter>()?.isSingleUnderscore == true) {
return Name.identifier("\$noName_${descriptor.index}")
}
return descriptor.name
}
}
@@ -347,6 +347,8 @@ class ExpressionCodegen(
} }
private fun writeValueParameterInLocalVariableTable(param: IrValueParameter, startLabel: Label, endLabel: Label, isReceiver: Boolean) { private fun writeValueParameterInLocalVariableTable(param: IrValueParameter, startLabel: Label, endLabel: Label, isReceiver: Boolean) {
if (!param.isVisibleInLVT) return
// If the parameter is an extension receiver parameter or a captured extension receiver from enclosing, // If the parameter is an extension receiver parameter or a captured extension receiver from enclosing,
// then generate name accordingly. // then generate name accordingly.
val name = if (param.origin == BOUND_RECEIVER_PARAMETER || isReceiver) { val name = if (param.origin == BOUND_RECEIVER_PARAMETER || isReceiver) {
@@ -389,9 +391,13 @@ class ExpressionCodegen(
return value return value
} }
private val IrVariable.isVisibleInLVT: Boolean // Temporary variables, unnamed (underscore) parameters, and the object for destruction
// in a destructuring assignment for lambda parameters do not go in the local variable table.
private val IrValueDeclaration.isVisibleInLVT: Boolean
get() = origin != IrDeclarationOrigin.IR_TEMPORARY_VARIABLE && get() = origin != IrDeclarationOrigin.IR_TEMPORARY_VARIABLE &&
origin != IrDeclarationOrigin.FOR_LOOP_ITERATOR origin != IrDeclarationOrigin.FOR_LOOP_ITERATOR &&
origin != IrDeclarationOrigin.UNDERSCORE_PARAMETER &&
origin != IrDeclarationOrigin.DESTRUCTURED_OBJECT_PARAMETER
private fun writeLocalVariablesInTable(info: BlockInfo, endLabel: Label) { private fun writeLocalVariablesInTable(info: BlockInfo, endLabel: Label) {
info.variables.forEach { info.variables.forEach {
@@ -30,6 +30,7 @@ import org.jetbrains.kotlin.psi2ir.isConstructorDelegatingToSuper
import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
import org.jetbrains.kotlin.resolve.calls.util.getResolvedCall import org.jetbrains.kotlin.resolve.calls.util.getResolvedCall
import org.jetbrains.kotlin.resolve.calls.util.isSingleUnderscore
import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluator import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluator
import org.jetbrains.kotlin.resolve.descriptorUtil.isAnnotationConstructor import org.jetbrains.kotlin.resolve.descriptorUtil.isAnnotationConstructor
import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyExternal import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyExternal
@@ -376,15 +377,24 @@ class FunctionGenerator(declarationGenerator: DeclarationGenerator) : Declaratio
ktElement: KtPureElement?, ktElement: KtPureElement?,
irOwnerElement: IrElement, irOwnerElement: IrElement,
name: Name? = null name: Name? = null
) = ): IrValueParameter {
context.symbolTable.declareValueParameter( var origin: IrDeclarationOrigin = IrDeclarationOrigin.DEFINED
if (ktElement is KtParameter) {
if (ktElement.isSingleUnderscore) {
origin = IrDeclarationOrigin.UNDERSCORE_PARAMETER
} else if (ktElement.destructuringDeclaration != null) {
origin = IrDeclarationOrigin.DESTRUCTURED_OBJECT_PARAMETER
}
}
return context.symbolTable.declareValueParameter(
ktElement?.pureStartOffset ?: irOwnerElement.startOffset, ktElement?.pureStartOffset ?: irOwnerElement.startOffset,
ktElement?.pureEndOffset ?: irOwnerElement.endOffset, ktElement?.pureEndOffset ?: irOwnerElement.endOffset,
IrDeclarationOrigin.DEFINED, origin,
descriptor, descriptor.type.toIrType(), descriptor, descriptor.type.toIrType(),
(descriptor as? ValueParameterDescriptor)?.varargElementType?.toIrType(), (descriptor as? ValueParameterDescriptor)?.varargElementType?.toIrType(),
name name
) )
}
private fun generateDefaultAnnotationParameterValue( private fun generateDefaultAnnotationParameterValue(
valueExpression: KtExpression, valueExpression: KtExpression,
@@ -52,6 +52,8 @@ interface IrDeclarationOrigin {
object LOCAL_FUNCTION : IrDeclarationOriginImpl("LOCAL_FUNCTION") object LOCAL_FUNCTION : IrDeclarationOriginImpl("LOCAL_FUNCTION")
object LOCAL_FUNCTION_FOR_LAMBDA : IrDeclarationOriginImpl("LOCAL_FUNCTION_FOR_LAMBDA") object LOCAL_FUNCTION_FOR_LAMBDA : IrDeclarationOriginImpl("LOCAL_FUNCTION_FOR_LAMBDA")
object CATCH_PARAMETER : IrDeclarationOriginImpl("CATCH_PARAMETER") object CATCH_PARAMETER : IrDeclarationOriginImpl("CATCH_PARAMETER")
object UNDERSCORE_PARAMETER : IrDeclarationOriginImpl("UNDERSCORE_PARAMETER")
object DESTRUCTURED_OBJECT_PARAMETER : IrDeclarationOriginImpl("DESTRUCTURED_OBJECT_PARAMETER")
object INSTANCE_RECEIVER : IrDeclarationOriginImpl("INSTANCE_RECEIVER") object INSTANCE_RECEIVER : IrDeclarationOriginImpl("INSTANCE_RECEIVER")
object PRIMARY_CONSTRUCTOR_PARAMETER : IrDeclarationOriginImpl("PRIMARY_CONSTRUCTOR_PARAMETER") object PRIMARY_CONSTRUCTOR_PARAMETER : IrDeclarationOriginImpl("PRIMARY_CONSTRUCTOR_PARAMETER")
object IR_TEMPORARY_VARIABLE : IrDeclarationOriginImpl("IR_TEMPORARY_VARIABLE") object IR_TEMPORARY_VARIABLE : IrDeclarationOriginImpl("IR_TEMPORARY_VARIABLE")
@@ -10,4 +10,6 @@ fun box() {
// VARIABLE : NAME=x TYPE=Ljava/lang/String; INDEX=2 // VARIABLE : NAME=x TYPE=Ljava/lang/String; INDEX=2
// VARIABLE : NAME=y TYPE=I INDEX=3 // VARIABLE : NAME=y TYPE=I INDEX=3
// VARIABLE : NAME=this TYPE=LDestructuringInLambdasKt$box$1; INDEX=0 // VARIABLE : NAME=this TYPE=LDestructuringInLambdasKt$box$1; INDEX=0
// VARIABLE : NAME=$dstr$x$y TYPE=LA; INDEX=1
// JVM_TEMPLATES
// VARIABLE : NAME=$dstr$x$y TYPE=LA; INDEX=1
@@ -13,8 +13,15 @@ suspend fun foo(data: Data, body: suspend (Data) -> Unit) {
// METHOD : DataClassKt$test$2.invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; // METHOD : DataClassKt$test$2.invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
// JVM_TEMPLATES
// VARIABLE : NAME=$dstr$x_param$y_param TYPE=LData; INDEX=2 // VARIABLE : NAME=$dstr$x_param$y_param TYPE=LData; INDEX=2
// VARIABLE : NAME=x_param TYPE=Ljava/lang/String; INDEX=3 // VARIABLE : NAME=x_param TYPE=Ljava/lang/String; INDEX=3
// VARIABLE : NAME=y_param TYPE=I INDEX=4 // VARIABLE : NAME=y_param TYPE=I INDEX=4
// VARIABLE : NAME=this TYPE=LDataClassKt$test$2; INDEX=0 // VARIABLE : NAME=this TYPE=LDataClassKt$test$2; INDEX=0
// VARIABLE : NAME=$result TYPE=Ljava/lang/Object; INDEX=1 // VARIABLE : NAME=$result TYPE=Ljava/lang/Object; INDEX=1
// JVM_IR_TEMPLATES
// VARIABLE : NAME=x_param TYPE=Ljava/lang/String; INDEX=3
// VARIABLE : NAME=y_param TYPE=I INDEX=4
// VARIABLE : NAME=this TYPE=LDataClassKt$test$2; INDEX=0
// VARIABLE : NAME=$result TYPE=Ljava/lang/Object; INDEX=1
@@ -33,7 +33,6 @@ suspend fun test() = B.bar()
// JVM_IR_TEMPLATES // JVM_IR_TEMPLATES
// METHOD : ExtensionComponentsKt$bar$2.invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; // METHOD : ExtensionComponentsKt$bar$2.invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
// VARIABLE : NAME=$dstr$x_param$y_param$z_param TYPE=LA; INDEX=2
// VARIABLE : NAME=x_param TYPE=Ljava/lang/String; INDEX=2 // VARIABLE : NAME=x_param TYPE=Ljava/lang/String; INDEX=2
// VARIABLE : NAME=y_param TYPE=Ljava/lang/String; INDEX=3 // VARIABLE : NAME=y_param TYPE=Ljava/lang/String; INDEX=3
// VARIABLE : NAME=z_param TYPE=I INDEX=4 // VARIABLE : NAME=z_param TYPE=I INDEX=4
@@ -10,8 +10,15 @@ suspend fun test() = foo(A("OK", 1)) { (x_param, y_param) ->
// METHOD : GenericKt$test$2.invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; // METHOD : GenericKt$test$2.invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
// JVM_TEMPLATES
// VARIABLE : NAME=$dstr$x_param$y_param TYPE=LA; INDEX=2 // VARIABLE : NAME=$dstr$x_param$y_param TYPE=LA; INDEX=2
// VARIABLE : NAME=x_param TYPE=Ljava/lang/String; INDEX=3 // VARIABLE : NAME=x_param TYPE=Ljava/lang/String; INDEX=3
// VARIABLE : NAME=y_param TYPE=I INDEX=4 // VARIABLE : NAME=y_param TYPE=I INDEX=4
// VARIABLE : NAME=this TYPE=LGenericKt$test$2; INDEX=0 // VARIABLE : NAME=this TYPE=LGenericKt$test$2; INDEX=0
// VARIABLE : NAME=$result TYPE=Ljava/lang/Object; INDEX=1 // VARIABLE : NAME=$result TYPE=Ljava/lang/Object; INDEX=1
// JVM_IR_TEMPLATES
// VARIABLE : NAME=x_param TYPE=Ljava/lang/String; INDEX=3
// VARIABLE : NAME=y_param TYPE=I INDEX=4
// VARIABLE : NAME=this TYPE=LGenericKt$test$2; INDEX=0
// VARIABLE : NAME=$result TYPE=Ljava/lang/Object; INDEX=1
@@ -9,11 +9,21 @@ suspend fun test() = foo(A("O", "K")) { (x_param, y_param) -> x_param + y_param
// TODO: Fix this after other issues in inlining suspend lambdas are resolved. // TODO: Fix this after other issues in inlining suspend lambdas are resolved.
// METHOD : InlineKt.test(Lkotlin/coroutines/Continuation;)Ljava/lang/Object; // METHOD : InlineKt.test(Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
// VARIABLE : NAME=x_param TYPE=Ljava/lang/String; INDEX=6 // VARIABLE : NAME=x_param TYPE=Ljava/lang/String; INDEX=6
// VARIABLE : NAME=y_param TYPE=Ljava/lang/String; INDEX=7 // VARIABLE : NAME=y_param TYPE=Ljava/lang/String; INDEX=7
// JVM_TEMPLATES
// VARIABLE : NAME=$dstr$x_param$y_param TYPE=LA; INDEX=4 // VARIABLE : NAME=$dstr$x_param$y_param TYPE=LA; INDEX=4
// VARIABLE : NAME=continuation TYPE=Lkotlin/coroutines/Continuation; INDEX=3 // VARIABLE : NAME=continuation TYPE=Lkotlin/coroutines/Continuation; INDEX=3
// VARIABLE : NAME=$i$a$-foo-InlineKt$test$2 TYPE=I INDEX=5 // VARIABLE : NAME=$i$a$-foo-InlineKt$test$2 TYPE=I INDEX=5
// VARIABLE : NAME=a$iv TYPE=LA; INDEX=1 // VARIABLE : NAME=a$iv TYPE=LA; INDEX=1
// VARIABLE : NAME=$i$f$foo TYPE=I INDEX=2 // VARIABLE : NAME=$i$f$foo TYPE=I INDEX=2
// VARIABLE : NAME=$completion TYPE=Lkotlin/coroutines/Continuation; INDEX=0 // VARIABLE : NAME=$completion TYPE=Lkotlin/coroutines/Continuation; INDEX=0
// JVM_IR_TEMPLATES
// VARIABLE : NAME=continuation TYPE=Lkotlin/coroutines/Continuation; INDEX=3
// VARIABLE : NAME=$i$a$-foo-InlineKt$test$2 TYPE=I INDEX=5
// VARIABLE : NAME=a$iv TYPE=LA; INDEX=1
// VARIABLE : NAME=$i$f$foo TYPE=I INDEX=2
// VARIABLE : NAME=$completion TYPE=Lkotlin/coroutines/Continuation; INDEX=0
@@ -10,9 +10,18 @@ suspend fun test() = foo(A("O", "K")) { i_param, (x_param, y_param), v_param ->
// METHOD : OtherParametersKt$test$2.invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; // METHOD : OtherParametersKt$test$2.invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
// VARIABLE : NAME=i_param TYPE=I INDEX=2 // VARIABLE : NAME=i_param TYPE=I INDEX=2
// JVM_TEMPLATES
// VARIABLE : NAME=$dstr$x_param$y_param TYPE=LA; INDEX=3 // VARIABLE : NAME=$dstr$x_param$y_param TYPE=LA; INDEX=3
// VARIABLE : NAME=v_param TYPE=Ljava/lang/String; INDEX=4 // VARIABLE : NAME=v_param TYPE=Ljava/lang/String; INDEX=4
// VARIABLE : NAME=x_param TYPE=Ljava/lang/String; INDEX=5 // VARIABLE : NAME=x_param TYPE=Ljava/lang/String; INDEX=5
// VARIABLE : NAME=y_param TYPE=Ljava/lang/String; INDEX=6 // VARIABLE : NAME=y_param TYPE=Ljava/lang/String; INDEX=6
// VARIABLE : NAME=this TYPE=LOtherParametersKt$test$2; INDEX=0 // VARIABLE : NAME=this TYPE=LOtherParametersKt$test$2; INDEX=0
// VARIABLE : NAME=$result TYPE=Ljava/lang/Object; INDEX=1 // VARIABLE : NAME=$result TYPE=Ljava/lang/Object; INDEX=1
// JVM_IR_TEMPLATES
// VARIABLE : NAME=v_param TYPE=Ljava/lang/String; INDEX=4
// VARIABLE : NAME=x_param TYPE=Ljava/lang/String; INDEX=5
// VARIABLE : NAME=y_param TYPE=Ljava/lang/String; INDEX=6
// VARIABLE : NAME=this TYPE=LOtherParametersKt$test$2; INDEX=0
// VARIABLE : NAME=$result TYPE=Ljava/lang/Object; INDEX=1
@@ -26,11 +26,10 @@ suspend fun foo(data: Data, body: suspend Long.(String, Data, Int) -> Unit) {
// VARIABLE : NAME=$result TYPE=Ljava/lang/Object; INDEX=1 // VARIABLE : NAME=$result TYPE=Ljava/lang/Object; INDEX=1
// JVM_IR_TEMPLATES // JVM_IR_TEMPLATES
// VARIABLE : NAME=$dstr$x$_u24__u24$z TYPE=LData; INDEX=*
// VARIABLE : NAME=$result TYPE=Ljava/lang/Object; INDEX=* // VARIABLE : NAME=$result TYPE=Ljava/lang/Object; INDEX=*
// VARIABLE : NAME=$this$foo TYPE=J INDEX=* // VARIABLE : NAME=$this$foo TYPE=J INDEX=*
// VARIABLE : NAME=i TYPE=I INDEX=* // VARIABLE : NAME=i TYPE=I INDEX=*
// VARIABLE : NAME=str TYPE=Ljava/lang/String; INDEX=* // VARIABLE : NAME=str TYPE=Ljava/lang/String; INDEX=*
// VARIABLE : NAME=this TYPE=LParametersKt$test$2; INDEX=* // VARIABLE : NAME=this TYPE=LParametersKt$test$2; INDEX=*
// VARIABLE : NAME=x TYPE=Ljava/lang/String; INDEX=* // VARIABLE : NAME=x TYPE=Ljava/lang/String; INDEX=*
// VARIABLE : NAME=z TYPE=I INDEX=* // VARIABLE : NAME=z TYPE=I INDEX=*
@@ -29,6 +29,11 @@ fun box() {
// VARIABLE : NAME=c TYPE=C INDEX=9 // VARIABLE : NAME=c TYPE=C INDEX=9
// VARIABLE : NAME=a TYPE=D INDEX=7 // VARIABLE : NAME=a TYPE=D INDEX=7
// VARIABLE : NAME=this TYPE=LUnderscoreNamesKt$box$1; INDEX=0 // VARIABLE : NAME=this TYPE=LUnderscoreNamesKt$box$1; INDEX=0
// JVM_TEMPLATES
// VARIABLE : NAME=$dstr$x$_u24__u24$y TYPE=LA; INDEX=1 // VARIABLE : NAME=$dstr$x$_u24__u24$y TYPE=LA; INDEX=1
// VARIABLE : NAME=$noName_1 TYPE=Ljava/lang/String; INDEX=2 // VARIABLE : NAME=$noName_1 TYPE=Ljava/lang/String; INDEX=2
// VARIABLE : NAME=w TYPE=I INDEX=3 // VARIABLE : NAME=w TYPE=I INDEX=3
// JVM_IR_TEMPLATES
// VARIABLE : NAME=w TYPE=I INDEX=3
@@ -116,7 +116,7 @@ final class MangledNamesKt$foo$1 : kotlin/jvm/internal/Lambda, kotlin/jvm/functi
0 this: LMangledNamesKt$foo$1; 0 this: LMangledNamesKt$foo$1;
} }
public final void invoke(Arr $dstr$a_u20b$b_u24c$c_u2dd$b_u24_u24c_u2d_u2dd$a_u28_u29§_u26_u2a_u26_u5e_u40あ化) { public final void invoke(Arr p0) {
Local variables: Local variables:
2 a b: I 2 a b: I
3 b$c: I 3 b$c: I
@@ -124,7 +124,6 @@ final class MangledNamesKt$foo$1 : kotlin/jvm/internal/Lambda, kotlin/jvm/functi
5 b$$c--d: I 5 b$$c--d: I
6 a()§&*&^@あ化: I 6 a()§&*&^@あ化: I
0 this: LMangledNamesKt$foo$1; 0 this: LMangledNamesKt$foo$1;
1 $dstr$a_u20b$b_u24c$c_u2dd$b_u24_u24c_u2d_u2dd$a_u28_u29§_u26_u2a_u26_u5e_u40あ化: LArr;
} }
public java.lang.Object invoke(java.lang.Object p1) { public java.lang.Object invoke(java.lang.Object p1) {
@@ -13,7 +13,13 @@ fun box() {
// test.kt:3 <init>: x:java.lang.String="O":java.lang.String, y:int=123:int // test.kt:3 <init>: x:java.lang.String="O":java.lang.String, y:int=123:int
// test.kt:8 box: // test.kt:8 box:
// test.kt:5 foo: a:A=A, block:kotlin.jvm.functions.Function1=TestKt$box$1 // test.kt:5 foo: a:A=A, block:kotlin.jvm.functions.Function1=TestKt$box$1
// EXPECTATIONS JVM
// test.kt:8 invoke: $dstr$x$y:A=A // test.kt:8 invoke: $dstr$x$y:A=A
// EXPECTATIONS JVM_IR
// test.kt:8 invoke:
// EXPECTATIONS
// test.kt:5 foo: a:A=A, block:kotlin.jvm.functions.Function1=TestKt$box$1 // test.kt:5 foo: a:A=A, block:kotlin.jvm.functions.Function1=TestKt$box$1
// test.kt:8 box: // test.kt:8 box:
// test.kt:9 box: // test.kt:9 box:
@@ -19,15 +19,20 @@ suspend fun box() = foo(A()) { (x_param, _, y_param) ->
// test.kt:12 box: $completion:kotlin.coroutines.Continuation=Generated_Box_MainKt$main$1 // test.kt:12 box: $completion:kotlin.coroutines.Continuation=Generated_Box_MainKt$main$1
// test.kt:10 foo: a:A=A, block:kotlin.jvm.functions.Function2=TestKt$box$2, $completion:kotlin.coroutines.Continuation=Generated_Box_MainKt$main$1 // test.kt:10 foo: a:A=A, block:kotlin.jvm.functions.Function2=TestKt$box$2, $completion:kotlin.coroutines.Continuation=Generated_Box_MainKt$main$1
// test.kt:5 component1: // test.kt:5 component1:
// EXPECTATIONS JVM
// test.kt:12 invokeSuspend: $result:java.lang.Object=kotlin.Unit, $dstr$x_param$_u24__u24$y_param:A=A // test.kt:12 invokeSuspend: $result:java.lang.Object=kotlin.Unit, $dstr$x_param$_u24__u24$y_param:A=A
// EXPECTATIONS JVM_IR
// test.kt:12 invokeSuspend: $result:java.lang.Object=kotlin.Unit
// EXPECTATIONS
// test.kt:7 component3: // test.kt:7 component3:
// EXPECTATIONS JVM_IR // EXPECTATIONS JVM_IR
// test.kt:12 invokeSuspend: $result:java.lang.Object=kotlin.Unit, $dstr$x_param$_u24__u24$y_param:A=A, x_param:java.lang.String="O":java.lang.String // test.kt:12 invokeSuspend: $result:java.lang.Object=kotlin.Unit, x_param:java.lang.String="O":java.lang.String
// test.kt:13 invokeSuspend: $result:java.lang.Object=kotlin.Unit, x_param:java.lang.String="O":java.lang.String, y_param:java.lang.String="K":java.lang.String
// EXPECTATIONS JVM // EXPECTATIONS JVM
// test.kt:12 invokeSuspend: $result:java.lang.Object=kotlin.Unit, $dstr$x_param$_u24__u24$y_param:A=A // test.kt:12 invokeSuspend: $result:java.lang.Object=kotlin.Unit, $dstr$x_param$_u24__u24$y_param:A=A
// EXPECTATIONS
// test.kt:13 invokeSuspend: $result:java.lang.Object=kotlin.Unit, $dstr$x_param$_u24__u24$y_param:A=A, x_param:java.lang.String="O":java.lang.String, y_param:java.lang.String="K":java.lang.String // test.kt:13 invokeSuspend: $result:java.lang.Object=kotlin.Unit, $dstr$x_param$_u24__u24$y_param:A=A, x_param:java.lang.String="O":java.lang.String, y_param:java.lang.String="K":java.lang.String
// EXPECTATIONS JVM_IR // EXPECTATIONS JVM_IR
+23 -2
View File
@@ -30,21 +30,42 @@ fun box() {
// test.kt:6 foo: a:A=A, block:kotlin.jvm.functions.Function3=TestKt$box$1 // test.kt:6 foo: a:A=A, block:kotlin.jvm.functions.Function3=TestKt$box$1
// EXPECTATIONS JVM_IR // EXPECTATIONS JVM_IR
// test.kt:13 invoke: $dstr$x$_u24__u24$y:A=A, $noName_1:java.lang.String="":java.lang.String, w:int=1:int // test.kt:13 invoke: w:int=1:int
// test.kt:15 invoke: $dstr$x$_u24__u24$y:A=A, $noName_1:java.lang.String="":java.lang.String, w:int=1:int, x:double=1.0:double, y:char=0:char // test.kt:15 invoke: w:int=1:int, x:double=1.0:double, y:char=0:char
// EXPECTATIONS JVM // EXPECTATIONS JVM
// test.kt:15 invoke: $dstr$x$_u24__u24$y:A=A, $noName_1:java.lang.String="":java.lang.String, w:int=1:int // test.kt:15 invoke: $dstr$x$_u24__u24$y:A=A, $noName_1:java.lang.String="":java.lang.String, w:int=1:int
// EXPECTATIONS // EXPECTATIONS
// test.kt:4 <init>: x:double=1.0:double, y:java.lang.String="":java.lang.String, z:char=0:char // test.kt:4 <init>: x:double=1.0:double, y:java.lang.String="":java.lang.String, z:char=0:char
// EXPECTATIONS JVM
// test.kt:15 invoke: $dstr$x$_u24__u24$y:A=A, $noName_1:java.lang.String="":java.lang.String, w:int=1:int, x:double=1.0:double, y:char=0:char // test.kt:15 invoke: $dstr$x$_u24__u24$y:A=A, $noName_1:java.lang.String="":java.lang.String, w:int=1:int, x:double=1.0:double, y:char=0:char
// test.kt:16 invoke: $dstr$x$_u24__u24$y:A=A, $noName_1:java.lang.String="":java.lang.String, w:int=1:int, x:double=1.0:double, y:char=0:char, a:double=1.0:double, c:char=0:char // test.kt:16 invoke: $dstr$x$_u24__u24$y:A=A, $noName_1:java.lang.String="":java.lang.String, w:int=1:int, x:double=1.0:double, y:char=0:char, a:double=1.0:double, c:char=0:char
// EXPECTATIONS JVM_IR
// test.kt:15 invoke: w:int=1:int, x:double=1.0:double, y:char=0:char
// test.kt:16 invoke: w:int=1:int, x:double=1.0:double, y:char=0:char, a:double=1.0:double, c:char=0:char
// EXPECTATIONS
// test.kt:4 <init>: x:double=1.0:double, y:java.lang.String="":java.lang.String, z:char=0:char // test.kt:4 <init>: x:double=1.0:double, y:java.lang.String="":java.lang.String, z:char=0:char
// EXPECTATIONS JVM
// test.kt:16 invoke: $dstr$x$_u24__u24$y:A=A, $noName_1:java.lang.String="":java.lang.String, w:int=1:int, x:double=1.0:double, y:char=0:char, a:double=1.0:double, c:char=0:char // test.kt:16 invoke: $dstr$x$_u24__u24$y:A=A, $noName_1:java.lang.String="":java.lang.String, w:int=1:int, x:double=1.0:double, y:char=0:char, a:double=1.0:double, c:char=0:char
// test.kt:18 invoke: $dstr$x$_u24__u24$y:A=A, $noName_1:java.lang.String="":java.lang.String, w:int=1:int, x:double=1.0:double, y:char=0:char, a:double=1.0:double, c:char=0:char, _:java.lang.String="":java.lang.String, d:char=0:char // test.kt:18 invoke: $dstr$x$_u24__u24$y:A=A, $noName_1:java.lang.String="":java.lang.String, w:int=1:int, x:double=1.0:double, y:char=0:char, a:double=1.0:double, c:char=0:char, _:java.lang.String="":java.lang.String, d:char=0:char
// EXPECTATIONS JVM_IR
// test.kt:16 invoke: w:int=1:int, x:double=1.0:double, y:char=0:char, a:double=1.0:double, c:char=0:char
// test.kt:18 invoke: w:int=1:int, x:double=1.0:double, y:char=0:char, a:double=1.0:double, c:char=0:char, _:java.lang.String="":java.lang.String, d:char=0:char
// EXPECTATIONS
// test.kt:8 getArrayOfA: // test.kt:8 getArrayOfA:
// EXPECTATIONS JVM
// test.kt:18 invoke: $dstr$x$_u24__u24$y:A=A, $noName_1:java.lang.String="":java.lang.String, w:int=1:int, x:double=1.0:double, y:char=0:char, a:double=1.0:double, c:char=0:char, _:java.lang.String="":java.lang.String, d:char=0:char // test.kt:18 invoke: $dstr$x$_u24__u24$y:A=A, $noName_1:java.lang.String="":java.lang.String, w:int=1:int, x:double=1.0:double, y:char=0:char, a:double=1.0:double, c:char=0:char, _:java.lang.String="":java.lang.String, d:char=0:char
// test.kt:22 invoke: $dstr$x$_u24__u24$y:A=A, $noName_1:java.lang.String="":java.lang.String, w:int=1:int, x:double=1.0:double, y:char=0:char, a:double=1.0:double, c:char=0:char, _:java.lang.String="":java.lang.String, d:char=0:char // test.kt:22 invoke: $dstr$x$_u24__u24$y:A=A, $noName_1:java.lang.String="":java.lang.String, w:int=1:int, x:double=1.0:double, y:char=0:char, a:double=1.0:double, c:char=0:char, _:java.lang.String="":java.lang.String, d:char=0:char
// EXPECTATIONS JVM_IR
// test.kt:18 invoke: w:int=1:int, x:double=1.0:double, y:char=0:char, a:double=1.0:double, c:char=0:char, _:java.lang.String="":java.lang.String, d:char=0:char
// test.kt:22 invoke: w:int=1:int, x:double=1.0:double, y:char=0:char, a:double=1.0:double, c:char=0:char, _:java.lang.String="":java.lang.String, d:char=0:char
// EXPECTATIONS
// test.kt:6 foo: a:A=A, block:kotlin.jvm.functions.Function3=TestKt$box$1 // test.kt:6 foo: a:A=A, block:kotlin.jvm.functions.Function3=TestKt$box$1
// test.kt:12 box: // test.kt:12 box:
// test.kt:24 box: // test.kt:24 box:
@@ -139,13 +139,13 @@ FILE fqName:<root> fileName:/destructuringInLambda.kt
FIELD PROPERTY_BACKING_FIELD name:fn type:kotlin.Function1<<root>.A, kotlin.Int> visibility:private [static] FIELD PROPERTY_BACKING_FIELD name:fn type:kotlin.Function1<<root>.A, kotlin.Int> visibility:private [static]
EXPRESSION_BODY EXPRESSION_BODY
FUN_EXPR type=kotlin.Function1<<root>.A, kotlin.Int> origin=LAMBDA FUN_EXPR type=kotlin.Function1<<root>.A, kotlin.Int> origin=LAMBDA
FUN LOCAL_FUNCTION_FOR_LAMBDA name:<anonymous> visibility:local modality:FINAL <> ($dstr$_u24__u24$y:<root>.A) returnType:kotlin.Int FUN LOCAL_FUNCTION_FOR_LAMBDA name:<anonymous> visibility:local modality:FINAL <> (<name for destructuring parameter 0>:<root>.A) returnType:kotlin.Int
VALUE_PARAMETER name:$dstr$_u24__u24$y index:0 type:<root>.A VALUE_PARAMETER DESTRUCTURED_OBJECT_PARAMETER name:<name for destructuring parameter 0> index:0 type:<root>.A
BLOCK_BODY BLOCK_BODY
VAR name:y type:kotlin.Int [val] VAR name:y type:kotlin.Int [val]
CALL 'public final fun component2 (): kotlin.Int [operator] declared in <root>.A' type=kotlin.Int origin=COMPONENT_N(index=2) CALL 'public final fun component2 (): kotlin.Int [operator] declared in <root>.A' type=kotlin.Int origin=COMPONENT_N(index=2)
$this: GET_VAR '$dstr$_u24__u24$y: <root>.A declared in <root>.fn.<anonymous>' type=<root>.A origin=DESTRUCTURING_DECLARATION $this: GET_VAR '<name for destructuring parameter 0>: <root>.A declared in <root>.fn.<anonymous>' type=<root>.A origin=DESTRUCTURING_DECLARATION
RETURN type=kotlin.Nothing from='local final fun <anonymous> ($dstr$_u24__u24$y: <root>.A): kotlin.Int declared in <root>.fn' RETURN type=kotlin.Nothing from='local final fun <anonymous> (<name for destructuring parameter 0>: <root>.A): kotlin.Int declared in <root>.fn'
CALL 'public final fun plus (other: kotlin.Int): kotlin.Int [operator] declared in kotlin.Int' type=kotlin.Int origin=PLUS CALL 'public final fun plus (other: kotlin.Int): kotlin.Int [operator] declared in kotlin.Int' type=kotlin.Int origin=PLUS
$this: CONST Int type=kotlin.Int value=42 $this: CONST Int type=kotlin.Int value=42
other: GET_VAR 'val y: kotlin.Int [val] declared in <root>.fn.<anonymous>' type=kotlin.Int origin=null other: GET_VAR 'val y: kotlin.Int [val] declared in <root>.fn.<anonymous>' type=kotlin.Int origin=null
@@ -55,10 +55,11 @@ data class A {
} }
var fn: Function1<A, Int> var fn: Function1<A, Int>
field = local fun <anonymous>($dstr$_u24__u24$y: A): Int { field = local fun <anonymous>(<name for destructuring parameter 0>: A): Int {
val y: Int = $dstr$_u24__u24$y.component2() val y: Int = <name for destructuring parameter 0>.component2()
return 42.plus(other = y) return 42.plus(other = y)
} }
get get
set set
@@ -9,7 +9,6 @@ package org.jetbrains.kotlin.scripting.compiler.plugin.impl
import com.intellij.openapi.Disposable import com.intellij.openapi.Disposable
import org.jetbrains.kotlin.backend.jvm.JvmGeneratorExtensionsImpl import org.jetbrains.kotlin.backend.jvm.JvmGeneratorExtensionsImpl
import org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory import org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory
import org.jetbrains.kotlin.backend.jvm.JvmNameProvider
import org.jetbrains.kotlin.backend.jvm.serialization.JvmIdSignatureDescriptor import org.jetbrains.kotlin.backend.jvm.serialization.JvmIdSignatureDescriptor
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
import org.jetbrains.kotlin.cli.common.environment.setIdeaIoUseFallback import org.jetbrains.kotlin.cli.common.environment.setIdeaIoUseFallback
@@ -356,7 +355,7 @@ class ReplCompilationState<AnalyzerT : ReplCodeAnalyzerBase>(
val mangler = JvmDescriptorMangler( val mangler = JvmDescriptorMangler(
MainFunctionDetector(analyzerEngine.trace.bindingContext, environment.configuration.languageVersionSettings) MainFunctionDetector(analyzerEngine.trace.bindingContext, environment.configuration.languageVersionSettings)
) )
val symbolTable = SymbolTable(JvmIdSignatureDescriptor(mangler), IrFactoryImpl, JvmNameProvider) val symbolTable = SymbolTable(JvmIdSignatureDescriptor(mangler), IrFactoryImpl)
mangler to symbolTable mangler to symbolTable
} }