diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/TargetDependent.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/TargetDependent.kt index 9b30f74ef60..ee851575421 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/TargetDependent.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/TargetDependent.kt @@ -7,6 +7,8 @@ package org.jetbrains.kotlin.commonizer +import gnu.trove.THashMap + sealed interface TargetDependent : Iterable { val size: Int get() = targets.size val targets: List @@ -111,27 +113,24 @@ private class FactoryBasedTargetDependent( private var factory: ((target: CommonizerTarget) -> T)? ) : TargetDependent { + private object Null private object Uninitialized - private val values: Array = Array(targets.size) { Uninitialized } + private val values = targets.associateWithTo(THashMap(targets.size)) { Uninitialized } @Suppress("UNCHECKED_CAST") override fun get(target: CommonizerTarget): T { - val indexOfTarget = indexOf(target) - if (indexOfTarget < 0) throwMissingTarget(target) - val storedValue = values[indexOfTarget] - if (storedValue == Uninitialized) { - val producedValue = factory?.invoke(target) - values[indexOfTarget] = producedValue - - /* All values initialized. Factory can be released */ - if (values.none { it === Uninitialized }) { + val value = values[target] ?: throwMissingTarget(target) + if (value === Null) return null as T + if (value === Uninitialized) { + val initializedValue = checkNotNull(factory)(target) + values[target] = initializedValue ?: Null + if (values.none { it.value !== Uninitialized }) { factory = null } - return producedValue as T + return initializedValue } - - return storedValue as T + return value as T } }