[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.IrDelegatingConstructorCallImpl
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrEnumConstructorCallImpl
|
import org.jetbrains.kotlin.ir.expressions.impl.IrEnumConstructorCallImpl
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrFunctionReferenceImpl
|
import org.jetbrains.kotlin.ir.expressions.impl.IrFunctionReferenceImpl
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
|
import org.jetbrains.kotlin.ir.symbols.*
|
||||||
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.impl.IrAnonymousInitializerSymbolImpl
|
import org.jetbrains.kotlin.ir.symbols.impl.IrAnonymousInitializerSymbolImpl
|
||||||
import org.jetbrains.kotlin.ir.transformStatement
|
import org.jetbrains.kotlin.ir.transformStatement
|
||||||
import org.jetbrains.kotlin.ir.types.*
|
import org.jetbrains.kotlin.ir.types.*
|
||||||
@@ -877,6 +874,7 @@ internal class JvmMultiFieldValueClassLowering(
|
|||||||
name = Name.identifier("constructor_tmp"),
|
name = Name.identifier("constructor_tmp"),
|
||||||
saveVariable = ::variablesSaver,
|
saveVariable = ::variablesSaver,
|
||||||
isVar = false,
|
isVar = false,
|
||||||
|
origin = JvmLoweredDeclarationOrigin.MULTI_FIELD_VALUE_CLASS_REPRESENTATION_VARIABLE
|
||||||
)
|
)
|
||||||
for (valueDeclaration in instance.valueDeclarations) {
|
for (valueDeclaration in instance.valueDeclarations) {
|
||||||
valueDeclaration.origin = JvmLoweredDeclarationOrigin.TEMPORARY_MULTI_FIELD_VALUE_CLASS_VARIABLE
|
valueDeclaration.origin = JvmLoweredDeclarationOrigin.TEMPORARY_MULTI_FIELD_VALUE_CLASS_VARIABLE
|
||||||
@@ -1173,14 +1171,25 @@ internal class JvmMultiFieldValueClassLowering(
|
|||||||
}
|
}
|
||||||
}.unwrapBlock()
|
}.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 {
|
override fun visitVariable(declaration: IrVariable): IrStatement {
|
||||||
val initializer = declaration.initializer
|
val initializer = declaration.initializer
|
||||||
if (declaration.type.needsMfvcFlattening()) {
|
if (declaration.type.needsMfvcFlattening()) {
|
||||||
val irClass = declaration.type.erasedUpperBound
|
val irClass = declaration.type.erasedUpperBound
|
||||||
val rootNode = replacements.getRootMfvcNode(irClass)
|
val rootNode = replacements.getRootMfvcNode(irClass)
|
||||||
return context.createJvmIrBuilder(getCurrentScopeSymbol(), declaration).irBlock {
|
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(
|
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)
|
valueDeclarationsRemapper.registerReplacement(declaration, instance)
|
||||||
initializer?.let {
|
initializer?.let {
|
||||||
|
|||||||
@@ -61,20 +61,31 @@ fun MfvcNode.createInstanceFromBox(
|
|||||||
* Create instance-specific [ValueDeclarationMfvcNodeInstance] from instance-agnostic [MfvcNode] using new flattened variables as data source.
|
* Create instance-specific [ValueDeclarationMfvcNodeInstance] from instance-agnostic [MfvcNode] using new flattened variables as data source.
|
||||||
*/
|
*/
|
||||||
fun MfvcNode.createInstanceFromValueDeclarationsAndBoxType(
|
fun MfvcNode.createInstanceFromValueDeclarationsAndBoxType(
|
||||||
scope: IrBuilderWithScope, type: IrSimpleType, name: Name, saveVariable: (IrVariable) -> Unit, isVar: Boolean
|
scope: IrBuilderWithScope,
|
||||||
): ValueDeclarationMfvcNodeInstance = createInstanceFromValueDeclarations(scope, makeTypeArgumentsFromType(type), name, saveVariable, isVar)
|
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.
|
* Create instance-specific [ValueDeclarationMfvcNodeInstance] from instance-agnostic [MfvcNode] using new flattened variables as data source.
|
||||||
*/
|
*/
|
||||||
fun MfvcNode.createInstanceFromValueDeclarations(
|
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 {
|
): ValueDeclarationMfvcNodeInstance {
|
||||||
val valueDeclarations = mapLeaves {
|
val valueDeclarations = mapLeaves {
|
||||||
scope.savableStandaloneVariable(
|
scope.savableStandaloneVariable(
|
||||||
type = it.type,
|
type = it.type,
|
||||||
name = listOf(name, it.fullFieldName).joinToString("-"),
|
name = listOf(name, it.fullFieldName).joinToString("-"),
|
||||||
origin = JvmLoweredDeclarationOrigin.MULTI_FIELD_VALUE_CLASS_REPRESENTATION_VARIABLE,
|
origin = origin,
|
||||||
saveVariable = saveVariable,
|
saveVariable = saveVariable,
|
||||||
isVar = isVar,
|
isVar = isVar,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
// LANGUAGE: +ValueClasses
|
// LANGUAGE: +ValueClasses
|
||||||
// TARGET_BACKEND: JVM_IR
|
// TARGET_BACKEND: JVM_IR
|
||||||
// IGNORE_INLINER: IR
|
|
||||||
// CHECK_BYTECODE_LISTING
|
// CHECK_BYTECODE_LISTING
|
||||||
// WITH_STDLIB
|
// WITH_STDLIB
|
||||||
// CHECK_BYTECODE_TEXT
|
// CHECK_BYTECODE_TEXT
|
||||||
|
|||||||
Reference in New Issue
Block a user