2018-04-28 00:53:07 +08:00
|
|
|
/*
|
|
|
|
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");
|
|
|
|
|
|
|
|
function generateInitParams(module) {
|
|
|
|
const list = [];
|
|
|
|
|
|
|
|
for (const dep of module.dependencies) {
|
|
|
|
if (dep instanceof WebAssemblyImportDependency) {
|
|
|
|
if (dep.description.type === "GlobalType") {
|
|
|
|
const exportName = dep.name;
|
|
|
|
const usedName = dep.module && dep.module.isUsed(exportName);
|
|
|
|
|
2018-05-05 00:52:07 +08:00
|
|
|
if (dep.module === null) {
|
|
|
|
// Dependency was not found, an error will be thrown later
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
2018-04-28 00:53:07 +08:00
|
|
|
if (usedName !== false) {
|
|
|
|
list.push(
|
|
|
|
`__webpack_require__(${JSON.stringify(
|
|
|
|
dep.module.id
|
|
|
|
)})[${JSON.stringify(usedName)}]`
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return list;
|
|
|
|
}
|
|
|
|
|
|
|
|
class WebAssemblyJavascriptGenerator extends Generator {
|
|
|
|
generate(module, dependencyTemplates, runtimeTemplate) {
|
2018-05-09 22:19:31 +08:00
|
|
|
const initIdentifer = Array.isArray(module.usedExports)
|
|
|
|
? Template.numberToIdentifer(module.usedExports.length)
|
|
|
|
: "__webpack_init__";
|
2018-04-28 00:53:07 +08:00
|
|
|
|
|
|
|
const generateImports = () => {
|
|
|
|
const modules = new Map();
|
|
|
|
for (const dep of module.dependencies) {
|
|
|
|
if (dep.module) modules.set(dep.module, dep.userRequest);
|
|
|
|
}
|
|
|
|
return Template.asString(
|
|
|
|
Array.from(modules, ([m, r]) => {
|
2018-04-28 15:57:21 +08:00
|
|
|
return `${runtimeTemplate.moduleRaw({
|
2018-04-28 00:53:07 +08:00
|
|
|
module: m,
|
|
|
|
request: r
|
2018-04-28 15:57:21 +08:00
|
|
|
})};`;
|
2018-04-28 00:53:07 +08:00
|
|
|
})
|
|
|
|
);
|
|
|
|
};
|
|
|
|
|
|
|
|
// FIXME(sven): assert that the exports exists in the modules
|
|
|
|
// otherwise it will default to i32 0
|
|
|
|
const initParams = generateInitParams(module).join(",");
|
2018-04-28 15:57:21 +08:00
|
|
|
|
|
|
|
// create source
|
2018-04-28 00:53:07 +08:00
|
|
|
const source = new RawSource(
|
|
|
|
[
|
|
|
|
'"use strict";',
|
|
|
|
"// Instantiate WebAssembly module",
|
2018-05-09 22:19:31 +08:00
|
|
|
"var wasmExports = __webpack_require__.w[module.i];",
|
2018-04-28 00:53:07 +08:00
|
|
|
|
2018-04-28 15:57:21 +08:00
|
|
|
// this must be before import for circular dependencies
|
2018-04-28 00:53:07 +08:00
|
|
|
"// export exports from WebAssembly module",
|
2018-05-09 22:19:31 +08:00
|
|
|
Array.isArray(module.usedExports)
|
|
|
|
? `${module.moduleArgument}.exports = wasmExports;`
|
|
|
|
: "for(var name in wasmExports) " +
|
|
|
|
`if(name != ${JSON.stringify(initIdentifer)}) ` +
|
|
|
|
`${module.exportsArgument}[name] = wasmExports[name];`,
|
2018-04-28 15:57:21 +08:00
|
|
|
"// exec imports from WebAssembly module (for esm order)",
|
2018-04-28 00:53:07 +08:00
|
|
|
generateImports(),
|
|
|
|
|
2018-04-28 15:57:21 +08:00
|
|
|
"// exec wasm module",
|
2018-05-09 22:19:31 +08:00
|
|
|
`wasmExports[${JSON.stringify(initIdentifer)}](${initParams})`
|
2018-04-28 00:53:07 +08:00
|
|
|
].join("\n")
|
|
|
|
);
|
|
|
|
return source;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = WebAssemblyJavascriptGenerator;
|