From 2e5d284472f3573087f174266ea4b715ab30e7ab Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Fri, 3 Feb 2023 12:32:08 +0100 Subject: [PATCH] [Analysis API] optimize RAM consumption in ValidityAwareCachedValue - make it inline class - remove non-required `token` field ^KTIJ-22749 --- .../api/fir/utils/ValidityAwareCachedValue.kt | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/ValidityAwareCachedValue.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/ValidityAwareCachedValue.kt index 0548740309e..f5c6d8014b7 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/ValidityAwareCachedValue.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/ValidityAwareCachedValue.kt @@ -6,7 +6,6 @@ package org.jetbrains.kotlin.analysis.api.fir.utils import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeOwner -import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken import org.jetbrains.kotlin.analysis.api.lifetime.assertIsValidAndAccessible import kotlin.properties.ReadOnlyProperty import kotlin.reflect.KProperty @@ -14,16 +13,17 @@ import kotlin.reflect.KProperty /** * Lazy value that guaranties safe publication and checks validity on every access */ -class ValidityAwareCachedValue( - private val token: KtLifetimeToken, - init: () -> T +@JvmInline +value class ValidityAwareCachedValue( + private val lazyValue: Lazy, ) : ReadOnlyProperty { - private val lazyValue = lazy(LazyThreadSafetyMode.PUBLICATION, init) override fun getValue(thisRef: Any, property: KProperty<*>): T { - token.assertIsValidAndAccessible() + require(thisRef is KtLifetimeOwner) + thisRef.token.assertIsValidAndAccessible() return lazyValue.value } } -internal fun KtLifetimeOwner.cached(init: () -> T) = ValidityAwareCachedValue(token, init) +@Suppress("UnusedReceiverParameter") // we need to have the KtLifetimeOwner as receiver to make sure it's called only for KtLifetimeOwner +internal fun KtLifetimeOwner.cached(init: () -> T) = ValidityAwareCachedValue(lazy(LazyThreadSafetyMode.PUBLICATION, init))