From 5a49c43a4f73b25da9e0011c6305c37a5263a4a3 Mon Sep 17 00:00:00 2001 From: Andrew Golovashevich Date: Wed, 19 Mar 2025 21:59:44 +0300 Subject: [PATCH] [history] Contracts for decorator functions --- .../reference_counter/CloseableReferenceCounter.kt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/commonMain/kotlin/ru/landrafhomyak/utility/reference_counter/CloseableReferenceCounter.kt b/src/commonMain/kotlin/ru/landrafhomyak/utility/reference_counter/CloseableReferenceCounter.kt index 25e7a05..f2d037c 100644 --- a/src/commonMain/kotlin/ru/landrafhomyak/utility/reference_counter/CloseableReferenceCounter.kt +++ b/src/commonMain/kotlin/ru/landrafhomyak/utility/reference_counter/CloseableReferenceCounter.kt @@ -1,5 +1,7 @@ package ru.landrafhomyak.utility.reference_counter +import kotlin.contracts.InvocationKind +import kotlin.contracts.contract import kotlinx.atomicfu.AtomicLong import kotlinx.atomicfu.atomic import kotlinx.atomicfu.update @@ -21,6 +23,9 @@ internal class CloseableReferenceCounter(private val _errMessage: String) { } inline fun tryIncref(block: () -> R): R { + contract { + callsInPlace(block, InvocationKind.EXACTLY_ONCE) + } this.incref() return safeAutoClose2(onError = this::decref, action = block) } @@ -34,6 +39,9 @@ internal class CloseableReferenceCounter(private val _errMessage: String) { } inline fun tryDecref(block: () -> R): R { + contract { + callsInPlace(block, InvocationKind.EXACTLY_ONCE) + } this.checkNotClosed() return safeAutoClose2(onSuccess = this::decref, action = block) }