diff options
Diffstat (limited to 'devtools/client/debugger/test/mochitest/examples/wasm-sourcemaps/utils.js')
-rw-r--r-- | devtools/client/debugger/test/mochitest/examples/wasm-sourcemaps/utils.js | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/devtools/client/debugger/test/mochitest/examples/wasm-sourcemaps/utils.js b/devtools/client/debugger/test/mochitest/examples/wasm-sourcemaps/utils.js new file mode 100644 index 0000000000..906ae02165 --- /dev/null +++ b/devtools/client/debugger/test/mochitest/examples/wasm-sourcemaps/utils.js @@ -0,0 +1,75 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +// Simple wasm parser to replace "sourceMappingURL" section. + +function updateSourceMappingURLSection(buffer, sourceMapUrl) { + function readVarUint8(buf, pos) { + let b = buf[pos++]; + let shift = 0; + let result = 0; + while (b & 0x80) { + result |= (b & 0x7f) << shift; + shift += 7; + b = buf[pos++]; + } + return { + value: result | (b << shift), + pos + }; + } + function readWasmString(buf, pos) { + const { pos: next, value: len } = readVarUint8(buf, pos); + const result = String.fromCharCode.apply( + null, + buf.subarray(next, next + len) + ); + return { value: result, pos: next + len }; + } + function toVarUint(n) { + const buf = []; + while (n > 127) { + buf.push((n & 0x7f) | 0x80); + n >>>= 7; + } + buf.push(n); + return buf; + } + function toWasmString(s) { + const buf = toVarUint(s.length); + for (let i = 0; i < s.length; i++) { + buf.push(s.charCodeAt(i)); + } + return buf; + } + + // Appending/replacing sourceMappingURL section based on + // https://github.com/WebAssembly/design/pull/1051 + const mappingSectionBody = toWasmString("sourceMappingURL").concat( + toWasmString(sourceMapUrl) + ); + const mappingSection = toVarUint(0).concat( + toVarUint(mappingSectionBody.length), + mappingSectionBody + ); + const data = new Uint8Array(buffer); + let start = data.length, + end = data.length; + for (let i = 8; i < data.length; ) { + const { pos: next, value: id } = readVarUint8(data, i); + const { pos: next2, value: size } = readVarUint8(data, next); + if (id == 0 && readWasmString(data, next2).value === "sourceMappingURL") { + start = i; + end = next2 + size; + break; + } + i = next2 + size; + } + const result = new Uint8Array( + start + (data.length - end) + mappingSection.length + ); + result.set(data.subarray(0, start)); + result.set(new Uint8Array(mappingSection), start); + result.set(data.subarray(end), start + mappingSection.length); + return result.buffer; +} |