Skip to content

Commit 8d2f421

Browse files
authored
Merge pull request webpack#7254 from xtuc/feat-remove-extra-wasm-decodings
Remove extra wasm decoding
2 parents 0eeea0f + e2c8f3d commit 8d2f421

File tree

5 files changed

+147
-131
lines changed

5 files changed

+147
-131
lines changed

declarations.d.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,19 +33,28 @@ declare module "chrome-trace-event" {
3333
declare module "@webassemblyjs/ast" {
3434
export function traverse(
3535
ast: any,
36-
visitor: { [name: string]: (context: { node: Node }) => void }
36+
visitor: {
37+
ModuleImport?: (p: NodePath<ModuleImport>) => void;
38+
ModuleExport?: (p: NodePath<ModuleExport>) => void;
39+
Start?: (p: NodePath<Start>) => void;
40+
}
3741
);
38-
export class Node {
39-
index: number;
42+
export class NodePath<T> {
43+
node: T;
4044
}
45+
export class Node {}
4146
export class Identifier extends Node {
4247
value: string;
4348
}
49+
export class Start extends Node {
50+
index: Identifier;
51+
}
4452
export class ModuleImport extends Node {
4553
module: string;
4654
descr: {
4755
type: string;
4856
valtype: string;
57+
id: string;
4958
};
5059
name: string;
5160
}

lib/wasm/WebAssemblyGenerator.js

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
const Generator = require("../Generator");
88
const { RawSource } = require("webpack-sources");
99

10-
const { edit, add } = require("@webassemblyjs/wasm-edit");
10+
const { editWithAST, addWithAST } = require("@webassemblyjs/wasm-edit");
1111
const { decode } = require("@webassemblyjs/wasm-parser");
1212
const t = require("@webassemblyjs/ast");
1313

@@ -18,9 +18,19 @@ function compose(...fns) {
1818
}
1919

2020
// Utility functions
21-
const isGlobalImport = moduleImport => moduleImport.descr.type === "GlobalType";
22-
const isFuncImport = moduleImport =>
23-
moduleImport.descr.type === "FuncImportDescr";
21+
22+
/**
23+
* @param {t.ModuleImport} n the import
24+
* @returns {boolean} true, if a global was imported
25+
*/
26+
const isGlobalImport = n => n.descr.type === "GlobalType";
27+
28+
/**
29+
* @param {t.ModuleImport} n the import
30+
* @returns {boolean} true, if a func was imported
31+
*/
32+
const isFuncImport = n => n.descr.type === "FuncImportDescr";
33+
2434
const initFuncId = t.identifier("__webpack_init__");
2535

2636
// TODO replace with @callback
@@ -35,7 +45,7 @@ const initFuncId = t.identifier("__webpack_init__");
3545
* @returns {ArrayBufferTransform} transform
3646
*/
3747
const removeStartFunc = state => bin => {
38-
return edit(bin, {
48+
return editWithAST(state.ast, bin, {
3949
Start(path) {
4050
path.remove();
4151
}
@@ -149,7 +159,7 @@ function getNextFuncIndex(ast, countImportedFunc) {
149159
const rewriteImportedGlobals = state => bin => {
150160
const newGlobals = [];
151161

152-
bin = edit(bin, {
162+
bin = editWithAST(state.ast, bin, {
153163
ModuleImport(path) {
154164
if (isGlobalImport(path.node) === true) {
155165
const globalType = path.node.descr;
@@ -168,7 +178,7 @@ const rewriteImportedGlobals = state => bin => {
168178
});
169179

170180
// Add global declaration instructions
171-
return add(bin, newGlobals);
181+
return addWithAST(state.ast, bin, newGlobals);
172182
};
173183

174184
/**
@@ -177,17 +187,17 @@ const rewriteImportedGlobals = state => bin => {
177187
* The init function fills the globals given input arguments.
178188
*
179189
* @param {Object} state transformation state
190+
* @param {Object} state.ast - Module's ast
180191
* @param {t.IndexLiteral} state.startAtFuncIndex index of the start function
181192
* @param {t.ModuleImport[]} state.importedGlobals list of imported globals
182-
* @param {TODO} state.funcSectionMetadata ??
183193
* @param {t.IndexLiteral} state.nextFuncIndex index of the next function
184194
* @param {t.IndexLiteral} state.nextTypeIndex index of the next type
185195
* @returns {ArrayBufferTransform} transform
186196
*/
187197
const addInitFunction = ({
198+
ast,
188199
startAtFuncIndex,
189200
importedGlobals,
190-
funcSectionMetadata,
191201
nextFuncIndex,
192202
nextTypeIndex
193203
}) => bin => {
@@ -229,35 +239,32 @@ const addInitFunction = ({
229239
// Export section
230240
const moduleExport = t.moduleExport(initFuncId.value, "Func", nextFuncIndex);
231241

232-
return add(bin, [func, moduleExport, funcindex, functype]);
242+
return addWithAST(ast, bin, [func, moduleExport, funcindex, functype]);
233243
};
234244

235245
class WebAssemblyGenerator extends Generator {
236246
generate(module) {
237247
const bin = module.originalSource().source();
238248

239-
// FIXME(sven): this module is parsed twice, we could preserve the AST
240-
// from wasm/WebAssemblyParser.js
241249
const ast = decode(bin, {
242250
ignoreDataSection: true,
243251
ignoreCodeSection: true
244252
});
245253

246254
const importedGlobals = getImportedGlobals(ast);
247-
const funcSectionMetadata = t.getSectionMetadata(ast, "func");
248255
const countImportedFunc = getCountImportedFunc(ast);
249256
const startAtFuncIndex = getStartFuncIndex(ast);
250257
const nextFuncIndex = getNextFuncIndex(ast, countImportedFunc);
251258
const nextTypeIndex = getNextTypeIndex(ast);
252259

253260
const transform = compose(
254-
removeStartFunc({}),
261+
removeStartFunc({ ast }),
255262

256-
rewriteImportedGlobals({}),
263+
rewriteImportedGlobals({ ast }),
257264

258265
addInitFunction({
266+
ast,
259267
importedGlobals,
260-
funcSectionMetadata,
261268
startAtFuncIndex,
262269
nextFuncIndex,
263270
nextTypeIndex

lib/wasm/WebAssemblyParser.js

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,19 @@ const { decode } = require("@webassemblyjs/wasm-parser");
1010
const { Tapable } = require("tapable");
1111
const WebAssemblyImportDependency = require("../dependencies/WebAssemblyImportDependency");
1212

13+
/** @typedef {import("../Module")} Module */
14+
1315
/**
14-
* @param {t.ModuleImport} moduleImport the import
16+
* @param {t.ModuleImport} n the import
1517
* @returns {boolean} true, if a memory was imported
1618
*/
17-
const isMemoryImport = moduleImport => moduleImport.descr.type === "Memory";
19+
const isMemoryImport = n => n.descr.type === "Memory";
1820

1921
/**
20-
* @param {t.ModuleImport} moduleImport the import
22+
* @param {t.ModuleImport} n the import
2123
* @returns {boolean} true, if a table was imported
2224
*/
23-
const isTableImport = moduleImport => moduleImport.descr.type === "Table";
25+
const isTableImport = n => n.descr.type === "Table";
2426

2527
const decoderOpts = {
2628
ignoreCodeSection: true,
@@ -45,27 +47,24 @@ class WebAssemblyParser extends Tapable {
4547
const exports = (state.module.buildMeta.providedExports = []);
4648
t.traverse(ast, {
4749
ModuleExport({ node }) {
48-
const moduleExport = /** @type {t.ModuleExport} */ (node);
49-
exports.push(moduleExport.name);
50+
exports.push(node.name);
5051
},
5152

5253
ModuleImport({ node }) {
53-
const moduleImport = /** @type {t.ModuleImport} */ (node);
54-
5554
let onlyDirectImport = false;
5655

57-
if (isMemoryImport(moduleImport) === true) {
56+
if (isMemoryImport(node) === true) {
5857
onlyDirectImport = true;
5958
}
6059

61-
if (isTableImport(moduleImport) === true) {
60+
if (isTableImport(node) === true) {
6261
onlyDirectImport = true;
6362
}
6463

6564
const dep = new WebAssemblyImportDependency(
66-
moduleImport.module,
67-
moduleImport.name,
68-
moduleImport.descr,
65+
node.module,
66+
node.name,
67+
node.descr,
6968
onlyDirectImport
7069
);
7170

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
"description": "Packs CommonJs/AMD modules for the browser. Allows to split your codebase into multiple bundles, which can be loaded on demand. Support loaders to preprocess files, i.e. json, jsx, es7, css, less, ... and your custom stuff.",
66
"license": "MIT",
77
"dependencies": {
8-
"@webassemblyjs/ast": "1.3.2",
9-
"@webassemblyjs/wasm-edit": "1.3.2",
10-
"@webassemblyjs/wasm-parser": "1.3.2",
8+
"@webassemblyjs/ast": "1.4.2",
9+
"@webassemblyjs/wasm-edit": "1.4.2",
10+
"@webassemblyjs/wasm-parser": "1.4.2",
1111
"acorn": "^5.0.0",
1212
"acorn-dynamic-import": "^3.0.0",
1313
"ajv": "^6.1.0",

0 commit comments

Comments
 (0)