Skip to content

Commit

Permalink
wasi: clean up options validation
Browse files Browse the repository at this point in the history
PR-URL: nodejs#31797
Reviewed-By: Jiawen Geng <[email protected]>
Reviewed-By: Ruben Bridgewater <[email protected]>
Reviewed-By: Anna Henningsen <[email protected]>
  • Loading branch information
lundibundi authored and targos committed Apr 25, 2020
1 parent ae1ad19 commit 4dd81e6
Showing 1 changed file with 25 additions and 35 deletions.
60 changes: 25 additions & 35 deletions lib/wasi.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
'use strict';
/* global WebAssembly */
const {
ArrayIsArray,
ArrayPrototypeMap,
ArrayPrototypePush,
FunctionPrototypeBind,
Expand All @@ -13,6 +12,11 @@ const {
ERR_WASI_ALREADY_STARTED
} = require('internal/errors').codes;
const { emitExperimentalWarning } = require('internal/util');
const {
validateArray,
validateBoolean,
validateObject,
} = require('internal/validators');
const { WASI: _WASI } = internalBinding('wasi');
const kExitCode = Symbol('exitCode');
const kSetMemory = Symbol('setMemory');
Expand All @@ -23,52 +27,39 @@ emitExperimentalWarning('WASI');

class WASI {
constructor(options = {}) {
if (options === null || typeof options !== 'object')
throw new ERR_INVALID_ARG_TYPE('options', 'object', options);

const { env, preopens, returnOnExit = false } = options;
let { args = [] } = options;
validateObject(options, 'options');

if (ArrayIsArray(args))
args = ArrayPrototypeMap(args, (arg) => { return String(arg); });
else
throw new ERR_INVALID_ARG_TYPE('options.args', 'Array', args);
if (options.args !== undefined)
validateArray(options.args, 'options.args');
const args = ArrayPrototypeMap(options.args || [], String);

const envPairs = [];

if (env !== null && typeof env === 'object') {
for (const key in env) {
const value = env[key];
const env = [];
if (options.env !== undefined) {
validateObject(options.env, 'options.env');
for (const [key, value] of ObjectEntries(options.env)) {
if (value !== undefined)
ArrayPrototypePush(envPairs, `${key}=${value}`);
ArrayPrototypePush(env, `${key}=${value}`);
}
} else if (env !== undefined) {
throw new ERR_INVALID_ARG_TYPE('options.env', 'Object', env);
}

const preopenArray = [];

if (typeof preopens === 'object' && preopens !== null) {
for (const [key, value] of ObjectEntries(preopens)) {
ArrayPrototypePush(preopenArray, String(key), String(value));
const preopens = [];
if (options.preopens !== undefined) {
validateObject(options.preopens, 'options.preopens');
for (const [key, value] of ObjectEntries(options.preopens)) {
ArrayPrototypePush(preopens, String(key), String(value));
}
} else if (preopens !== undefined) {
throw new ERR_INVALID_ARG_TYPE('options.preopens', 'Object', preopens);
}

if (typeof returnOnExit !== 'boolean') {
throw new ERR_INVALID_ARG_TYPE(
'options.returnOnExit', 'boolean', returnOnExit);
}

const wrap = new _WASI(args, envPairs, preopenArray);
const wrap = new _WASI(args, env, preopens);

for (const prop in wrap) {
wrap[prop] = FunctionPrototypeBind(wrap[prop], wrap);
}

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

this[kSetMemory] = wrap._setMemory;
Expand All @@ -86,8 +77,7 @@ class WASI {

const exports = instance.exports;

if (exports === null || typeof exports !== 'object')
throw new ERR_INVALID_ARG_TYPE('instance.exports', 'Object', exports);
validateObject(exports, 'instance.exports');

const { memory } = exports;

Expand Down

0 comments on commit 4dd81e6

Please sign in to comment.