diff --git a/src/lexer.js b/src/lexer.js index f5e01c6..4aee529 100755 --- a/src/lexer.js +++ b/src/lexer.js @@ -2,17 +2,21 @@ const strictReserved = new Set(['implements', 'interface', 'let', 'package', 'pr let wasm; +const isLE = new Uint8Array(new Uint16Array([1]).buffer)[0] === 1; + export function parse (source, name = '@') { if (!wasm) throw new Error('Not initialized'); + const len = source.length + 1; + // need 2 bytes per code point plus analysis space so we double again - const extraMem = (wasm.__heap_base.value || wasm.__heap_base) + source.length * 4 - wasm.memory.buffer.byteLength; + const extraMem = (wasm.__heap_base.value || wasm.__heap_base) + len * 4 - wasm.memory.buffer.byteLength; if (extraMem > 0) wasm.memory.grow(Math.ceil(extraMem / 65536)); - const addr = wasm.sa(source.length); - copy(source, new Uint16Array(wasm.memory.buffer, addr, source.length + 1)); + const addr = wasm.sa(len); + (isLE ? copyLE : copyBE)(source, new Uint16Array(wasm.memory.buffer, addr, len)); if (!wasm.parseCJS(addr, source.length, 0, 0)) throw Object.assign(new Error(`Parse error ${name}${wasm.e()}:${source.slice(0, wasm.e()).split('\n').length}:${wasm.e() - source.lastIndexOf('\n', wasm.e() - 1)}`), { idx: wasm.e() }); @@ -29,7 +33,16 @@ export function parse (source, name = '@') { return { exports: [...exports], reexports: [...reexports] }; } -function copy (src, outBuf16) { +function copyBE (src, outBuf16) { + const len = src.length; + let i = 0; + while (i < len) { + const ch = src.charCodeAt(i); + outBuf16[i++] = (ch & 0xff) << 8 | (ch & 0xff0) >> 8; + } +} + +function copyLE (src, outBuf16) { const len = src.length; let i = 0; while (i < len)