aboutsummaryrefslogtreecommitdiff
path: root/node_modules/webpack/lib/wasm/WebAssemblyJavascriptGenerator.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/webpack/lib/wasm/WebAssemblyJavascriptGenerator.js')
-rw-r--r--node_modules/webpack/lib/wasm/WebAssemblyJavascriptGenerator.js152
1 files changed, 152 insertions, 0 deletions
diff --git a/node_modules/webpack/lib/wasm/WebAssemblyJavascriptGenerator.js b/node_modules/webpack/lib/wasm/WebAssemblyJavascriptGenerator.js
new file mode 100644
index 00000000..22dfb791
--- /dev/null
+++ b/node_modules/webpack/lib/wasm/WebAssemblyJavascriptGenerator.js
@@ -0,0 +1,152 @@
+/*
+ MIT License http://www.opensource.org/licenses/mit-license.php
+ Author Tobias Koppers @sokra
+*/
+"use strict";
+
+const Generator = require("../Generator");
+const Template = require("../Template");
+const { RawSource } = require("webpack-sources");
+const WebAssemblyImportDependency = require("../dependencies/WebAssemblyImportDependency");
+const WebAssemblyExportImportedDependency = require("../dependencies/WebAssemblyExportImportedDependency");
+
+/** @typedef {import("../NormalModule")} NormalModule */
+/** @typedef {import("../RuntimeTemplate")} RuntimeTemplate */
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("../Dependency").DependencyTemplate} DependencyTemplate */
+
+class WebAssemblyJavascriptGenerator extends Generator {
+ /**
+ * @param {NormalModule} module module for which the code should be generated
+ * @param {Map<Function, DependencyTemplate>} dependencyTemplates mapping from dependencies to templates
+ * @param {RuntimeTemplate} runtimeTemplate the runtime template
+ * @param {string} type which kind of code should be generated
+ * @returns {Source} generated code
+ */
+ generate(module, dependencyTemplates, runtimeTemplate, type) {
+ const initIdentifer = Array.isArray(module.usedExports)
+ ? Template.numberToIdentifer(module.usedExports.length)
+ : "__webpack_init__";
+
+ let needExportsCopy = false;
+ const importedModules = new Map();
+ const initParams = [];
+ let index = 0;
+ for (const dep of module.dependencies) {
+ const depAsAny = /** @type {any} */ (dep);
+ if (dep.module) {
+ let importData = importedModules.get(dep.module);
+ if (importData === undefined) {
+ importedModules.set(
+ dep.module,
+ (importData = {
+ importVar: `m${index}`,
+ index,
+ request:
+ "userRequest" in depAsAny ? depAsAny.userRequest : undefined,
+ names: new Set(),
+ reexports: []
+ })
+ );
+ index++;
+ }
+ if (dep instanceof WebAssemblyImportDependency) {
+ importData.names.add(dep.name);
+ if (dep.description.type === "GlobalType") {
+ const exportName = dep.name;
+ const usedName = dep.module && dep.module.isUsed(exportName);
+
+ if (dep.module) {
+ if (usedName) {
+ initParams.push(
+ runtimeTemplate.exportFromImport({
+ module: dep.module,
+ request: dep.request,
+ importVar: importData.importVar,
+ originModule: module,
+ exportName: dep.name,
+ asiSafe: true,
+ isCall: false,
+ callContext: null
+ })
+ );
+ }
+ }
+ }
+ }
+ if (dep instanceof WebAssemblyExportImportedDependency) {
+ importData.names.add(dep.name);
+ const usedName = module.isUsed(dep.exportName);
+ if (usedName) {
+ const exportProp = `${module.exportsArgument}[${JSON.stringify(
+ usedName
+ )}]`;
+ const defineStatement = Template.asString([
+ `${exportProp} = ${runtimeTemplate.exportFromImport({
+ module: dep.module,
+ request: dep.request,
+ importVar: importData.importVar,
+ originModule: module,
+ exportName: dep.name,
+ asiSafe: true,
+ isCall: false,
+ callContext: null
+ })};`,
+ `if(WebAssembly.Global) ${exportProp} = ` +
+ `new WebAssembly.Global({ value: ${JSON.stringify(
+ dep.valueType
+ )} }, ${exportProp});`
+ ]);
+ importData.reexports.push(defineStatement);
+ needExportsCopy = true;
+ }
+ }
+ }
+ }
+ const importsCode = Template.asString(
+ Array.from(
+ importedModules,
+ ([module, { importVar, request, reexports }]) => {
+ const importStatement = runtimeTemplate.importStatement({
+ module,
+ request,
+ importVar,
+ originModule: module
+ });
+ return importStatement + reexports.join("\n");
+ }
+ )
+ );
+
+ // create source
+ const source = new RawSource(
+ [
+ '"use strict";',
+ "// Instantiate WebAssembly module",
+ "var wasmExports = __webpack_require__.w[module.i];",
+
+ !Array.isArray(module.usedExports)
+ ? `__webpack_require__.r(${module.exportsArgument});`
+ : "",
+
+ // this must be before import for circular dependencies
+ "// export exports from WebAssembly module",
+ Array.isArray(module.usedExports) && !needExportsCopy
+ ? `${module.moduleArgument}.exports = wasmExports;`
+ : "for(var name in wasmExports) " +
+ `if(name != ${JSON.stringify(initIdentifer)}) ` +
+ `${module.exportsArgument}[name] = wasmExports[name];`,
+ "// exec imports from WebAssembly module (for esm order)",
+ importsCode,
+ "",
+ "// exec wasm module",
+ `wasmExports[${JSON.stringify(initIdentifer)}](${initParams.join(
+ ", "
+ )})`
+ ].join("\n")
+ );
+ return source;
+ }
+}
+
+module.exports = WebAssemblyJavascriptGenerator;