From f016a823bb7b14ab66d0405d8470d2d4dd16410b Mon Sep 17 00:00:00 2001 From: ExE Boss <3889017+ExE-Boss@users.noreply.github.com> Date: Mon, 7 Dec 2020 19:45:00 +0100 Subject: [PATCH] =?UTF-8?q?lib:=20add=C2=A0`WebAssembly`=20to=C2=A0`primor?= =?UTF-8?q?dials`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Antoine du Hamel --- .eslintrc.js | 1 + lib/.eslintrc.yaml | 1 + lib/internal/freeze_intrinsics.js | 24 ++++++++++++++++-------- lib/internal/modules/esm/translators.js | 15 +++++++++------ lib/internal/per_context/primordials.js | 18 ++++++++++++++++++ 5 files changed, 45 insertions(+), 14 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index af1249eae6436e..894dfb50da17d3 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -304,6 +304,7 @@ module.exports = { MessagePort: 'readable', TextEncoder: 'readable', TextDecoder: 'readable', + WebAssembly: 'readonly', queueMicrotask: 'readable', globalThis: 'readable', }, diff --git a/lib/.eslintrc.yaml b/lib/.eslintrc.yaml index deea6bf4fb05ae..6869e0edbfd3bb 100644 --- a/lib/.eslintrc.yaml +++ b/lib/.eslintrc.yaml @@ -83,6 +83,7 @@ rules: into: Safe - name: WeakSet into: Safe + - name: WebAssembly globals: Intl: false # Parameters passed to internal modules diff --git a/lib/internal/freeze_intrinsics.js b/lib/internal/freeze_intrinsics.js index 50ae655206479a..51299d37239b1e 100644 --- a/lib/internal/freeze_intrinsics.js +++ b/lib/internal/freeze_intrinsics.js @@ -19,7 +19,7 @@ // https://github.com/google/caja/blob/master/src/com/google/caja/ses/repairES5.js // https://github.com/tc39/proposal-ses/blob/e5271cc42a257a05dcae2fd94713ed2f46c08620/shim/src/freeze.js -/* global WebAssembly, SharedArrayBuffer, console */ +/* global SharedArrayBuffer, console */ 'use strict'; const { @@ -107,6 +107,14 @@ const { WeakMapPrototype, WeakSet, WeakSetPrototype, + WebAssembly, + WebAssemblyModulePrototype, + WebAssemblyInstancePrototype, + WebAssemblyTablePrototype, + WebAssemblyMemoryPrototype, + WebAssemblyCompileErrorPrototype, + WebAssemblyLinkErrorPrototype, + WebAssemblyRuntimeErrorPrototype, } = primordials; module.exports = function() { @@ -192,13 +200,13 @@ module.exports = function() { // Other APIs / Web Compatibility console.Console.prototype, BigIntPrototype, - WebAssembly.Module.prototype, - WebAssembly.Instance.prototype, - WebAssembly.Table.prototype, - WebAssembly.Memory.prototype, - WebAssembly.CompileError.prototype, - WebAssembly.LinkError.prototype, - WebAssembly.RuntimeError.prototype, + WebAssemblyModulePrototype, + WebAssemblyInstancePrototype, + WebAssemblyTablePrototype, + WebAssemblyMemoryPrototype, + WebAssemblyCompileErrorPrototype, + WebAssemblyLinkErrorPrototype, + WebAssemblyRuntimeErrorPrototype, SharedArrayBuffer.prototype ]; const intrinsics = [ diff --git a/lib/internal/modules/esm/translators.js b/lib/internal/modules/esm/translators.js index 66636d9ce092b5..fe645a416ea309 100644 --- a/lib/internal/modules/esm/translators.js +++ b/lib/internal/modules/esm/translators.js @@ -1,7 +1,5 @@ 'use strict'; -/* global WebAssembly */ - const { ArrayPrototypeMap, Boolean, @@ -19,6 +17,11 @@ const { StringPrototypeSplit, StringPrototypeStartsWith, SyntaxErrorPrototype, + WebAssembly, + WebAssemblyCompile, + WebAssemblyInstance, + WebAssemblyModuleExports, + WebAssemblyModuleImports, } = primordials; let _TYPES = null; @@ -361,21 +364,21 @@ translators.set('wasm', async function(url) { debug(`Translating WASMModule ${url}`); let compiled; try { - compiled = await WebAssembly.compile(source); + compiled = await WebAssemblyCompile(source); } catch (err) { err.message = errPath(url) + ': ' + err.message; throw err; } const imports = - ArrayPrototypeMap(WebAssembly.Module.imports(compiled), + ArrayPrototypeMap(WebAssemblyModuleImports(compiled), ({ module }) => module); const exports = - ArrayPrototypeMap(WebAssembly.Module.exports(compiled), + ArrayPrototypeMap(WebAssemblyModuleExports(compiled), ({ name }) => name); return createDynamicModule(imports, exports, url, (reflect) => { - const { exports } = new WebAssembly.Instance(compiled, reflect.imports); + const { exports } = new WebAssemblyInstance(compiled, reflect.imports); for (const expt of ObjectKeys(exports)) reflect.exports[expt].set(exports[expt]); }).module; diff --git a/lib/internal/per_context/primordials.js b/lib/internal/per_context/primordials.js index 9f61b9e849dc2b..773cd8dce75c46 100644 --- a/lib/internal/per_context/primordials.js +++ b/lib/internal/per_context/primordials.js @@ -197,5 +197,23 @@ primordials.SafeWeakSet = makeSafe( copyPrototype(original.prototype, primordials, `${name}Prototype`); }); +if (typeof WebAssembly !== 'undefined') { + primordials.WebAssembly = WebAssembly; + + // Create copies of WebAssembly objects. + // Refs: https://webassembly.github.io/spec/js-api/index.html#idl-index + // Refs: https://heycam.github.io/webidl/#idl-namespaces + Object.getOwnPropertyNames(WebAssembly).forEach((propName) => { + const original = WebAssembly[propName]; + const name = `WebAssembly${getNewKey(propName)}`; + primordials[name] = original; + + copyPropsRenamed(original, primordials, name); + if ('prototype' in original) { + copyPrototype(original.prototype, primordials, `${name}Prototype`); + } + }); +} + Object.setPrototypeOf(primordials, null); Object.freeze(primordials);