diff --git a/read_data.js b/read_data.js new file mode 100644 index 0000000..34178a3 --- /dev/null +++ b/read_data.js @@ -0,0 +1,17 @@ +const fs = require("fs/promises"); + +async function main() { + const b = await fs.readFile(process.argv[2]); + const { instance } = await WebAssembly.instantiate(b); + const ptr = instance.exports.__asbind_type_data.value; + const dv = new DataView(instance.exports.memory.buffer); + const strLen = dv.getUint32(ptr - 4, true); + const strView = new Uint16Array( + instance.exports.memory.buffer, + ptr, + strLen / Uint16Array.BYTES_PER_ELEMENT + ); + const str = new TextDecoder("utf-16le").decode(strView); + console.log({ str }); +} +main(); diff --git a/transform.js b/transform.js new file mode 100644 index 0000000..bf36ca8 --- /dev/null +++ b/transform.js @@ -0,0 +1,70 @@ +const { Transform } = require("assemblyscript/cli/transform"); +const assemblyscript = require("assemblyscript"); + +function isInternalElement(element) { + return element.internalName.startsWith("~"); +} + +function elementHasFlag(el, flag) { + return (el.flags & flag) != 0; +} + +function typeName(type) { + return type.name.text ?? type.name.identifier.text; +} + +const marker = "__asbind_type_data"; + +class AsBindTransform extends Transform { + afterInitialize(program) { + const exportedFunctions = [...program.elementsByDeclaration.values()] + .filter(el => + elementHasFlag(el, assemblyscript.CommonFlags.MODULE_EXPORT) + ) + .filter(el => !isInternalElement(el)) + .filter( + el => + el.declaration.kind === assemblyscript.NodeKind.FUNCTIONDECLARATION + ); + const importedFunctions = [...program.elementsByDeclaration.values()] + .filter(el => elementHasFlag(el, assemblyscript.CommonFlags.DECLARE)) + .filter(el => !isInternalElement(el)) + .filter( + v => v.declaration.kind === assemblyscript.NodeKind.FUNCTIONDECLARATION + ); + const typeData = { + importedFunction: Object.fromEntries( + importedFunctions.map(func => [ + func.name, + { + returnType: typeName(func.declaration.signature.returnType), + parameters: func.declaration.signature.parameters.map(parameter => + typeName(parameter.type) + ) + } + ]) + ), + exportedFunctions: Object.fromEntries( + exportedFunctions.map(func => [ + func.name, + { + returnType: typeName(func.declaration.signature.returnType), + parameters: func.declaration.signature.parameters.map(parameter => + typeName(parameter.type) + ) + } + ]) + ) + }; + const typeDataExport = [...program.elementsByDeclaration.values()].find( + v => v.name === marker + ); + if (!typeDataExport) { + throw Error("Could not find type data export"); + } + typeDataExport.declaration.initializer = new assemblyscript.StringLiteralExpression( + JSON.stringify(typeData) + ); + } +} +module.exports = AsBindTransform;