From 72d9b8ddaecb676111cb4b5feb0751ab4fde4a11 Mon Sep 17 00:00:00 2001 From: Svyatoslav Kuzmich Date: Fri, 20 Jan 2023 13:05:08 +0100 Subject: [PATCH] [Wasm] stdlib NFC: Fix or suppress remaining warnings --- libraries/stdlib/wasm/builtins/kotlin/Boolean.kt | 4 +++- libraries/stdlib/wasm/builtins/kotlin/Char.kt | 2 +- libraries/stdlib/wasm/builtins/kotlin/Library.kt | 2 +- libraries/stdlib/wasm/builtins/kotlin/Primitives.kt | 2 +- libraries/stdlib/wasm/builtins/kotlin/String.kt | 1 + .../wasm/internal/kotlin/wasm/internal/Coroutines.kt | 5 ++++- .../internal/kotlin/wasm/internal/ExceptionHelpers.kt | 3 +-- .../stdlib/wasm/internal/kotlin/wasm/internal/Runtime.kt | 3 +++ .../stdlib/wasm/internal/kotlin/wasm/internal/TypeInfo.kt | 1 + .../internal/kotlin/wasm/internal/WasmInstructions.kt | 2 +- libraries/stdlib/wasm/src/kotlin/Dynamic.kt | 7 +++++++ libraries/stdlib/wasm/src/kotlin/Numbers.kt | 2 ++ .../stdlib/wasm/src/kotlin/collections/ArraysWasm.kt | 1 + libraries/stdlib/wasm/src/kotlin/collections/Helpers.kt | 1 + libraries/stdlib/wasm/src/kotlin/js/Promise.kt | 8 ++++---- libraries/stdlib/wasm/src/kotlin/reflect/reflection.kt | 1 + libraries/stdlib/wasm/src/kotlin/text/StringsWasm.kt | 3 ++- libraries/stdlib/wasm/src/kotlin/time/TimeSources.kt | 8 ++++---- .../stdlib/wasm/src/kotlin/wasm/unsafe/MemoryAccess.kt | 4 ++++ .../wasm/src/kotlin/wasm/unsafe/MemoryAllocation.kt | 1 + libraries/stdlib/wasm/src/kotlinx/dom/ItemArrayLike.kt | 1 + libraries/stdlib/wasm/stubs/native/concurrent.kt | 1 + 22 files changed, 46 insertions(+), 17 deletions(-) diff --git a/libraries/stdlib/wasm/builtins/kotlin/Boolean.kt b/libraries/stdlib/wasm/builtins/kotlin/Boolean.kt index 81d9d8125d7..bbb20648e44 100644 --- a/libraries/stdlib/wasm/builtins/kotlin/Boolean.kt +++ b/libraries/stdlib/wasm/builtins/kotlin/Boolean.kt @@ -3,6 +3,8 @@ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ +@file:Suppress("UNUSED_PARAMETER") + package kotlin import kotlin.wasm.internal.* @@ -56,7 +58,7 @@ public class Boolean private constructor(private val value: Boolean) : Comparabl return if (other !is Boolean) { false } else { - this === (other as Boolean) + wasm_i32_eq(this.toInt(), other.toInt()) } } diff --git a/libraries/stdlib/wasm/builtins/kotlin/Char.kt b/libraries/stdlib/wasm/builtins/kotlin/Char.kt index 1ea8eb59184..340934f97c4 100644 --- a/libraries/stdlib/wasm/builtins/kotlin/Char.kt +++ b/libraries/stdlib/wasm/builtins/kotlin/Char.kt @@ -27,7 +27,7 @@ public class Char private constructor(public val value: Char) : Comparable public override fun equals(other: Any?): Boolean { if (other is Char) - return this === (other as Char) + return wasm_i32_eq(this.toInt(), other.toInt()) return false } diff --git a/libraries/stdlib/wasm/builtins/kotlin/Library.kt b/libraries/stdlib/wasm/builtins/kotlin/Library.kt index 2fc76fcb4c7..a86fc4c450f 100644 --- a/libraries/stdlib/wasm/builtins/kotlin/Library.kt +++ b/libraries/stdlib/wasm/builtins/kotlin/Library.kt @@ -87,5 +87,5 @@ public inline fun > enumValues(): Array * Returns an enum entry with specified name. */ @SinceKotlin("1.1") -@Suppress("NON_MEMBER_FUNCTION_NO_BODY") +@Suppress("NON_MEMBER_FUNCTION_NO_BODY", "UNUSED_PARAMETER") public inline fun > enumValueOf(name: String): T \ No newline at end of file diff --git a/libraries/stdlib/wasm/builtins/kotlin/Primitives.kt b/libraries/stdlib/wasm/builtins/kotlin/Primitives.kt index 59949c74427..00fa95c818d 100644 --- a/libraries/stdlib/wasm/builtins/kotlin/Primitives.kt +++ b/libraries/stdlib/wasm/builtins/kotlin/Primitives.kt @@ -5,7 +5,7 @@ @file:Suppress( "OVERRIDE_BY_INLINE", "NOTHING_TO_INLINE", - "unused" + "unused", "UNUSED_PARAMETER" ) package kotlin diff --git a/libraries/stdlib/wasm/builtins/kotlin/String.kt b/libraries/stdlib/wasm/builtins/kotlin/String.kt index abded878e49..8908ef777d4 100644 --- a/libraries/stdlib/wasm/builtins/kotlin/String.kt +++ b/libraries/stdlib/wasm/builtins/kotlin/String.kt @@ -127,6 +127,7 @@ public class String internal @WasmPrimitiveConstructor constructor( } } +@Suppress("NOTHING_TO_INLINE") internal inline fun WasmCharArray.createString(): String = String(null, this.len(), this) diff --git a/libraries/stdlib/wasm/internal/kotlin/wasm/internal/Coroutines.kt b/libraries/stdlib/wasm/internal/kotlin/wasm/internal/Coroutines.kt index 59041840e42..e770393ae3f 100644 --- a/libraries/stdlib/wasm/internal/kotlin/wasm/internal/Coroutines.kt +++ b/libraries/stdlib/wasm/internal/kotlin/wasm/internal/Coroutines.kt @@ -16,7 +16,7 @@ internal fun getContinuation(): Continuation = @PublishedApi @Suppress("UNCHECKED_CAST") -internal suspend fun returnIfSuspended(@Suppress("UNUSED_PARAMETER") argument: Any?): T = +internal suspend fun returnIfSuspended(argument: Any?): T = argument as T @PublishedApi @@ -33,6 +33,7 @@ internal suspend fun getCoroutineContext(): CoroutineContext = getContinuation suspendCoroutineUninterceptedOrReturn(block: (Continuation) -> Any?): T = returnIfSuspended(block(getContinuation())) +@Suppress("UNUSED_PARAMETER") @ExcludedFromCodegen @PublishedApi internal fun startCoroutineUninterceptedOrReturnIntrinsic0( @@ -42,6 +43,7 @@ internal fun startCoroutineUninterceptedOrReturnIntrinsic0( implementedAsIntrinsic } +@Suppress("UNUSED_PARAMETER") @ExcludedFromCodegen @PublishedApi internal fun startCoroutineUninterceptedOrReturnIntrinsic1( @@ -52,6 +54,7 @@ internal fun startCoroutineUninterceptedOrReturnIntrinsic1( implementedAsIntrinsic } +@Suppress("UNUSED_PARAMETER") @ExcludedFromCodegen @PublishedApi internal fun startCoroutineUninterceptedOrReturnIntrinsic2( diff --git a/libraries/stdlib/wasm/internal/kotlin/wasm/internal/ExceptionHelpers.kt b/libraries/stdlib/wasm/internal/kotlin/wasm/internal/ExceptionHelpers.kt index 0f0fab2c09f..ec0c255537c 100644 --- a/libraries/stdlib/wasm/internal/kotlin/wasm/internal/ExceptionHelpers.kt +++ b/libraries/stdlib/wasm/internal/kotlin/wasm/internal/ExceptionHelpers.kt @@ -14,11 +14,10 @@ package kotlin.wasm.internal throw error; }""" ) -private external fun throwJsError(message: String?, wasmTypeName: String?, stack: String) +private external fun throwJsError(message: String?, wasmTypeName: String?, stack: String): Nothing internal fun throwAsJsException(t: Throwable): Nothing { throwJsError(t.message, t::class.simpleName, t.stackTraceToString()) - return error("Unreachable") } internal var isNotFirstWasmExportCall: Boolean = false \ No newline at end of file diff --git a/libraries/stdlib/wasm/internal/kotlin/wasm/internal/Runtime.kt b/libraries/stdlib/wasm/internal/kotlin/wasm/internal/Runtime.kt index 66be68b8090..a141fde8f48 100644 --- a/libraries/stdlib/wasm/internal/kotlin/wasm/internal/Runtime.kt +++ b/libraries/stdlib/wasm/internal/kotlin/wasm/internal/Runtime.kt @@ -3,6 +3,8 @@ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ +@file:Suppress("UNUSED_PARAMETER") // File contains many intrinsics + package kotlin.wasm.internal internal const val CHAR_SIZE_BYTES = 2 @@ -115,5 +117,6 @@ internal fun stringGetPoolSize(): Int = implementedAsIntrinsic // This initializer is a special case in FieldInitializersLowering +@Suppress("DEPRECATION") @EagerInitialization internal val stringPool: Array = arrayOfNulls(stringGetPoolSize()) \ No newline at end of file diff --git a/libraries/stdlib/wasm/internal/kotlin/wasm/internal/TypeInfo.kt b/libraries/stdlib/wasm/internal/kotlin/wasm/internal/TypeInfo.kt index 91174fa3e6d..83ee0fd14f9 100644 --- a/libraries/stdlib/wasm/internal/kotlin/wasm/internal/TypeInfo.kt +++ b/libraries/stdlib/wasm/internal/kotlin/wasm/internal/TypeInfo.kt @@ -51,6 +51,7 @@ internal fun isInterfaceById(obj: Any, interfaceId: Int): Boolean { return false } +@Suppress("UNUSED_PARAMETER") @ExcludedFromCodegen internal fun wasmIsInterface(obj: Any): Boolean = implementedAsIntrinsic diff --git a/libraries/stdlib/wasm/internal/kotlin/wasm/internal/WasmInstructions.kt b/libraries/stdlib/wasm/internal/kotlin/wasm/internal/WasmInstructions.kt index 1da6c2a83c2..01d212ffb3b 100644 --- a/libraries/stdlib/wasm/internal/kotlin/wasm/internal/WasmInstructions.kt +++ b/libraries/stdlib/wasm/internal/kotlin/wasm/internal/WasmInstructions.kt @@ -4,7 +4,7 @@ */ @file:ExcludedFromCodegen -@file:Suppress("unused", "NON_ABSTRACT_FUNCTION_WITH_NO_BODY", "INLINE_CLASS_IN_EXTERNAL_DECLARATION") +@file:Suppress("unused", "NON_ABSTRACT_FUNCTION_WITH_NO_BODY", "INLINE_CLASS_IN_EXTERNAL_DECLARATION", "UNUSED_PARAMETER") package kotlin.wasm.internal diff --git a/libraries/stdlib/wasm/src/kotlin/Dynamic.kt b/libraries/stdlib/wasm/src/kotlin/Dynamic.kt index 8fab39a52ab..22552f18965 100644 --- a/libraries/stdlib/wasm/src/kotlin/Dynamic.kt +++ b/libraries/stdlib/wasm/src/kotlin/Dynamic.kt @@ -112,6 +112,7 @@ internal fun Dynamic.getDouble(index: String): Double = dynamicGetDouble(this, i @PublishedApi internal fun Dynamic.getString(index: String): String? = dynamicGetString(this, index) +@Suppress("UNCHECKED_CAST") @PublishedApi internal fun Dynamic.getAny(index: String): T? = dynamicGetAny(this, index) as T? @@ -142,6 +143,7 @@ internal fun Dynamic.getDouble(index: Int): Double = dynamicGetDouble(this, inde @PublishedApi internal fun Dynamic.getString(index: Int): String? = dynamicGetString(this, index.toString()) +@Suppress("UNCHECKED_CAST") @PublishedApi internal fun Dynamic.getAny(index: Int): T? = dynamicGetAny(this, index.toString()) as T? @@ -153,6 +155,7 @@ external interface Dynamic /** * Reinterprets this value as a value of the Dynamic type. */ +@Suppress("UNCHECKED_CAST_TO_EXTERNAL_INTERFACE") @kotlin.internal.InlineOnly fun Any.asDynamic(): Dynamic = this as Dynamic @@ -183,6 +186,8 @@ operator fun Dynamic.set(index: Int, value: Any?) { @JsFun("(x) => x") private external fun unsafeCastJs(x: String): Dynamic + +@Suppress("UNCHECKED_CAST") fun String.unsafeCast(): T = unsafeCastJs(this) as T @JsFun("(x) => x") @@ -191,6 +196,7 @@ private external fun unsafeCastJs(x: Boolean): Dynamic /** * Reinterprets boolean value as a value of the specified type [T] without any actual type checking. */ +@Suppress("UNCHECKED_CAST") fun Boolean.unsafeCast(): T = unsafeCastJs(this) as T /** @@ -201,6 +207,7 @@ fun Nothing?.unsafeCast(): Dynamic? = null /** * Reinterprets Dynamic type value as a value of the specified type [T] without any actual type checking. */ +@Suppress("UNCHECKED_CAST") fun Dynamic.unsafeCast(): T = this as T @JsFun("e => { throw e; }") diff --git a/libraries/stdlib/wasm/src/kotlin/Numbers.kt b/libraries/stdlib/wasm/src/kotlin/Numbers.kt index 31d038ee5fb..e0e1edddce0 100644 --- a/libraries/stdlib/wasm/src/kotlin/Numbers.kt +++ b/libraries/stdlib/wasm/src/kotlin/Numbers.kt @@ -75,6 +75,7 @@ public actual fun Int.rotateRight(bitCount: Int): Int = /** * Counts the number of set bits in the binary representation of this [Long] number. */ +@Suppress("NOTHING_TO_INLINE") public actual inline fun Long.countOneBits(): Int = wasm_i64_popcnt(this).toInt() @@ -87,6 +88,7 @@ public actual fun Long.countLeadingZeroBits(): Int = wasm_i64_clz(this).toInt() /** * Counts the number of consecutive least significant bits that are zero in the binary representation of this [Long] number. */ +@Suppress("NOTHING_TO_INLINE") public actual inline fun Long.countTrailingZeroBits(): Int = wasm_i64_ctz(this).toInt() diff --git a/libraries/stdlib/wasm/src/kotlin/collections/ArraysWasm.kt b/libraries/stdlib/wasm/src/kotlin/collections/ArraysWasm.kt index 7143e735332..34cea96564e 100644 --- a/libraries/stdlib/wasm/src/kotlin/collections/ArraysWasm.kt +++ b/libraries/stdlib/wasm/src/kotlin/collections/ArraysWasm.kt @@ -15,6 +15,7 @@ package kotlin.collections @kotlin.internal.InlineOnly public actual inline fun Collection.toTypedArray(): Array = copyToArray(this) +@Suppress("UNCHECKED_CAST") @PublishedApi internal fun copyToArray(collection: Collection): Array = if (collection is AbstractCollection) diff --git a/libraries/stdlib/wasm/src/kotlin/collections/Helpers.kt b/libraries/stdlib/wasm/src/kotlin/collections/Helpers.kt index d3ac39da996..7568e46465e 100644 --- a/libraries/stdlib/wasm/src/kotlin/collections/Helpers.kt +++ b/libraries/stdlib/wasm/src/kotlin/collections/Helpers.kt @@ -10,6 +10,7 @@ package kotlin.collections * Attempts to read _uninitialized_ values from this array work in implementation-dependent manner, * either throwing exception or returning some kind of implementation-specific default value. */ +@Suppress("NOTHING_TO_INLINE") @PublishedApi internal inline fun arrayOfUninitializedElements(size: Int): Array { require(size >= 0) { "capacity must be non-negative." } diff --git a/libraries/stdlib/wasm/src/kotlin/js/Promise.kt b/libraries/stdlib/wasm/src/kotlin/js/Promise.kt index a04fc9eb4c8..a44b4907786 100644 --- a/libraries/stdlib/wasm/src/kotlin/js/Promise.kt +++ b/libraries/stdlib/wasm/src/kotlin/js/Promise.kt @@ -9,10 +9,10 @@ package kotlin.js * Exposes the JavaScript [Promise object](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise) to Kotlin. */ public external class Promise(executor: (resolve: (Dynamic?) -> Unit, reject: (Dynamic) -> Unit) -> Unit) { - public open fun then(onFulfilled: (Dynamic?) -> Dynamic?): Promise - public open fun then(onFulfilled: (Dynamic?) -> Dynamic?, onRejected: (Dynamic) -> Dynamic?): Promise - public open fun catch(onRejected: (Dynamic) -> Dynamic?): Promise - public open fun finally(onFinally: () -> Unit): Promise + public fun then(onFulfilled: (Dynamic?) -> Dynamic?): Promise + public fun then(onFulfilled: (Dynamic?) -> Dynamic?, onRejected: (Dynamic) -> Dynamic?): Promise + public fun catch(onRejected: (Dynamic) -> Dynamic?): Promise + public fun finally(onFinally: () -> Unit): Promise public companion object { public fun reject(e: Dynamic): Promise diff --git a/libraries/stdlib/wasm/src/kotlin/reflect/reflection.kt b/libraries/stdlib/wasm/src/kotlin/reflect/reflection.kt index b4ecd0ddb27..5d1ebd6791a 100644 --- a/libraries/stdlib/wasm/src/kotlin/reflect/reflection.kt +++ b/libraries/stdlib/wasm/src/kotlin/reflect/reflection.kt @@ -12,6 +12,7 @@ import kotlin.reflect.wasm.internal.* internal fun getKClass(typeInfoData: TypeInfoData): KClass = KClassImpl(typeInfoData) +@Suppress("UNCHECKED_CAST") internal fun getKClassFromExpression(e: T): KClass = when (e) { is String -> PrimitiveClasses.stringClass diff --git a/libraries/stdlib/wasm/src/kotlin/text/StringsWasm.kt b/libraries/stdlib/wasm/src/kotlin/text/StringsWasm.kt index 8133991e113..0e7c600ef1d 100644 --- a/libraries/stdlib/wasm/src/kotlin/text/StringsWasm.kt +++ b/libraries/stdlib/wasm/src/kotlin/text/StringsWasm.kt @@ -299,9 +299,10 @@ public actual fun CharSequence.repeat(n: Int): String { 0 -> "" 1 -> this.toString() else -> { + val sequence = this buildString(n * length) { repeat(n) { - append(this@repeat) + append(sequence) } } } diff --git a/libraries/stdlib/wasm/src/kotlin/time/TimeSources.kt b/libraries/stdlib/wasm/src/kotlin/time/TimeSources.kt index 321f85cfc4b..68060b4d470 100644 --- a/libraries/stdlib/wasm/src/kotlin/time/TimeSources.kt +++ b/libraries/stdlib/wasm/src/kotlin/time/TimeSources.kt @@ -27,13 +27,13 @@ internal actual object MonotonicTimeSource : TimeSource.WithComparableMarks { if (performance != null) getPerformanceNow(performance) else dateNow() actual override fun markNow(): ValueTimeMark = ValueTimeMark(read()) - actual fun elapsedFrom(timeMark: ValueTimeMark): Duration = (read() - timeMark.reading as Double).milliseconds + actual fun elapsedFrom(timeMark: ValueTimeMark): Duration = (read() - timeMark.reading).milliseconds actual fun adjustReading(timeMark: ValueTimeMark, duration: Duration): ValueTimeMark = - ValueTimeMark(sumCheckNaN(timeMark.reading as Double + duration.toDouble(DurationUnit.MILLISECONDS))) + ValueTimeMark(sumCheckNaN(timeMark.reading + duration.toDouble(DurationUnit.MILLISECONDS))) actual fun differenceBetween(one: ValueTimeMark, another: ValueTimeMark): Duration { - val ms1 = one.reading as Double - val ms2 = another.reading as Double + val ms1 = one.reading + val ms2 = another.reading return if (ms1 == ms2) Duration.ZERO else (ms1 - ms2).milliseconds } diff --git a/libraries/stdlib/wasm/src/kotlin/wasm/unsafe/MemoryAccess.kt b/libraries/stdlib/wasm/src/kotlin/wasm/unsafe/MemoryAccess.kt index de4cc3d0733..8e6068d490b 100644 --- a/libraries/stdlib/wasm/src/kotlin/wasm/unsafe/MemoryAccess.kt +++ b/libraries/stdlib/wasm/src/kotlin/wasm/unsafe/MemoryAccess.kt @@ -52,21 +52,25 @@ public value class Pointer public constructor(public val address: UInt) { implementedAsIntrinsic /** Store a Byte (8 bit) [value] */ + @Suppress("UNUSED_PARAMETER") @WasmOp(WasmOp.I32_STORE8) public fun storeByte(value: Byte): Unit = implementedAsIntrinsic /** Store a Short (16 bit) [value] */ + @Suppress("UNUSED_PARAMETER") @WasmOp(WasmOp.I32_STORE16) public fun storeShort(value: Short): Unit = implementedAsIntrinsic /** Store an Int (32 bit) [value] */ + @Suppress("UNUSED_PARAMETER") @WasmOp(WasmOp.I32_STORE) public fun storeInt(value: Int): Unit = implementedAsIntrinsic /** Store a Long (64 bit) [value] */ + @Suppress("UNUSED_PARAMETER") @WasmOp(WasmOp.I64_STORE) public fun storeLong(value: Long): Unit = implementedAsIntrinsic diff --git a/libraries/stdlib/wasm/src/kotlin/wasm/unsafe/MemoryAllocation.kt b/libraries/stdlib/wasm/src/kotlin/wasm/unsafe/MemoryAllocation.kt index ec35e6706f5..f41eceba06d 100644 --- a/libraries/stdlib/wasm/src/kotlin/wasm/unsafe/MemoryAllocation.kt +++ b/libraries/stdlib/wasm/src/kotlin/wasm/unsafe/MemoryAllocation.kt @@ -151,6 +151,7 @@ internal fun wasmMemorySize(): Int = * Grow memory by a given delta (in pages). * Return the previous size, or -1 if enough memory cannot be allocated. */ +@Suppress("UNUSED_PARAMETER") @WasmOp(WasmOp.MEMORY_GROW) internal fun wasmMemoryGrow(delta: Int): Int = implementedAsIntrinsic \ No newline at end of file diff --git a/libraries/stdlib/wasm/src/kotlinx/dom/ItemArrayLike.kt b/libraries/stdlib/wasm/src/kotlinx/dom/ItemArrayLike.kt index fb5b3119b00..696a800f4a4 100644 --- a/libraries/stdlib/wasm/src/kotlinx/dom/ItemArrayLike.kt +++ b/libraries/stdlib/wasm/src/kotlinx/dom/ItemArrayLike.kt @@ -13,6 +13,7 @@ public external interface ItemArrayLike { public fun ItemArrayLike.asList(): List = object : AbstractList() { override val size: Int get() = this@asList.length + @Suppress("UNCHECKED_CAST") override fun get(index: Int): T = when (index) { in 0..lastIndex -> this@asList.item(index) as T else -> throw IndexOutOfBoundsException("index $index is not in range [0..$lastIndex]") diff --git a/libraries/stdlib/wasm/stubs/native/concurrent.kt b/libraries/stdlib/wasm/stubs/native/concurrent.kt index 183af955ce0..8c388627704 100644 --- a/libraries/stdlib/wasm/stubs/native/concurrent.kt +++ b/libraries/stdlib/wasm/stubs/native/concurrent.kt @@ -10,6 +10,7 @@ package kotlin.native.concurrent internal val Any?.isFrozen inline get() = false +@Suppress("NOTHING_TO_INLINE") internal inline fun T.freeze(): T = this internal class AtomicReference(public var value: T) {