Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
function applyUpdate(
ast: Program,
uint8Buffer: Uint8Array,
[oldNode, newNode]: [Node, Node]
): State {
const deltaElements = 0;
assertHasLoc(oldNode);
const sectionName = getSectionForNode(newNode);
const replacementByteArray = encodeNode(newNode);
/**
* Replace new node as bytes
*/
uint8Buffer = overrideBytesInBuffer(
uint8Buffer,
// $FlowIgnore: assertHasLoc ensures that
oldNode.loc.start.column,
// $FlowIgnore: assertHasLoc ensures that
oldNode.loc.end.column,
replacementByteArray
);
/**
* Update function body size if needed
function applyAdd(ast: Program, uint8Buffer: Uint8Array, node: Node): State {
const deltaElements = +1; // since we added an element
const sectionName = getSectionForNode(node);
let sectionMetadata = getSectionMetadata(ast, sectionName);
// Section doesn't exists, we create an empty one
if (typeof sectionMetadata === "undefined") {
const res = createEmptySection(ast, uint8Buffer, sectionName);
uint8Buffer = res.uint8Buffer;
sectionMetadata = res.sectionMetadata;
}
/**
* Add nodes
*/
const newByteArray = encodeNode(node);
function applyAdd(ast: Program, uint8Buffer: Uint8Array, node: Node): State {
const deltaElements = +1; // since we added an element
const sectionName = getSectionForNode(node);
let sectionMetadata = getSectionMetadata(ast, sectionName);
// Section doesn't exists, we create an empty one
if (typeof sectionMetadata === "undefined") {
const res = createEmptySection(ast, uint8Buffer, sectionName);
uint8Buffer = res.uint8Buffer;
sectionMetadata = res.sectionMetadata;
}
/**
* check that the expressions were ended
*/
if (isFunc(node)) {
// $FlowIgnore
function applyDelete(ast: Program, uint8Buffer: Uint8Array, node: Node): State {
const deltaElements = -1; // since we removed an element
assertHasLoc(node);
const sectionName = getSectionForNode(node);
if (sectionName === "start") {
const sectionMetadata = getSectionMetadata(ast, "start");
/**
* The start section only contains one element,
* we need to remove the whole section
*/
uint8Buffer = removeSections(ast, uint8Buffer, "start");
const deltaBytes = -(sectionMetadata.size.value + 1); /* section id */
return { uint8Buffer, deltaBytes, deltaElements };
}
// replacement is nothing
function applyUpdate(ast, uint8Buffer, _ref) {
var _ref2 = _slicedToArray(_ref, 2),
oldNode = _ref2[0],
newNode = _ref2[1];
var deltaElements = 0;
assertHasLoc(oldNode);
var sectionName = getSectionForNode(newNode);
var replacementByteArray = encodeNode(newNode);
/**
* Replace new node as bytes
*/
uint8Buffer = overrideBytesInBuffer(uint8Buffer, // $FlowIgnore: assertHasLoc ensures that
oldNode.loc.start.column, // $FlowIgnore: assertHasLoc ensures that
oldNode.loc.end.column, replacementByteArray);
/**
* Update function body size if needed
*/
if (sectionName === "code") {
// Find the parent func
traverse(ast, {
Func: function Func(_ref3) {
function applyAdd(ast, uint8Buffer, node) {
var deltaElements = +1; // since we added an element
var sectionName = getSectionForNode(node);
var sectionMetadata = getSectionMetadata(ast, sectionName); // Section doesn't exists, we create an empty one
if (typeof sectionMetadata === "undefined") {
var res = createEmptySection(ast, uint8Buffer, sectionName);
uint8Buffer = res.uint8Buffer;
sectionMetadata = res.sectionMetadata;
}
/**
* Add nodes
*/
var newByteArray = encodeNode(node); // The size of the section doesn't include the storage of the size itself
// we need to manually add it here
var start = getEndOfSection(sectionMetadata);
ops.forEach(function (op) {
var state;
var sectionName;
switch (op.kind) {
case "update":
state = applyUpdate(ast, uint8Buffer, [op.oldNode, op.node]);
sectionName = getSectionForNode(op.node);
break;
case "delete":
state = applyDelete(ast, uint8Buffer, op.node);
sectionName = getSectionForNode(op.node);
break;
case "add":
state = applyAdd(ast, uint8Buffer, op.node);
sectionName = getSectionForNode(op.node);
break;
default:
throw new Error("Unknown operation");
}
/**
Node: function Node(_ref3) {
var node = _ref3.node;
var section = getSectionForNode(node);
if (section === sectionName && _typeof(node.loc) === "object") {
shiftLoc(node, delta);
}
}
});
Node: function Node(_ref3) {
var node = _ref3.node;
var section = getSectionForNode(node);
if (section === sectionName && _typeof(node.loc) === "object") {
shiftLoc(node, delta);
}
}
});
var sectionName;
switch (op.kind) {
case "update":
state = applyUpdate(ast, uint8Buffer, [op.oldNode, op.node]);
sectionName = getSectionForNode(op.node);
break;
case "delete":
state = applyDelete(ast, uint8Buffer, op.node);
sectionName = getSectionForNode(op.node);
break;
case "add":
state = applyAdd(ast, uint8Buffer, op.node);
sectionName = getSectionForNode(op.node);
break;
default:
throw new Error("Unknown operation");
}
/**
* Resize section vec size.
* If the length of the LEB-encoded size changes, this can change
* the byte length of the section and the offset for nodes in the
* section. So we do this first before resizing section byte size
* or shifting following operations' nodes.
*/
if (state.deltaElements !== 0 && sectionName !== "start") {
var oldBufferLength = state.uint8Buffer.length;