JVM_IR: elide static field initialization to default values
This commit is contained in:
+4
-2
@@ -446,10 +446,12 @@ class ExpressionCodegen(
|
|||||||
override fun visitSetField(expression: IrSetField, data: BlockInfo): PromisedValue {
|
override fun visitSetField(expression: IrSetField, data: BlockInfo): PromisedValue {
|
||||||
val expressionValue = expression.value
|
val expressionValue = expression.value
|
||||||
// Do not add redundant field initializers that initialize to default values.
|
// Do not add redundant field initializers that initialize to default values.
|
||||||
|
val inPrimaryConstructor = irFunction is IrConstructor && irFunction.isPrimary
|
||||||
|
val inClassInit = irFunction.origin == JvmLoweredDeclarationOrigin.CLASS_STATIC_INITIALIZER
|
||||||
// "expression.origin == null" means that the field is initialized when it is declared,
|
// "expression.origin == null" means that the field is initialized when it is declared,
|
||||||
// i.e., not in an initializer block or constructor body.
|
// i.e., not in an initializer block or constructor body.
|
||||||
val skip = irFunction is IrConstructor && irFunction.isPrimary &&
|
val isFieldInitializer = expression.origin == null
|
||||||
expression.origin == null && expressionValue is IrConst<*> &&
|
val skip = (inPrimaryConstructor || inClassInit) && isFieldInitializer && expressionValue is IrConst<*> &&
|
||||||
isDefaultValueForType(expression.symbol.owner.type.asmType, expressionValue.value)
|
isDefaultValueForType(expression.symbol.owner.type.asmType, expressionValue.value)
|
||||||
return if (skip) voidValue.coerce(expression.asmType) else super.visitSetField(expression, data)
|
return if (skip) voidValue.coerce(expression.asmType) else super.visitSetField(expression, data)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user