Last active
April 16, 2019 06:24
-
-
Save samthor/c5ffade2183d874de1c3e1a9405fe4ef to your computer and use it in GitHub Desktop.
code to read emscripten_metadata section of Web Assembly files
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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