From 4775df4b448ef581a4ba8ff770cc2971dcde8322 Mon Sep 17 00:00:00 2001 From: Andrey Vokin Date: Wed, 15 Jul 2026 12:07:06 +0200 Subject: [PATCH] PY-90883 inline FUS type-engine timing wrappers to fix StackOverflowError (cherry picked from commit aa216ae0370dc1e6d60870f073fe9d7a9d74d1df) IJ-MR-213683 (cherry picked from commit 498fbb0c04142eaaea437a8d75f8338dc773d05c) IJ-CR-216837 GitOrigin-RevId: fcf78e2e7e7ac3db6b378f076f0635935daf3f95 --- .../PyTypeEvaluationAggregatesCollector.kt | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/python/python-psi-impl/src/com/jetbrains/python/psi/types/PyTypeEvaluationAggregatesCollector.kt b/python/python-psi-impl/src/com/jetbrains/python/psi/types/PyTypeEvaluationAggregatesCollector.kt index 7b15fb3ffe51..c6778a62ba9a 100644 --- a/python/python-psi-impl/src/com/jetbrains/python/psi/types/PyTypeEvaluationAggregatesCollector.kt +++ b/python/python-psi-impl/src/com/jetbrains/python/psi/types/PyTypeEvaluationAggregatesCollector.kt @@ -10,6 +10,7 @@ import com.jetbrains.python.psi.types.engine.PyTypeEngine import org.HdrHistogram.Recorder import org.jetbrains.annotations.ApiStatus import java.util.concurrent.ConcurrentHashMap +import kotlin.time.Duration import kotlin.time.Duration.Companion.seconds import kotlin.time.measureTimedValue @@ -78,28 +79,38 @@ class PyTypeEvaluationAggregatesCollector : ApplicationUsagesCollector() { } } - fun recordPyCharmTypeEngineTime(block: () -> PyType?): PyType? { + inline fun recordPyCharmTypeEngineTime(block: () -> PyType?): PyType? { val (result, duration) = measureTimedValue { block() } - val clampedDuration = duration.coerceAtMost(MAX_TRACKABLE_DURATION) - getOrCreateRecorder(PYCHARM_TYPE_ENGINE).recordValue(clampedDuration.inWholeMilliseconds) + recordPyCharmDuration(duration) return result } - fun recordHybridTypeEngineTime(typeEngine: PyTypeEngine, block: () -> PyType?): PyType? { + inline fun recordHybridTypeEngineTime(typeEngine: PyTypeEngine, block: () -> PyType?): PyType? { val (result, duration) = measureTimedValue { block() } + recordHybridDuration(typeEngine, duration) + return result + } + + @PublishedApi + internal fun recordPyCharmDuration(duration: Duration) { + val clampedDuration = duration.coerceAtMost(MAX_TRACKABLE_DURATION) + getOrCreateRecorder(PYCHARM_TYPE_ENGINE).recordValue(clampedDuration.inWholeMilliseconds) + } + + @PublishedApi + internal fun recordHybridDuration(typeEngine: PyTypeEngine, duration: Duration) { val recorderName = typeEngine.name.lowercase() // Only record metrics for registered external type engines if (recorderName !in EXTERNAL_TYPE_ENGINES) { LOG.error("Unknown type engine name '${typeEngine.name}' (normalized: '$recorderName'). Expected one of: ${EXTERNAL_TYPE_ENGINES.joinToString()}") - return result + return } val clampedDuration = duration.coerceAtMost(MAX_TRACKABLE_DURATION) getOrCreateRecorder(recorderName).recordValue(clampedDuration.inWholeMilliseconds) - return result } } }