Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
const rewriteImportedGlobals = state => bin => {
const additionalInitCode = state.additionalInitCode;
const newGlobals = [];
bin = editWithAST(state.ast, bin, {
ModuleImport(path) {
if (t.isGlobalType(path.node.descr) === true) {
const globalType = path.node.descr;
globalType.mutability = "var";
const init = createDefaultInitForGlobal(globalType);
newGlobals.push(t.global(globalType, [init]));
path.remove();
}
},
// in order to preserve non-imported global's order we need to re-inject
// those as well
function transformWasm(ast, bin) {
return editWithAST(ast, bin, {
// FIXME(sven): fix https://github.com/webpack/webpack/issues/7454
Elem({node}) {
const offset = t.objectInstruction("const", "i32", [
t.numberLiteralFromRaw(0)
]);
node.offset = [offset];
},
ModuleImport({node}) {
// Webpack only allows memory and table imports from another wasm
if (node.name === "memory" || node.name === "table") {
node.module = "/tmp/hack.wasm";
}
const rewriteImportedGlobals = state => bin => {
const additionalInitCode = state.additionalInitCode;
const newGlobals = [];
bin = editWithAST(state.ast, bin, {
ModuleImport(path) {
if (t.isGlobalType(path.node.descr) === true) {
const globalType = path.node.descr;
globalType.mutability = "var";
const init = createDefaultInitForGlobal(globalType);
newGlobals.push(t.global(globalType, [init]));
path.remove();
}
},
// in order to preserve non-imported global's order we need to re-inject
// those as well
const funcSignature = t.signature(funcParams, funcResults);
const func = t.func(initFuncId, funcSignature, funcBody);
// Type section
const functype = t.typeInstruction(undefined, funcSignature);
// Func section
const funcindex = t.indexInFuncSection(nextTypeIndex);
// Export section
const moduleExport = t.moduleExport(
initFuncId.value,
t.moduleExportDescr("Func", nextFuncIndex)
);
return addWithAST(ast, bin, [func, moduleExport, funcindex, functype]);
};
const funcSignature = t.signature(funcParams, funcResults);
const func = t.func(initFuncId, funcSignature, funcBody);
// Type section
const functype = t.typeInstruction(undefined, funcSignature);
// Func section
const funcindex = t.indexInFuncSection(nextTypeIndex);
// Export section
const moduleExport = t.moduleExport(
initFuncId.value,
t.moduleExportDescr("Func", nextFuncIndex)
);
return addWithAST(ast, bin, [func, moduleExport, funcindex, functype]);
};
const funcSignature = t.signature(funcParams, funcResults);
const func = t.func(initFuncId, funcSignature, funcBody);
// Type section
const functype = t.typeInstruction(undefined, funcSignature);
// Func section
const funcindex = t.indexInFuncSection(nextTypeIndex);
// Export section
const moduleExport = t.moduleExport(
initFuncId.value,
t.moduleExportDescr("Func", nextFuncIndex)
);
return addWithAST(ast, bin, [func, moduleExport, funcindex, functype]);
};
* They have the same indices than the init params, so use the
* same index.
*/
t.instruction("get_local", [initialGlobalidx]),
t.instruction("set_global", [t.indexLiteral(newGlobals.length)])
);
}
newGlobals.push(node);
path.remove();
}
});
// Add global declaration instructions
return addWithAST(state.ast, bin, newGlobals);
};
* They have the same indices as the init params, so use the
* same index.
*/
t.instruction("get_local", [initialGlobalidx]),
t.instruction("set_global", [t.indexLiteral(newGlobals.length)])
);
}
newGlobals.push(node);
path.remove();
}
});
// Add global declaration instructions
return addWithAST(state.ast, bin, newGlobals);
};
* They have the same indices than the init params, so use the
* same index.
*/
t.instruction("get_local", [initialGlobalidx]),
t.instruction("set_global", [t.indexLiteral(newGlobals.length)])
);
}
newGlobals.push(node);
path.remove();
}
});
// Add global declaration instructions
return addWithAST(state.ast, bin, newGlobals);
};
const rewriteExportNames = ({ ast, module, externalExports }) => bin => {
return editWithAST(ast, bin, {
ModuleExport(path) {
const isExternal = externalExports.has(path.node.name);
if (isExternal) {
path.remove();
return;
}
const usedName = module.isUsed(path.node.name);
if (!usedName) {
path.remove();
return;
}
path.node.name = usedName;
}
});
};