[JVM_IR] Set correct origin for new variables on MFVC flattening.
Preserve information that variable is temporary while flattening. Otherwise, unnecessary bytecode for them might be generated.
This commit is contained in:
committed by
Space Team
parent
fc898c7620
commit
4f1d181c88
+14
-5
@@ -30,10 +30,7 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrConstructorCallImpl
|
||||
import org.jetbrains.kotlin.ir.expressions.impl.IrDelegatingConstructorCallImpl
|
||||
import org.jetbrains.kotlin.ir.expressions.impl.IrEnumConstructorCallImpl
|
||||
import org.jetbrains.kotlin.ir.expressions.impl.IrFunctionReferenceImpl
|
||||
import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
|
||||
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
|
||||
import org.jetbrains.kotlin.ir.symbols.IrSymbol
|
||||
import org.jetbrains.kotlin.ir.symbols.IrValueSymbol
|
||||
import org.jetbrains.kotlin.ir.symbols.*
|
||||
import org.jetbrains.kotlin.ir.symbols.impl.IrAnonymousInitializerSymbolImpl
|
||||
import org.jetbrains.kotlin.ir.transformStatement
|
||||
import org.jetbrains.kotlin.ir.types.*
|
||||
@@ -877,6 +874,7 @@ internal class JvmMultiFieldValueClassLowering(
|
||||
name = Name.identifier("constructor_tmp"),
|
||||
saveVariable = ::variablesSaver,
|
||||
isVar = false,
|
||||
origin = JvmLoweredDeclarationOrigin.MULTI_FIELD_VALUE_CLASS_REPRESENTATION_VARIABLE
|
||||
)
|
||||
for (valueDeclaration in instance.valueDeclarations) {
|
||||
valueDeclaration.origin = JvmLoweredDeclarationOrigin.TEMPORARY_MULTI_FIELD_VALUE_CLASS_VARIABLE
|
||||
@@ -1173,14 +1171,25 @@ internal class JvmMultiFieldValueClassLowering(
|
||||
}
|
||||
}.unwrapBlock()
|
||||
|
||||
private val IrDeclarationOrigin.isTemporary
|
||||
get() =
|
||||
this == IrDeclarationOrigin.IR_TEMPORARY_VARIABLE
|
||||
|| this == IrDeclarationOrigin.IR_TEMPORARY_VARIABLE_FOR_INLINED_EXTENSION_RECEIVER
|
||||
|| this == IrDeclarationOrigin.IR_TEMPORARY_VARIABLE_FOR_INLINED_PARAMETER
|
||||
|
||||
override fun visitVariable(declaration: IrVariable): IrStatement {
|
||||
val initializer = declaration.initializer
|
||||
if (declaration.type.needsMfvcFlattening()) {
|
||||
val irClass = declaration.type.erasedUpperBound
|
||||
val rootNode = replacements.getRootMfvcNode(irClass)
|
||||
return context.createJvmIrBuilder(getCurrentScopeSymbol(), declaration).irBlock {
|
||||
val origin = if (declaration.origin.isTemporary) {
|
||||
JvmLoweredDeclarationOrigin.TEMPORARY_MULTI_FIELD_VALUE_CLASS_VARIABLE
|
||||
} else {
|
||||
JvmLoweredDeclarationOrigin.MULTI_FIELD_VALUE_CLASS_REPRESENTATION_VARIABLE
|
||||
}
|
||||
val instance = rootNode.createInstanceFromValueDeclarationsAndBoxType(
|
||||
this, declaration.type as IrSimpleType, declaration.name, ::variablesSaver, declaration.isVar
|
||||
this, declaration.type as IrSimpleType, declaration.name, ::variablesSaver, declaration.isVar, origin
|
||||
)
|
||||
valueDeclarationsRemapper.registerReplacement(declaration, instance)
|
||||
initializer?.let {
|
||||
|
||||
@@ -61,20 +61,31 @@ fun MfvcNode.createInstanceFromBox(
|
||||
* Create instance-specific [ValueDeclarationMfvcNodeInstance] from instance-agnostic [MfvcNode] using new flattened variables as data source.
|
||||
*/
|
||||
fun MfvcNode.createInstanceFromValueDeclarationsAndBoxType(
|
||||
scope: IrBuilderWithScope, type: IrSimpleType, name: Name, saveVariable: (IrVariable) -> Unit, isVar: Boolean
|
||||
): ValueDeclarationMfvcNodeInstance = createInstanceFromValueDeclarations(scope, makeTypeArgumentsFromType(type), name, saveVariable, isVar)
|
||||
scope: IrBuilderWithScope,
|
||||
type: IrSimpleType,
|
||||
name: Name,
|
||||
saveVariable: (IrVariable) -> Unit,
|
||||
isVar: Boolean,
|
||||
origin: IrDeclarationOrigin,
|
||||
): ValueDeclarationMfvcNodeInstance =
|
||||
createInstanceFromValueDeclarations(scope, makeTypeArgumentsFromType(type), name, saveVariable, isVar, origin)
|
||||
|
||||
/**
|
||||
* Create instance-specific [ValueDeclarationMfvcNodeInstance] from instance-agnostic [MfvcNode] using new flattened variables as data source.
|
||||
*/
|
||||
fun MfvcNode.createInstanceFromValueDeclarations(
|
||||
scope: IrBuilderWithScope, typeArguments: TypeArguments, name: Name, saveVariable: (IrVariable) -> Unit, isVar: Boolean
|
||||
scope: IrBuilderWithScope,
|
||||
typeArguments: TypeArguments,
|
||||
name: Name,
|
||||
saveVariable: (IrVariable) -> Unit,
|
||||
isVar: Boolean,
|
||||
origin: IrDeclarationOrigin,
|
||||
): ValueDeclarationMfvcNodeInstance {
|
||||
val valueDeclarations = mapLeaves {
|
||||
scope.savableStandaloneVariable(
|
||||
type = it.type,
|
||||
name = listOf(name, it.fullFieldName).joinToString("-"),
|
||||
origin = JvmLoweredDeclarationOrigin.MULTI_FIELD_VALUE_CLASS_REPRESENTATION_VARIABLE,
|
||||
origin = origin,
|
||||
saveVariable = saveVariable,
|
||||
isVar = isVar,
|
||||
)
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
// LANGUAGE: +ValueClasses
|
||||
// TARGET_BACKEND: JVM_IR
|
||||
// IGNORE_INLINER: IR
|
||||
// CHECK_BYTECODE_LISTING
|
||||
// WITH_STDLIB
|
||||
// CHECK_BYTECODE_TEXT
|
||||
|
||||
Reference in New Issue
Block a user