Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

wasi: make returnOnExit true by default #47390

Closed
wants to merge 7 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 8 additions & 4 deletions doc/api/wasi.md
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,9 @@ changes:
- version: REPLACEME
pr-url: https://github.com/nodejs/node/pull/47391
description: The version option is now required and has no default value.
- version: REPLACEME
pr-url: https://github.com/nodejs/node/pull/47390
description: default value of returnOnExit changed to true.
- version: v19.8.0
pr-url: https://github.com/nodejs/node/pull/46469
description: version field added to options.
Expand All @@ -136,10 +139,11 @@ changes:
sandbox directory structure. The string keys of `preopens` are treated as
directories within the sandbox. The corresponding values in `preopens` are
the real paths to those directories on the host machine.
* `returnOnExit` {boolean} By default, WASI applications terminate the Node.js
process via the `__wasi_proc_exit()` function. Setting this option to `true`
causes `wasi.start()` to return the exit code rather than terminate the
process. **Default:** `false`.
* `returnOnExit` {boolean} By default, when WASI applications call
`__wasi_proc_exit()` `wasi.start()` will return with the exit code
specified rather than terminatng the process. Setting this option to
`false` will cause the Node.js process to exit with the specified
exit code instead. **Default:** `true`.
* `stdin` {integer} The file descriptor used as standard input in the
WebAssembly application. **Default:** `0`.
* `stdout` {integer} The file descriptor used as standard output in the
Expand Down
6 changes: 4 additions & 2 deletions lib/wasi.js
Original file line number Diff line number Diff line change
Expand Up @@ -102,11 +102,13 @@ class WASI {
wrap[prop] = FunctionPrototypeBind(wrap[prop], wrap);
}

let returnOnExit = true;
if (options.returnOnExit !== undefined) {
validateBoolean(options.returnOnExit, 'options.returnOnExit');
if (options.returnOnExit)
wrap.proc_exit = FunctionPrototypeBind(wasiReturnOnProcExit, this);
returnOnExit = options.returnOnExit;
}
if (returnOnExit)
wrap.proc_exit = FunctionPrototypeBind(wasiReturnOnProcExit, this);

this[kSetMemory] = wrap._setMemory;
delete wrap._setMemory;
Expand Down
18 changes: 17 additions & 1 deletion test/wasi/test-wasi.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,15 @@
'use strict';
const common = require('../common');

function returnOnExitEnvToValue(env) {
const envValue = env.RETURN_ON_EXIT;
if (envValue === undefined) {
return undefined;
}

return envValue === 'true';
}

if (process.argv[2] === 'wasi-child-preview1') {
// Test version set to preview1
const assert = require('assert');
Expand All @@ -23,6 +32,7 @@ if (process.argv[2] === 'wasi-child-preview1') {
'/sandbox': fixtures.path('wasi'),
'/tmp': tmpdir.path,
},
returnOnExit: returnOnExitEnvToValue(process.env),
});

// Validate the getImportObject helper
Expand Down Expand Up @@ -56,6 +66,10 @@ if (process.argv[2] === 'wasi-child-preview1') {
if (options.stdin !== undefined)
opts.input = options.stdin;

if ('returnOnExit' in options) {
opts.env.RETURN_ON_EXIT = options.returnOnExit;
}

const child = cp.spawnSync(process.execPath, [
...args,
__filename,
Expand All @@ -79,7 +93,9 @@ if (process.argv[2] === 'wasi-child-preview1') {
if (!common.isIBMi) {
runWASI({ test: 'clock_getres' });
}
runWASI({ test: 'exitcode', exitCode: 120 });
runWASI({ test: 'exitcode' });
runWASI({ test: 'exitcode', returnOnExit: true });
runWASI({ test: 'exitcode', exitCode: 120, returnOnExit: false });
runWASI({ test: 'fd_prestat_get_refresh' });
runWASI({ test: 'freopen', stdout: `hello from input2.txt${checkoutEOL}` });
runWASI({ test: 'ftruncate' });
Expand Down