From b1bba70e40162ff18e8c47f9b33ba8ed573bf43f Mon Sep 17 00:00:00 2001 From: pyos Date: Tue, 16 Apr 2019 12:21:21 +0200 Subject: [PATCH] JVM_IR: elide static field initialization to default values --- .../kotlin/backend/jvm/codegen/ExpressionCodegen.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt index 1037c2943e8..7cfad910b6f 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt @@ -446,10 +446,12 @@ class ExpressionCodegen( override fun visitSetField(expression: IrSetField, data: BlockInfo): PromisedValue { val expressionValue = expression.value // 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, // i.e., not in an initializer block or constructor body. - val skip = irFunction is IrConstructor && irFunction.isPrimary && - expression.origin == null && expressionValue is IrConst<*> && + val isFieldInitializer = expression.origin == null + val skip = (inPrimaryConstructor || inClassInit) && isFieldInitializer && expressionValue is IrConst<*> && isDefaultValueForType(expression.symbol.owner.type.asmType, expressionValue.value) return if (skip) voidValue.coerce(expression.asmType) else super.visitSetField(expression, data) }