[Wasm] Use Wasm GC arrays instead of JS arrays

JS arrays was a workaround for lack of arrays in Firefox Wasm GC prototype
Now with V8 as a test runner we can use proper arrays
This commit is contained in:
Svyatoslav Kuzmich
2020-12-07 15:42:55 +03:00
parent d15af70a3e
commit d4233f3f0e
15 changed files with 400 additions and 276 deletions
@@ -1,153 +0,0 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package kotlin.wasm.internal
@ExcludedFromCodegen
@WasmForeign
internal class WasmExternRef
@WasmImport("runtime", "JsArray_new")
internal fun JsArray_new(size: Int): WasmExternRef =
implementedAsIntrinsic
@WasmImport("runtime", "JsArray_get")
internal fun JsArray_get_Byte(array: WasmExternRef, index: Int): Byte = implementedAsIntrinsic
@WasmImport("runtime", "JsArray_set")
internal fun JsArray_set_Byte(array: WasmExternRef, index: Int, value: Byte): Unit = implementedAsIntrinsic
@WasmImport("runtime", "JsArray_get")
internal fun JsArray_get_Char(array: WasmExternRef, index: Int): Char = implementedAsIntrinsic
@WasmImport("runtime", "JsArray_set")
internal fun JsArray_set_Char(array: WasmExternRef, index: Int, value: Char): Unit = implementedAsIntrinsic
@WasmImport("runtime", "JsArray_get")
internal fun JsArray_get_Short(array: WasmExternRef, index: Int): Short = implementedAsIntrinsic
@WasmImport("runtime", "JsArray_set")
internal fun JsArray_set_Short(array: WasmExternRef, index: Int, value: Short): Unit = implementedAsIntrinsic
@WasmImport("runtime", "JsArray_get")
internal fun JsArray_get_Int(array: WasmExternRef, index: Int): Int = implementedAsIntrinsic
@WasmImport("runtime", "JsArray_set")
internal fun JsArray_set_Int(array: WasmExternRef, index: Int, value: Int): Unit = implementedAsIntrinsic
@WasmImport("runtime", "JsArray_get")
internal fun JsArray_get_Long(array: WasmExternRef, index: Int): Long = implementedAsIntrinsic
@WasmImport("runtime", "JsArray_set")
internal fun JsArray_set_Long(array: WasmExternRef, index: Int, value: Long): Unit = implementedAsIntrinsic
@WasmImport("runtime", "JsArray_get")
internal fun JsArray_get_Float(array: WasmExternRef, index: Int): Float = implementedAsIntrinsic
@WasmImport("runtime", "JsArray_set")
internal fun JsArray_set_Float(array: WasmExternRef, index: Int, value: Float): Unit = implementedAsIntrinsic
@WasmImport("runtime", "JsArray_get")
internal fun JsArray_get_Double(array: WasmExternRef, index: Int): Double = implementedAsIntrinsic
@WasmImport("runtime", "JsArray_set")
internal fun JsArray_set_Double(array: WasmExternRef, index: Int, value: Double): Unit = implementedAsIntrinsic
@WasmImport("runtime", "JsArray_get")
internal fun JsArray_get_Boolean(array: WasmExternRef, index: Int): Boolean = implementedAsIntrinsic
@WasmImport("runtime", "JsArray_set")
internal fun JsArray_set_Boolean(array: WasmExternRef, index: Int, value: Boolean): Unit = implementedAsIntrinsic
@WasmImport("runtime", "JsArray_get")
internal fun JsArray_get_WasmExternRef(array: WasmExternRef, index: Int): WasmExternRef = implementedAsIntrinsic
@WasmImport("runtime", "JsArray_set")
internal fun JsArray_set_WasmExternRef(array: WasmExternRef, index: Int, value: WasmExternRef): Unit = implementedAsIntrinsic
@WasmImport("runtime", "JsArray_getSize")
internal fun JsArray_getSize(array: WasmExternRef): Int =
implementedAsIntrinsic
@JsFun("(x) => x")
internal fun Any?.toWasmExternRef(): WasmExternRef =
implementedAsIntrinsic
@JsFun("(x) => x")
internal fun WasmExternRefToAny(ref: WasmExternRef): Any? =
implementedAsIntrinsic
internal inline fun JsArray_fill_Byte(array: WasmExternRef, size: Int, init: (Int) -> Byte) {
var i = 0
while (i < size) {
JsArray_set_Byte(array, i, init(i))
i++
}
}
internal inline fun JsArray_fill_Char(array: WasmExternRef, size: Int, init: (Int) -> Char) {
var i = 0
while (i < size) {
JsArray_set_Char(array, i, init(i))
i++
}
}
internal inline fun JsArray_fill_Short(array: WasmExternRef, size: Int, init: (Int) -> Short) {
var i = 0
while (i < size) {
JsArray_set_Short(array, i, init(i))
i++
}
}
internal inline fun JsArray_fill_Int(array: WasmExternRef, size: Int, init: (Int) -> Int) {
var i = 0
while (i < size) {
JsArray_set_Int(array, i, init(i))
i++
}
}
internal inline fun JsArray_fill_Long(array: WasmExternRef, size: Int, init: (Int) -> Long) {
var i = 0
while (i < size) {
JsArray_set_Long(array, i, init(i))
i++
}
}
internal inline fun JsArray_fill_Float(array: WasmExternRef, size: Int, init: (Int) -> Float) {
var i = 0
while (i < size) {
JsArray_set_Float(array, i, init(i))
i++
}
}
internal inline fun JsArray_fill_Double(array: WasmExternRef, size: Int, init: (Int) -> Double) {
var i = 0
while (i < size) {
JsArray_set_Double(array, i, init(i))
i++
}
}
internal inline fun JsArray_fill_Boolean(array: WasmExternRef, size: Int, init: (Int) -> Boolean) {
var i = 0
while (i < size) {
JsArray_set_Boolean(array, i, init(i))
i++
}
}
internal inline fun <T> JsArray_fill_T(array: WasmExternRef, size: Int, init: (Int) -> T) {
var i = 0
while (i < size) {
JsArray_set_WasmExternRef(array, i, init(i).toWasmExternRef())
i++
}
}
@@ -6,6 +6,7 @@
package kotlin.wasm.internal
import kotlin.annotation.AnnotationTarget.*
import kotlin.reflect.KClass
// Exclude declaration or file from lowering and code generation
@Target(FILE, CLASS, FUNCTION, CONSTRUCTOR, PROPERTY)
@@ -20,6 +21,13 @@ internal annotation class WasmImport(val module: String, val name: String)
@Retention(AnnotationRetention.BINARY)
internal annotation class WasmForeign
@Target(CLASS)
@Retention(AnnotationRetention.BINARY)
internal annotation class WasmArrayOf(
val type: KClass<*>,
val isNullable: Boolean,
)
@Target(AnnotationTarget.FUNCTION)
@Retention(AnnotationRetention.BINARY)
internal annotation class WasmReinterpret