Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add contract for action/block #1582

Merged
merged 1 commit into from
Jan 29, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 12 additions & 2 deletions okio/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,8 @@ kotlin {
languageSettings.apply {
// Required for CPointer etc. since Kotlin 1.9.
optIn("kotlinx.cinterop.ExperimentalForeignApi")
// Required for Contract API. since Kotlin 1.3.
optIn("kotlin.contracts.ExperimentalContracts")
}
}

Expand Down Expand Up @@ -141,12 +143,20 @@ kotlin {
.also { nativeMain ->
nativeMain.dependsOn(zlibMain)
nativeMain.dependsOn(systemFileSystemMain)
createSourceSet("mingwMain", parent = nativeMain, children = mingwTargets).also { mingwMain ->
createSourceSet(
"mingwMain",
parent = nativeMain,
children = mingwTargets,
).also { mingwMain ->
mingwMain.dependsOn(nonAppleMain)
}
createSourceSet("unixMain", parent = nativeMain)
.also { unixMain ->
createSourceSet("linuxMain", parent = unixMain, children = linuxTargets).also { linuxMain ->
createSourceSet(
"linuxMain",
parent = unixMain,
children = linuxTargets,
).also { linuxMain ->
linuxMain.dependsOn(nonAppleMain)
}
createSourceSet("appleMain", parent = unixMain, children = appleTargets)
Expand Down
6 changes: 6 additions & 0 deletions okio/src/commonMain/kotlin/okio/Okio.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@

package okio

import kotlin.contracts.InvocationKind
import kotlin.contracts.contract
import kotlin.jvm.JvmMultifileClass
import kotlin.jvm.JvmName

Expand Down Expand Up @@ -49,6 +51,10 @@ private class BlackholeSink : Sink {

/** Execute [block] then close this. This will be closed even if [block] throws. */
inline fun <T : Closeable?, R> T.use(block: (T) -> R): R {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}

var thrown: Throwable? = null

val result = try {
Expand Down
13 changes: 12 additions & 1 deletion okio/src/jsMain/kotlin/okio/FileSystem.kt
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
*/
package okio

import kotlin.contracts.InvocationKind
import kotlin.contracts.contract
import okio.Path.Companion.toPath
import okio.internal.commonCopy
import okio.internal.commonCreateDirectories
Expand Down Expand Up @@ -50,6 +52,10 @@ actual abstract class FileSystem : Closeable {
actual abstract fun source(file: Path): Source

actual inline fun <T> read(file: Path, readerAction: BufferedSource.() -> T): T {
contract {
callsInPlace(readerAction, InvocationKind.EXACTLY_ONCE)
}

return source(file).buffer().use {
it.readerAction()
}
Expand All @@ -62,6 +68,10 @@ actual abstract class FileSystem : Closeable {
mustCreate: Boolean,
writerAction: BufferedSink.() -> T,
): T {
contract {
callsInPlace(writerAction, InvocationKind.EXACTLY_ONCE)
}

return sink(file, mustCreate).buffer().use {
it.writerAction()
}
Expand All @@ -71,7 +81,8 @@ actual abstract class FileSystem : Closeable {

actual abstract fun createDirectory(dir: Path, mustCreate: Boolean)

actual fun createDirectories(dir: Path, mustCreate: Boolean): Unit = commonCreateDirectories(dir, mustCreate)
actual fun createDirectories(dir: Path, mustCreate: Boolean): Unit =
commonCreateDirectories(dir, mustCreate)

actual abstract fun atomicMove(source: Path, target: Path)

Expand Down
10 changes: 9 additions & 1 deletion okio/src/jvmMain/kotlin/okio/-JvmPlatform.kt
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ package okio

import java.util.concurrent.locks.ReentrantLock
import kotlin.concurrent.withLock as jvmWithLock
import kotlin.contracts.InvocationKind
import kotlin.contracts.contract

internal actual fun ByteArray.toUtf8String(): String = String(this, Charsets.UTF_8)

Expand All @@ -30,7 +32,13 @@ actual typealias Lock = ReentrantLock

internal actual fun newLock(): Lock = ReentrantLock()

actual inline fun <T> Lock.withLock(action: () -> T): T = jvmWithLock(action)
actual inline fun <T> Lock.withLock(action: () -> T): T {
contract {
callsInPlace(action, InvocationKind.EXACTLY_ONCE)
}

return jvmWithLock(action)
}

actual typealias IOException = java.io.IOException

Expand Down
16 changes: 15 additions & 1 deletion okio/src/jvmMain/kotlin/okio/FileSystem.kt
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
package okio

import java.nio.file.FileSystem as JavaNioFileSystem
import kotlin.contracts.InvocationKind
import kotlin.contracts.contract
import okio.Path.Companion.toPath
import okio.internal.ResourceFileSystem
import okio.internal.commonCopy
Expand Down Expand Up @@ -64,6 +66,10 @@ actual abstract class FileSystem : Closeable {
@Throws(IOException::class)
@JvmName("-read")
actual inline fun <T> read(file: Path, readerAction: BufferedSource.() -> T): T {
contract {
callsInPlace(readerAction, InvocationKind.EXACTLY_ONCE)
}

return source(file).buffer().use {
it.readerAction()
}
Expand All @@ -77,7 +83,15 @@ actual abstract class FileSystem : Closeable {

@Throws(IOException::class)
@JvmName("-write")
actual inline fun <T> write(file: Path, mustCreate: Boolean, writerAction: BufferedSink.() -> T): T {
actual inline fun <T> write(
file: Path,
mustCreate: Boolean,
writerAction: BufferedSink.() -> T,
): T {
contract {
callsInPlace(writerAction, InvocationKind.EXACTLY_ONCE)
}

return sink(file, mustCreate = mustCreate).buffer().use {
it.writerAction()
}
Expand Down
13 changes: 12 additions & 1 deletion okio/src/nativeMain/kotlin/okio/FileSystem.kt
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
*/
package okio

import kotlin.contracts.InvocationKind
import kotlin.contracts.contract
import okio.internal.commonCopy
import okio.internal.commonCreateDirectories
import okio.internal.commonDeleteRecursively
Expand Down Expand Up @@ -58,6 +60,10 @@ actual abstract class FileSystem : Closeable {

@Throws(IOException::class)
actual inline fun <T> read(file: Path, readerAction: BufferedSource.() -> T): T {
contract {
callsInPlace(readerAction, InvocationKind.EXACTLY_ONCE)
}

return source(file).buffer().use {
it.readerAction()
}
Expand All @@ -72,6 +78,10 @@ actual abstract class FileSystem : Closeable {
mustCreate: Boolean,
writerAction: BufferedSink.() -> T,
): T {
contract {
callsInPlace(writerAction, InvocationKind.EXACTLY_ONCE)
}

return sink(file, mustCreate).buffer().use {
it.writerAction()
}
Expand All @@ -84,7 +94,8 @@ actual abstract class FileSystem : Closeable {
actual abstract fun createDirectory(dir: Path, mustCreate: Boolean)

@Throws(IOException::class)
actual fun createDirectories(dir: Path, mustCreate: Boolean): Unit = commonCreateDirectories(dir, mustCreate)
actual fun createDirectories(dir: Path, mustCreate: Boolean): Unit =
commonCreateDirectories(dir, mustCreate)

@Throws(IOException::class)
actual abstract fun atomicMove(source: Path, target: Path)
Expand Down
10 changes: 9 additions & 1 deletion okio/src/nonJvmMain/kotlin/okio/NonJvmPlatform.kt
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@

package okio

import kotlin.contracts.InvocationKind
import kotlin.contracts.contract
import okio.internal.commonAsUtf8ToByteArray
import okio.internal.commonToUtf8String

Expand All @@ -37,7 +39,13 @@ actual class Lock {

internal actual fun newLock(): Lock = Lock.instance

actual inline fun <T> Lock.withLock(action: () -> T): T = action()
actual inline fun <T> Lock.withLock(action: () -> T): T {
contract {
callsInPlace(action, InvocationKind.EXACTLY_ONCE)
}

return action()
}

actual open class IOException actual constructor(
message: String?,
Expand Down
12 changes: 12 additions & 0 deletions okio/src/wasmMain/kotlin/okio/FileSystem.kt
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@
*/
package okio

import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.InvocationKind
import kotlin.contracts.contract
import okio.Path.Companion.toPath
import okio.internal.commonCopy
import okio.internal.commonCreateDirectories
Expand All @@ -23,6 +26,7 @@ import okio.internal.commonExists
import okio.internal.commonListRecursively
import okio.internal.commonMetadata

@OptIn(ExperimentalContracts::class)
actual abstract class FileSystem : Closeable {
actual abstract fun canonicalize(path: Path): Path

Expand Down Expand Up @@ -50,6 +54,10 @@ actual abstract class FileSystem : Closeable {
actual abstract fun source(file: Path): Source

actual inline fun <T> read(file: Path, readerAction: BufferedSource.() -> T): T {
contract {
callsInPlace(readerAction, InvocationKind.EXACTLY_ONCE)
}

return source(file).buffer().use {
it.readerAction()
}
Expand All @@ -62,6 +70,10 @@ actual abstract class FileSystem : Closeable {
mustCreate: Boolean,
writerAction: BufferedSink.() -> T,
): T {
contract {
callsInPlace(writerAction, InvocationKind.EXACTLY_ONCE)
}

return sink(file, mustCreate).buffer().use {
it.writerAction()
}
Expand Down
Loading