Native: quick fix lazy init boxing issue

FileInitializersLowering shouldn't expect codegen to initialize field
statically if constant literal is going to be boxed

^KT-48364
This commit is contained in:
Svyatoslav Scherbina
2021-08-23 16:27:14 +03:00
committed by Space
parent 9dd8266bee
commit ff46a63ffa
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.ir.builders.declarations.buildFun
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.IrBlockBody
import org.jetbrains.kotlin.ir.expressions.IrConst
import org.jetbrains.kotlin.ir.expressions.IrConstKind
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
import org.jetbrains.kotlin.ir.util.SYNTHETIC_OFFSET
import org.jetbrains.kotlin.ir.util.hasAnnotation
@@ -113,5 +114,10 @@ internal class FileInitializersLowering(val context: Context) : FileLoweringPass
get() = hasNonConstInitializer || needsGCRegistration(context)
private val IrField.hasNonConstInitializer: Boolean
get() = initializer?.expression.let { it != null && it !is IrConst<*> }
get() {
val it = initializer?.expression ?: return false
if (it !is IrConst<*>) return true
if (it.kind != IrConstKind.Null && it.type != this.type) return true // Might be boxed, so codegen won't treat it as const.
return false
}
}