| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 | /*	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;
 |