From 9099d805a5e47e30c9d77dd1a766767ec02279ea Mon Sep 17 00:00:00 2001 From: ryuhei shima Date: Sun, 19 Apr 2026 17:18:10 +0900 Subject: [PATCH] wasi: accept int32 ptr in clock_time_get Fixes: https://github.com/nodejs/node/issues/62671 --- src/node_wasi.cc | 22 +++++++++--- src/node_wasi.h | 2 +- test/fixtures/wasi-uint32-int32.wasm | Bin 0 -> 362 bytes test/fixtures/wasi-uint32-int32.wat | 50 +++++++++++++++++++++++++++ test/wasi/test-wasi-uint32-int32.js | 42 ++++++++++++++++++++++ 5 files changed, 111 insertions(+), 5 deletions(-) create mode 100644 test/fixtures/wasi-uint32-int32.wasm create mode 100644 test/fixtures/wasi-uint32-int32.wat create mode 100644 test/wasi/test-wasi-uint32-int32.js diff --git a/src/node_wasi.cc b/src/node_wasi.cc index 7ee59f46331097..9c82df1916e4b9 100644 --- a/src/node_wasi.cc +++ b/src/node_wasi.cc @@ -36,6 +36,7 @@ using v8::FastApiCallbackOptions; using v8::FunctionCallbackInfo; using v8::FunctionTemplate; using v8::HandleScope; +using v8::Int32; using v8::Integer; using v8::Isolate; using v8::Local; @@ -306,6 +307,16 @@ uint32_t ConvertType(Local value) { return value.As()->Value(); } +template <> +bool CheckType(Local value) { + return value->IsInt32(); +} + +template <> +int32_t ConvertType(Local value) { + return value.As()->Value(); +} + template <> bool CheckType(Local value) { return value->IsBigInt(); @@ -486,14 +497,17 @@ uint32_t WASI::ClockTimeGet(WASI& wasi, WasmMemory memory, uint32_t clock_id, uint64_t precision, - uint32_t time_ptr) { - Debug(wasi, "clock_time_get(%d, %d, %d)\n", clock_id, precision, time_ptr); - CHECK_BOUNDS_OR_RETURN(memory.size, time_ptr, UVWASI_SERDES_SIZE_timestamp_t); + int32_t time_ptr) { + const auto time_ptr_u32 = static_cast(time_ptr); + Debug( + wasi, "clock_time_get(%d, %d, %d)\n", clock_id, precision, time_ptr_u32); + CHECK_BOUNDS_OR_RETURN( + memory.size, time_ptr_u32, UVWASI_SERDES_SIZE_timestamp_t); uvwasi_timestamp_t time; uvwasi_errno_t err = uvwasi_clock_time_get(&wasi.uvw_, clock_id, precision, &time); if (err == UVWASI_ESUCCESS) - uvwasi_serdes_write_timestamp_t(memory.data, time_ptr, time); + uvwasi_serdes_write_timestamp_t(memory.data, time_ptr_u32, time); return err; } diff --git a/src/node_wasi.h b/src/node_wasi.h index 25551936e6be36..383bd17bf7d639 100644 --- a/src/node_wasi.h +++ b/src/node_wasi.h @@ -31,7 +31,7 @@ class WASI : public BaseObject, static uint32_t ArgsGet(WASI&, WasmMemory, uint32_t, uint32_t); static uint32_t ArgsSizesGet(WASI&, WasmMemory, uint32_t, uint32_t); static uint32_t ClockResGet(WASI&, WasmMemory, uint32_t, uint32_t); - static uint32_t ClockTimeGet(WASI&, WasmMemory, uint32_t, uint64_t, uint32_t); + static uint32_t ClockTimeGet(WASI&, WasmMemory, uint32_t, uint64_t, int32_t); static uint32_t EnvironGet(WASI&, WasmMemory, uint32_t, uint32_t); static uint32_t EnvironSizesGet(WASI&, WasmMemory, uint32_t, uint32_t); static uint32_t FdAdvise( diff --git a/test/fixtures/wasi-uint32-int32.wasm b/test/fixtures/wasi-uint32-int32.wasm new file mode 100644 index 0000000000000000000000000000000000000000..d82ca14a53466f51295a7e6b02fe0adebd477f46 GIT binary patch literal 362 zcmaKkO9}!p5JamJorr=8g1XVYOZ5bL1TPSS1Pz*rOyYOpcr>Ew|x)E name); + +(async () => { + const wasi = new WASI({ version: 'preview1', returnOnExit: true }); + const importObject = { wasi_snapshot_preview1: wasi.wasiImport }; + const { instance } = await WebAssembly.instantiate(wasm, importObject); + + assert.deepStrictEqual( + Object.keys(instance.exports).sort(), + ['_start', 'memory', ...kWasiUint32ExportNames].sort(), + ); + + wasi.start(instance); + + for (const [name, expectedErrno] of kWasiUint32Expectations) { + assert.strictEqual( + instance.exports[name](), + expectedErrno, + name, + ); + } +})().then(common.mustCall());