@webassemblyjs/wasm-edit
Advanced tools
Comparing version 1.3.3 to 1.4.0
@@ -18,2 +18,4 @@ "use strict"; | ||
var _helperWasmBytecode = require("@webassemblyjs/helper-wasm-bytecode"); | ||
function _sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } | ||
@@ -25,12 +27,6 @@ | ||
function assertNodeHasLoc(n) { | ||
if (n.loc == null || n.loc.start == null || n.loc.end == null) { | ||
throw new Error("Internal failure: can not replace node (".concat(JSON.stringify(n.type), ") without loc information")); | ||
} | ||
} | ||
function shiftLocNodeByDelta(node, delta) { | ||
assertNodeHasLoc(node); // $FlowIgnore: assertNodeHasLoc ensures that | ||
(0, _ast.assertHasLoc)(node); // $FlowIgnore: assertHasLoc ensures that | ||
node.loc.start.column += delta; // $FlowIgnore: assertNodeHasLoc ensures that | ||
node.loc.start.column += delta; // $FlowIgnore: assertHasLoc ensures that | ||
@@ -46,4 +42,4 @@ node.loc.end.column += delta; | ||
var deltaElements = 0; | ||
assertNodeHasLoc(oldNode); | ||
var sectionName = (0, _helperWasmSection.getSectionForNode)(newNode); | ||
(0, _ast.assertHasLoc)(oldNode); | ||
var sectionName = (0, _helperWasmBytecode.getSectionForNode)(newNode); | ||
var replacementByteArray = (0, _wasmGen.encodeNode)(newNode); | ||
@@ -54,4 +50,4 @@ /** | ||
uint8Buffer = (0, _helperBuffer.overrideBytesInBuffer)(uint8Buffer, // $FlowIgnore: assertNodeHasLoc ensures that | ||
oldNode.loc.start.column, // $FlowIgnore: assertNodeHasLoc ensures that | ||
uint8Buffer = (0, _helperBuffer.overrideBytesInBuffer)(uint8Buffer, // $FlowIgnore: assertHasLoc ensures that | ||
oldNode.loc.start.column, // $FlowIgnore: assertHasLoc ensures that | ||
oldNode.loc.end.column, replacementByteArray); | ||
@@ -73,3 +69,3 @@ /** | ||
// These are the old functions locations informations | ||
assertNodeHasLoc(node); | ||
(0, _ast.assertHasLoc)(node); | ||
var oldNodeSize = (0, _wasmGen.encodeNode)(oldNode).length; | ||
@@ -97,3 +93,3 @@ var bodySizeDeltaBytes = replacementByteArray.length - oldNodeSize; | ||
var deltaBytes = replacementByteArray.length - ( // $FlowIgnore: assertNodeHasLoc ensures that | ||
var deltaBytes = replacementByteArray.length - ( // $FlowIgnore: assertHasLoc ensures that | ||
oldNode.loc.end.column - oldNode.loc.start.column); // Init location informations | ||
@@ -111,7 +107,7 @@ | ||
}; // Update new node end position | ||
// $FlowIgnore: assertNodeHasLoc ensures that | ||
// $FlowIgnore: assertHasLoc ensures that | ||
newNode.loc.start.column = oldNode.loc.start.column; // $FlowIgnore: assertNodeHasLoc ensures that | ||
newNode.loc.start.column = oldNode.loc.start.column; // $FlowIgnore: assertHasLoc ensures that | ||
newNode.loc.end.column = // $FlowIgnore: assertNodeHasLoc ensures that | ||
newNode.loc.end.column = // $FlowIgnore: assertHasLoc ensures that | ||
oldNode.loc.start.column + replacementByteArray.length; | ||
@@ -128,4 +124,4 @@ return { | ||
assertNodeHasLoc(node); | ||
var sectionName = (0, _helperWasmSection.getSectionForNode)(node); | ||
(0, _ast.assertHasLoc)(node); | ||
var sectionName = (0, _helperWasmBytecode.getSectionForNode)(node); | ||
@@ -154,4 +150,4 @@ if (sectionName === "start") { | ||
var replacement = []; | ||
uint8Buffer = (0, _helperBuffer.overrideBytesInBuffer)(uint8Buffer, // $FlowIgnore: assertNodeHasLoc ensures that | ||
node.loc.start.column, // $FlowIgnore: assertNodeHasLoc ensures that | ||
uint8Buffer = (0, _helperBuffer.overrideBytesInBuffer)(uint8Buffer, // $FlowIgnore: assertHasLoc ensures that | ||
node.loc.start.column, // $FlowIgnore: assertHasLoc ensures that | ||
node.loc.end.column, replacement); | ||
@@ -161,3 +157,3 @@ /** | ||
*/ | ||
// $FlowIgnore: assertNodeHasLoc ensures that | ||
// $FlowIgnore: assertHasLoc ensures that | ||
@@ -175,3 +171,3 @@ var deltaBytes = -(node.loc.end.column - node.loc.start.column); | ||
var sectionName = (0, _helperWasmSection.getSectionForNode)(node); | ||
var sectionName = (0, _helperWasmBytecode.getSectionForNode)(node); | ||
var sectionMetadata = (0, _ast.getSectionMetadata)(ast, sectionName); // Section doesn't exists, we create an empty one | ||
@@ -191,7 +187,5 @@ | ||
// we need to manually add it here | ||
// FIXME(sven): preprocess it into the AST? | ||
var start = sectionMetadata.startOffset + sectionMetadata.size.value + (sectionMetadata.size.loc.end.column - sectionMetadata.size.loc.start.column); | ||
var start = (0, _ast.getEndOfSection)(sectionMetadata); | ||
var end = start; | ||
uint8Buffer = (0, _helperBuffer.overrideBytesInBuffer)(uint8Buffer, start, end, newByteArray); | ||
/** | ||
@@ -203,2 +197,27 @@ * Update section | ||
debug("add node=%s section=%s after=%d deltaBytes=%s deltaElements=%s", node.type, sectionName, start, deltaBytes, deltaElements); | ||
uint8Buffer = (0, _helperBuffer.overrideBytesInBuffer)(uint8Buffer, start, end, newByteArray); | ||
node.loc = { | ||
start: { | ||
line: -1, | ||
column: start | ||
}, | ||
end: { | ||
line: -1, | ||
column: start + deltaBytes | ||
} | ||
}; // for func add the additional metadata in the AST | ||
if (node.type === "Func") { | ||
// the size is the first byte | ||
// FIXME(sven): handle LEB128 correctly here | ||
var bodySize = newByteArray[0]; | ||
node.metadata = { | ||
bodySize: bodySize | ||
}; | ||
} | ||
if (node.type !== "IndexInFuncSection") { | ||
(0, _ast.orderedInsertNode)(ast.body[0], node); | ||
} | ||
return { | ||
@@ -219,3 +238,3 @@ uint8Buffer: uint8Buffer, | ||
state = applyUpdate(ast, uint8Buffer, [op.oldNode, op.node]); | ||
sectionName = (0, _helperWasmSection.getSectionForNode)(op.node); | ||
sectionName = (0, _helperWasmBytecode.getSectionForNode)(op.node); | ||
break; | ||
@@ -225,3 +244,3 @@ | ||
state = applyDelete(ast, uint8Buffer, op.node); | ||
sectionName = (0, _helperWasmSection.getSectionForNode)(op.node); | ||
sectionName = (0, _helperWasmBytecode.getSectionForNode)(op.node); | ||
break; | ||
@@ -231,3 +250,3 @@ | ||
state = applyAdd(ast, uint8Buffer, op.node); | ||
sectionName = (0, _helperWasmSection.getSectionForNode)(op.node); | ||
sectionName = (0, _helperWasmBytecode.getSectionForNode)(op.node); | ||
break; | ||
@@ -234,0 +253,0 @@ |
@@ -7,3 +7,5 @@ "use strict"; | ||
exports.edit = edit; | ||
exports.editWithAST = editWithAST; | ||
exports.add = add; | ||
exports.addWithAST = addWithAST; | ||
@@ -18,4 +20,2 @@ var _wasmParser = require("@webassemblyjs/wasm-parser"); | ||
var _helperWasmSection = require("@webassemblyjs/helper-wasm-section"); | ||
var _helperWasmBytecode = _interopRequireDefault(require("@webassemblyjs/helper-wasm-bytecode")); | ||
@@ -31,8 +31,2 @@ | ||
var decoderOpts = { | ||
// FIXME(sven): detection based on the Instr doesn't work for add() | ||
// ignoreCodeSection: true, | ||
ignoreDataSection: true | ||
}; | ||
function preprocess(ab) { | ||
@@ -45,4 +39,6 @@ var optBin = (0, _wasmOpt.shrinkPaddedLEB128)(new Uint8Array(ab)); | ||
nodes.sort(function (a, b) { | ||
var sectionA = (0, _helperWasmSection.getSectionForNode)(a); | ||
var sectionB = (0, _helperWasmSection.getSectionForNode)(b); | ||
var sectionA = _helperWasmBytecode.default.getSectionForNode(a); | ||
var sectionB = _helperWasmBytecode.default.getSectionForNode(b); | ||
var aId = _helperWasmBytecode.default.sections[sectionA]; | ||
@@ -61,5 +57,9 @@ var bId = _helperWasmBytecode.default.sections[sectionB]; | ||
function edit(ab, visitors) { | ||
ab = preprocess(ab); | ||
var ast = (0, _wasmParser.decode)(ab); | ||
return editWithAST(ast, ab, visitors); | ||
} | ||
function editWithAST(ast, ab, visitors) { | ||
var operations = []; | ||
ab = preprocess(ab); | ||
var ast = (0, _wasmParser.decode)(ab, decoderOpts); | ||
var uint8Buffer = new Uint8Array(ab); | ||
@@ -93,6 +93,10 @@ var nodeBefore; | ||
function add(ab, newNodes) { | ||
ab = preprocess(ab); // Sort nodes by insertion order | ||
ab = preprocess(ab); | ||
var ast = (0, _wasmParser.decode)(ab); | ||
return addWithAST(ast, ab, newNodes); | ||
} | ||
function addWithAST(ast, ab, newNodes) { | ||
// Sort nodes by insertion order | ||
sortBySectionOrder(newNodes); | ||
var ast = (0, _wasmParser.decode)(ab, decoderOpts); | ||
var uint8Buffer = new Uint8Array(ab); // Map node into operations | ||
@@ -99,0 +103,0 @@ |
{ | ||
"name": "@webassemblyjs/wasm-edit", | ||
"version": "1.3.3", | ||
"version": "1.4.0", | ||
"description": "", | ||
@@ -19,15 +19,15 @@ "main": "lib/index.js", | ||
"dependencies": { | ||
"@webassemblyjs/ast": "1.3.3", | ||
"@webassemblyjs/helper-buffer": "1.3.3", | ||
"@webassemblyjs/helper-wasm-bytecode": "1.3.3", | ||
"@webassemblyjs/helper-wasm-section": "1.3.3", | ||
"@webassemblyjs/wasm-gen": "1.3.3", | ||
"@webassemblyjs/wasm-opt": "1.3.3", | ||
"@webassemblyjs/wasm-parser": "1.3.3", | ||
"@webassemblyjs/wast-printer": "1.3.3", | ||
"@webassemblyjs/ast": "1.4.0", | ||
"@webassemblyjs/helper-buffer": "1.4.0", | ||
"@webassemblyjs/helper-wasm-bytecode": "1.4.0", | ||
"@webassemblyjs/helper-wasm-section": "1.4.0", | ||
"@webassemblyjs/wasm-gen": "1.4.0", | ||
"@webassemblyjs/wasm-opt": "1.4.0", | ||
"@webassemblyjs/wasm-parser": "1.4.0", | ||
"@webassemblyjs/wast-printer": "1.4.0", | ||
"debug": "^3.1.0" | ||
}, | ||
"devDependencies": { | ||
"@webassemblyjs/helper-test-framework": "1.3.3" | ||
"@webassemblyjs/helper-test-framework": "1.4.0" | ||
} | ||
} |
@@ -76,1 +76,12 @@ # @webassemblyjs/wasm-edit | ||
``` | ||
## Providing the AST | ||
Providing an AST allows you to handle the decoding yourself, here is the API: | ||
```js | ||
addWithAST(Program, ArrayBuffer, Array<Node>): ArrayBuffer; | ||
editWithAST(Program, ArrayBuffer, visitors): ArrayBuffer; | ||
``` | ||
Note that the AST will be updated in-place. |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
13485
298
87
+ Added@webassemblyjs/ast@1.4.0(transitive)
+ Added@webassemblyjs/floating-point-hex-parser@1.4.0(transitive)
+ Added@webassemblyjs/helper-buffer@1.4.0(transitive)
+ Added@webassemblyjs/helper-code-frame@1.4.0(transitive)
+ Added@webassemblyjs/helper-fsm@1.4.0(transitive)
+ Added@webassemblyjs/helper-wasm-bytecode@1.4.0(transitive)
+ Added@webassemblyjs/helper-wasm-section@1.4.0(transitive)
+ Added@webassemblyjs/leb128@1.4.0(transitive)
+ Added@webassemblyjs/validation@1.4.0(transitive)
+ Added@webassemblyjs/wasm-gen@1.4.0(transitive)
+ Added@webassemblyjs/wasm-opt@1.4.0(transitive)
+ Added@webassemblyjs/wasm-parser@1.4.0(transitive)
+ Added@webassemblyjs/wast-parser@1.4.0(transitive)
+ Added@webassemblyjs/wast-printer@1.4.0(transitive)
+ Addedwebassemblyjs@1.4.0(transitive)
- Removed@webassemblyjs/ast@1.3.3(transitive)
- Removed@webassemblyjs/floating-point-hex-parser@1.3.3(transitive)
- Removed@webassemblyjs/helper-buffer@1.3.3(transitive)
- Removed@webassemblyjs/helper-code-frame@1.3.3(transitive)
- Removed@webassemblyjs/helper-fsm@1.3.3(transitive)
- Removed@webassemblyjs/helper-wasm-bytecode@1.3.3(transitive)
- Removed@webassemblyjs/helper-wasm-section@1.3.3(transitive)
- Removed@webassemblyjs/leb128@1.3.3(transitive)
- Removed@webassemblyjs/validation@1.3.3(transitive)
- Removed@webassemblyjs/wasm-gen@1.3.3(transitive)
- Removed@webassemblyjs/wasm-opt@1.3.3(transitive)
- Removed@webassemblyjs/wasm-parser@1.3.3(transitive)
- Removed@webassemblyjs/wast-parser@1.3.3(transitive)
- Removed@webassemblyjs/wast-printer@1.3.3(transitive)
- Removedwebassemblyjs@1.3.3(transitive)
Updated@webassemblyjs/ast@1.4.0