~ trap on "wasi_snapshot_preview1" APIs which allow to run wasi tests as is
diff --git a/libraries/kotlin.test/wasm/wasi/src/main/kotlin/kotlin/test/TeamcityAdapter.kt b/libraries/kotlin.test/wasm/wasi/src/main/kotlin/kotlin/test/TeamcityAdapter.kt
index 5091893..520b3c8 100644
--- a/libraries/kotlin.test/wasm/wasi/src/main/kotlin/kotlin/test/TeamcityAdapter.kt
+++ b/libraries/kotlin.test/wasm/wasi/src/main/kotlin/kotlin/test/TeamcityAdapter.kt
@@ -14,20 +14,20 @@
* `args_sizes_get`. Each argument is expected to be `\0` terminated.
*/
@ExperimentalWasmInterop
-//@WasmImport("wasi_snapshot_preview1", "args_get")
-private fun wasiRawArgsGet(
+@WasmImport("wasi_snapshot_preview1", "args_get")
+private external fun wasiRawArgsGet(
argvPtr: Int,
argvBuf: Int,
-): Int = TODO()
+): Int
/** Return command-line argument data sizes. */
@ExperimentalWasmInterop
-//@WasmImport("wasi_snapshot_preview1", "args_sizes_get")
-private fun wasiRawArgsSizesGet(
+@WasmImport("wasi_snapshot_preview1", "args_sizes_get")
+private external fun wasiRawArgsSizesGet(
argumentNumberPtr: Int,
argumentStringSizePtr: Int,
-): Int = TODO()
+): Int
@OptIn(UnsafeWasmMemoryApi::class, ExperimentalWasmInterop::class)
internal actual fun getArguments(): List<String> = withScopedMemoryAllocator { allocator ->
diff --git a/libraries/stdlib/wasm/wasi/src/kotlin/io.kt b/libraries/stdlib/wasm/wasi/src/kotlin/io.kt
index 2cbd588..d998c43 100644
--- a/libraries/stdlib/wasm/wasi/src/kotlin/io.kt
+++ b/libraries/stdlib/wasm/wasi/src/kotlin/io.kt
@@ -19,8 +19,8 @@
* Write to a file descriptor. Note: This is similar to `writev` in POSIX.
*/
@ExperimentalWasmInterop
-//@WasmImport("wasi_snapshot_preview1", "fd_write")
-private fun wasiRawFdWrite(descriptor: Int, scatterPtr: Int, scatterSize: Int, errorPtr: Int): Int = TODO()
+@WasmImport("wasi_snapshot_preview1", "fd_write")
+private external fun wasiRawFdWrite(descriptor: Int, scatterPtr: Int, scatterSize: Int, errorPtr: Int): Int
@OptIn(ExperimentalWasmInterop::class)
internal fun wasiPrintImpl(
diff --git a/libraries/stdlib/wasm/wasi/src/kotlin/random/PlatformRandom.kt b/libraries/stdlib/wasm/wasi/src/kotlin/random/PlatformRandom.kt
index cf93883..cf8d3e1 100644
--- a/libraries/stdlib/wasm/wasi/src/kotlin/random/PlatformRandom.kt
+++ b/libraries/stdlib/wasm/wasi/src/kotlin/random/PlatformRandom.kt
@@ -18,8 +18,8 @@
* seed a pseudo-random number generator, rather than to provide the random data directly.
*/
@ExperimentalWasmInterop
-//@WasmImport("wasi_snapshot_preview1", "random_get")
-internal fun wasiRawRandomGet(address: Int, size: Int): Int = TODO()
+@WasmImport("wasi_snapshot_preview1", "random_get")
+internal external fun wasiRawRandomGet(address: Int, size: Int): Int
@OptIn(ExperimentalWasmInterop::class)
private fun wasiRandomGet(): Long {
diff --git a/libraries/stdlib/wasm/wasi/src/kotlin/time/TimeSources.kt b/libraries/stdlib/wasm/wasi/src/kotlin/time/TimeSources.kt
index 8fa450c..8e61633 100644
--- a/libraries/stdlib/wasm/wasi/src/kotlin/time/TimeSources.kt
+++ b/libraries/stdlib/wasm/wasi/src/kotlin/time/TimeSources.kt
@@ -29,8 +29,8 @@
* Return the time value of a clock. Note: This is similar to `clock_gettime` in POSIX.
*/
@ExperimentalWasmInterop
-//@WasmImport("wasi_snapshot_preview1", "clock_time_get")
-private fun wasiRawClockTimeGet(clockId: Int, precision: Long, resultPtr: Int): Int = TODO()
+@WasmImport("wasi_snapshot_preview1", "clock_time_get")
+private external fun wasiRawClockTimeGet(clockId: Int, precision: Long, resultPtr: Int): Int
/**
* Returns timestamp of the given clock in nanoseconds.
diff --git a/wasm/wasm.tests/run.wast b/wasm/wasm.tests/run.wast
new file mode 100644
index 0000000..9b7eb72
--- /dev/null
+++ b/wasm/wasm.tests/run.wast
@@ -0,0 +1,43 @@
+(module
+ (func $print_i32 (import "spectest" "print_i32") (param i32))
+
+ (func (export "fd_write") (param i32 i32 i32 i32) (result i32)
+ (i32.const 701)
+ (call $print_i32)
+ (i32.const 11)
+ (unreachable)
+ )
+ (func (export "random_get") (param i32 i32) (result i32)
+ (i32.const 702)
+ (call $print_i32)
+ (unreachable)
+ )
+ ;;???
+ (func (export "args_get") (param i32 i32) (result i32)
+ (i32.const 703)
+ (call $print_i32)
+ (unreachable)
+ )
+ (func (export "args_sizes_get") (param i32 i32) (result i32)
+ (i32.const 704)
+ (call $print_i32)
+ (unreachable)
+ )
+ ;;???
+ (func (export "clock_time_get") (param i32 i64 i32) (result i32)
+ (i32.const 705)
+ (call $print_i32)
+ (unreachable)
+ )
+ ;; test
+ (func (export "proc_exit") (param i32)
+ (i32.const 706)
+ (call $print_i32)
+ (unreachable)
+ )
+)
+(register "wasi_snapshot_preview1")
+(input "index.wasm")
+(module instance)
+(invoke "_initialize")
+(invoke "runBoxTest")
diff --git a/wasm/wasm.tests/testFixtures/org/jetbrains/kotlin/wasm/test/tools/WasmVM.kt b/wasm/wasm.tests/testFixtures/org/jetbrains/kotlin/wasm/test/tools/WasmVM.kt
index ecb5003..a950c48 100644
--- a/wasm/wasm.tests/testFixtures/org/jetbrains/kotlin/wasm/test/tools/WasmVM.kt
+++ b/wasm/wasm.tests/testFixtures/org/jetbrains/kotlin/wasm/test/tools/WasmVM.kt
@@ -115,6 +115,7 @@
}
object StackSwitching : WasmVM("StackSwitching", property = "wasm.engine.path.StackSwitching", entryPointIsJsFile = false) {
+ val runScriptPath = File("wasm/wasm.tests/run.wast").absolutePath
override fun run(
entryFile: String,
jsFiles: List<String>,
@@ -123,16 +124,18 @@
toolArgs: List<String>,
): String {
require(jsFiles.isEmpty())
+ require(entryFile == "./index.wasm") //TODO
require(useNewExceptionHandling)
return tool.run(
*toolArgs.toTypedArray(),
- entryFile,
+// entryFile,
"-e",
- "(module instance) (invoke \"_initialize\") (invoke \"runBoxTest\")",
+ "(input \"$runScriptPath\")",
workingDirectory = workingDirectory,
)
}
}
+// (input "/Users/zalim.bashorov/dev/kotlin_1/tmp/run.wast")
companion object {
// TODO remove .local
diff --git a/wasm/wasm.tests/wasiBoxTestRun.kt b/wasm/wasm.tests/wasiBoxTestRun.kt
index a3fba28..6bf000b 100644
--- a/wasm/wasm.tests/wasiBoxTestRun.kt
+++ b/wasm/wasm.tests/wasiBoxTestRun.kt
@@ -4,8 +4,28 @@
*/
@kotlin.wasm.WasmExport
-fun runBoxTest(): Int {
+fun runBoxTest(): Boolean {
val boxResult = box()
val isOk = boxResult == "OK"
- return if (isOk) 1 else 0
+ if (!isOk) {
+ println("Wrong box result '${boxResult}'; Expected 'OK'")
+ }
+ return isOk
}
+
+@kotlin.wasm.WasmImport("wasi_snapshot_preview1", "proc_exit")
+private external fun wasiProcExit(code: Int)
+
+@kotlin.wasm.WasmExport
+fun startTest() {
+ try {
+ if (!runBoxTest()) {
+ wasiProcExit(1)
+ }
+ } catch (e: Throwable) {
+ println("Failed with exception!")
+ println(e.message)
+ println(e.printStackTrace())
+ wasiProcExit(1)
+ }
+}
\ No newline at end of file