Skip to content

Instantly share code, notes, and snippets.

@samthor
Last active April 16, 2019 06:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save samthor/c5ffade2183d874de1c3e1a9405fe4ef to your computer and use it in GitHub Desktop.
Save samthor/c5ffade2183d874de1c3e1a9405fe4ef to your computer and use it in GitHub Desktop.
code to read emscripten_metadata section of Web Assembly files
function lebReader(array) {
const view = new Uint8Array(array);
let at = 0;
return () => {
if (at >= view.length) {
return -1;
}
let ret = 0;
let mul = 1;
for (;;) {
const byte = view[at++];
ret += ((byte & 0x7f) * mul);
mul *= 0x80;
if (!(byte & 0x80)) {
return ret;
}
}
};
}
export function metadataRead(module) {
const dylink = WebAssembly.Module.customSections(module, 'dylink');
const dylinkReader = lebReader(dylink[0]);
const memorySize = dylinkReader();
const memoryAlign = Math.pow(2, dylinkReader());
const tableSize = dylinkReader();
const tableAlign = Math.pow(2, dylinkReader());
const metadata = WebAssembly.Module.customSections(module, 'emscripten_metadata');
const metadataReader = lebReader(metadata[0]);
const metadataMajor = metadataReader();
const metadataMinor = metadataReader();
if (metadataMajor || metadataMinor) {
throw new Error(`unexpected metadata version: ${metadataMajor},${metadataMinor}`);
}
metadataReader(); // ignore ABI major
metadataReader(); // ignore ABI minor
const memory = metadataReader();
const table = metadataReader();
return {memory, table};
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment