mirror of
https://github.com/zebrajr/node.git
synced 2025-12-06 12:20:27 +01:00
wasm: enable JSPI
PR-URL: https://github.com/nodejs/node/pull/59941 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com> Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
This commit is contained in:
parent
81af7b93c5
commit
4396cf2d45
|
|
@ -782,6 +782,9 @@ static ExitCode ProcessGlobalArgsInternal(std::vector<std::string>* args,
|
||||||
|
|
||||||
v8_args.emplace_back("--js-source-phase-imports");
|
v8_args.emplace_back("--js-source-phase-imports");
|
||||||
|
|
||||||
|
// WebAssembly JS Promise Integration
|
||||||
|
v8_args.emplace_back("--experimental-wasm-jspi");
|
||||||
|
|
||||||
#ifdef __POSIX__
|
#ifdef __POSIX__
|
||||||
// Block SIGPROF signals when sleeping in epoll_wait/kevent/etc. Avoids the
|
// Block SIGPROF signals when sleeping in epoll_wait/kevent/etc. Avoids the
|
||||||
// performance penalty of frequent EINTR wakeups when the profiler is running.
|
// performance penalty of frequent EINTR wakeups when the profiler is running.
|
||||||
|
|
|
||||||
BIN
test/fixtures/wasm/jspi.wasm
vendored
Normal file
BIN
test/fixtures/wasm/jspi.wasm
vendored
Normal file
Binary file not shown.
44
test/parallel/test-wasm.mjs
Normal file
44
test/parallel/test-wasm.mjs
Normal file
|
|
@ -0,0 +1,44 @@
|
||||||
|
import '../common/index.mjs';
|
||||||
|
import { strictEqual } from 'node:assert';
|
||||||
|
import { readSync } from '../common/fixtures.mjs';
|
||||||
|
|
||||||
|
// Test Wasm JSPI
|
||||||
|
{
|
||||||
|
const asyncImport = async (x) => {
|
||||||
|
await new Promise((resolve) => setTimeout(resolve, 10));
|
||||||
|
return x + 42;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wasm/jspi.wasm contains:
|
||||||
|
*
|
||||||
|
* (module
|
||||||
|
* (type (;0;) (func (param i32) (result i32)))
|
||||||
|
* (import "js" "async" (func $async (;0;) (type 0)))
|
||||||
|
* (export "test" (func $test))
|
||||||
|
* (func $test (;1;) (type 0) (param $x i32) (result i32)
|
||||||
|
* local.get $x
|
||||||
|
* call $async
|
||||||
|
* )
|
||||||
|
* )
|
||||||
|
*
|
||||||
|
* Which is the JS equivalent to:
|
||||||
|
*
|
||||||
|
* import { async_ } from 'js';
|
||||||
|
* export function test (val) {
|
||||||
|
* return async_(val);
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* JSPI then allows turning this sync style Wasm call into async code
|
||||||
|
* that suspends on the promise.
|
||||||
|
*/
|
||||||
|
|
||||||
|
const { instance } = await WebAssembly.instantiate(readSync('wasm/jspi.wasm'), {
|
||||||
|
js: {
|
||||||
|
async: new WebAssembly.Suspending(asyncImport),
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const promisingExport = WebAssembly.promising(instance.exports.test);
|
||||||
|
strictEqual(await promisingExport(10), 52);
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user