From 99e50bd2b5dfcc452d401fc8acfdffd7172d685a Mon Sep 17 00:00:00 2001 From: Simon Vergauwen Date: Mon, 12 Dec 2022 11:34:37 +0100 Subject: [PATCH] MPP No Trace (#2869) --- arrow-libs/core/arrow-core/api/arrow-core.api | 7 ++++++- .../kotlin/arrow/core/continuations/Effect.kt | 4 +++- .../CancellationExceptionNoTrace.kt | 5 +++++ .../CancellationExceptionNoTrace.kt | 16 ++++++++++++++++ .../CancellationExceptionNoTrace.kt | 5 +++++ 5 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 arrow-libs/core/arrow-core/src/jsMain/kotlin/arrow/core/continuations/CancellationExceptionNoTrace.kt create mode 100644 arrow-libs/core/arrow-core/src/jvmMain/kotlin/arrow/core/continuations/CancellationExceptionNoTrace.kt create mode 100644 arrow-libs/core/arrow-core/src/nativeMain/kotlin/arrow/core/continuations/CancellationExceptionNoTrace.kt diff --git a/arrow-libs/core/arrow-core/api/arrow-core.api b/arrow-libs/core/arrow-core/api/arrow-core.api index 11e1103a62f..bf59e2f9a5c 100644 --- a/arrow-libs/core/arrow-core/api/arrow-core.api +++ b/arrow-libs/core/arrow-core/api/arrow-core.api @@ -2592,6 +2592,11 @@ public final class arrow/core/continuations/AtomicRefKt { public static final fun updateAndGet (Ljava/util/concurrent/atomic/AtomicReference;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; } +public class arrow/core/continuations/CancellationExceptionNoTrace : java/util/concurrent/CancellationException { + public fun ()V + public fun fillInStackTrace ()Ljava/lang/Throwable; +} + public final class arrow/core/continuations/Eager : arrow/core/continuations/ShiftCancellationException { public fun (Larrow/core/continuations/Token;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)V public final fun getRecover ()Lkotlin/jvm/functions/Function1; @@ -3015,7 +3020,7 @@ public final class arrow/core/continuations/ResultKt { public static final fun toResult (Larrow/core/continuations/Effect;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; } -public abstract class arrow/core/continuations/ShiftCancellationException : java/util/concurrent/CancellationException { +public abstract class arrow/core/continuations/ShiftCancellationException : arrow/core/continuations/CancellationExceptionNoTrace { } public final class arrow/core/continuations/Suspend : arrow/core/continuations/ShiftCancellationException { diff --git a/arrow-libs/core/arrow-core/src/commonMain/kotlin/arrow/core/continuations/Effect.kt b/arrow-libs/core/arrow-core/src/commonMain/kotlin/arrow/core/continuations/Effect.kt index 94f76c710c5..84e55d1f9d6 100644 --- a/arrow-libs/core/arrow-core/src/commonMain/kotlin/arrow/core/continuations/Effect.kt +++ b/arrow-libs/core/arrow-core/src/commonMain/kotlin/arrow/core/continuations/Effect.kt @@ -679,7 +679,9 @@ public interface Effect { * code, you can use this type to differentiate between a foreign [CancellationException] and the * one from [Effect]. */ -public sealed class ShiftCancellationException : CancellationException("Shifted Continuation") +public sealed class ShiftCancellationException : CancellationExceptionNoTrace() + +public expect open class CancellationExceptionNoTrace() : CancellationException /** * Holds `R` and `suspend (R) -> B`, the exception that wins the race, will get to execute diff --git a/arrow-libs/core/arrow-core/src/jsMain/kotlin/arrow/core/continuations/CancellationExceptionNoTrace.kt b/arrow-libs/core/arrow-core/src/jsMain/kotlin/arrow/core/continuations/CancellationExceptionNoTrace.kt new file mode 100644 index 00000000000..cb795a5a30e --- /dev/null +++ b/arrow-libs/core/arrow-core/src/jsMain/kotlin/arrow/core/continuations/CancellationExceptionNoTrace.kt @@ -0,0 +1,5 @@ +package arrow.core.continuations + +import kotlin.coroutines.cancellation.CancellationException + +public actual open class CancellationExceptionNoTrace : CancellationException("Shifted Continuation") diff --git a/arrow-libs/core/arrow-core/src/jvmMain/kotlin/arrow/core/continuations/CancellationExceptionNoTrace.kt b/arrow-libs/core/arrow-core/src/jvmMain/kotlin/arrow/core/continuations/CancellationExceptionNoTrace.kt new file mode 100644 index 00000000000..3d9525c7331 --- /dev/null +++ b/arrow-libs/core/arrow-core/src/jvmMain/kotlin/arrow/core/continuations/CancellationExceptionNoTrace.kt @@ -0,0 +1,16 @@ +package arrow.core.continuations + +import kotlin.coroutines.cancellation.CancellationException + +/* + * Inspired by KotlinX Coroutines: + * https://github.com/Kotlin/kotlinx.coroutines/blob/3788889ddfd2bcfedbff1bbca10ee56039e024a2/kotlinx-coroutines-core/jvm/src/Exceptions.kt#L29 + */ +public actual open class CancellationExceptionNoTrace : CancellationException("Shifted Continuation") { + override fun fillInStackTrace(): Throwable { + // Prevent Android <= 6.0 bug. + stackTrace = emptyArray() + // We don't need stacktrace on shift, it hurts performance. + return this + } +} diff --git a/arrow-libs/core/arrow-core/src/nativeMain/kotlin/arrow/core/continuations/CancellationExceptionNoTrace.kt b/arrow-libs/core/arrow-core/src/nativeMain/kotlin/arrow/core/continuations/CancellationExceptionNoTrace.kt new file mode 100644 index 00000000000..cb795a5a30e --- /dev/null +++ b/arrow-libs/core/arrow-core/src/nativeMain/kotlin/arrow/core/continuations/CancellationExceptionNoTrace.kt @@ -0,0 +1,5 @@ +package arrow.core.continuations + +import kotlin.coroutines.cancellation.CancellationException + +public actual open class CancellationExceptionNoTrace : CancellationException("Shifted Continuation")