fune/browser/components/extensions/ParseBreakpadSymbols-worker.js
Doug Thayer ed9ed87b3e Bug 1362786 - (2) Run NMParser in worker r=kmag
Pulls out the NMParser work (parsing nm results and turning
them into an ArrayBuffer'd map of addresses to symbols) into
a worker.

For OSX we will still need to do some work to run c++filt in the
background, but this gets us most of the way there. Without a
Subprocess.jsm usable from a worker, we'll have to bounce data
back to the main thread in order to bounce it to the c++filt
worker.

MozReview-Commit-ID: LZi7J1qGpmh

--HG--
extra : rebase_source : 048329fb085542ecc4c8f8d872e6c4cf0b535376
2017-07-21 14:14:17 -07:00

58 lines
1.5 KiB
JavaScript

/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set sts=2 sw=2 et tw=80: */
/* eslint-env worker */
"use strict";
importScripts("resource://gre/modules/osfile.jsm");
importScripts("resource:///modules/ParseSymbols.jsm");
async function fetchSymbolFile(url) {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`got error status ${response.status}`);
}
return response.text();
}
function parse(text) {
const syms = new Map();
// Lines look like this:
//
// PUBLIC 3fc74 0 test_public_symbol
//
// FUNC 40330 8e 0 test_func_symbol
const symbolRegex = /\nPUBLIC ([0-9a-f]+) [0-9a-f]+ (.*)|\nFUNC ([0-9a-f]+) [0-9a-f]+ [0-9a-f]+ (.*)/g;
let match;
let approximateLength = 0;
while ((match = symbolRegex.exec(text))) {
const [address0, symbol0, address1, symbol1] = match.slice(1);
const address = parseInt(address0 || address1, 16);
const sym = (symbol0 || symbol1).trimRight();
syms.set(address, sym);
approximateLength += sym.length;
}
return ParseSymbols.convertSymsMapToExpectedSymFormat(syms, approximateLength);
}
onmessage = async e => {
try {
let text;
if (e.data.filepath) {
text = await OS.File.read(e.data.filepath, {encoding: "utf-8"});
} else if (e.data.url) {
text = await fetchSymbolFile(e.data.url);
}
const result = parse(text);
postMessage({result}, result.map(r => r.buffer));
} catch (error) {
postMessage({error: error.toString()});
}
close();
};