diff options
author | Alon Zakai <alonzakai@gmail.com> | 2013-10-12 18:39:06 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2013-10-12 18:39:06 -0700 |
commit | 07d68f04956f3db062de6b5ba4a9cb8107f92e9a (patch) | |
tree | 476d1b7452d878486be78c73366c7754792fa438 /src/preamble.js | |
parent | afc095f513cf6601ef337ca53f4f1eda77b7f877 (diff) |
refactor out parsing of nested demangled runs
Diffstat (limited to 'src/preamble.js')
-rw-r--r-- | src/preamble.js | 46 |
1 files changed, 29 insertions, 17 deletions
diff --git a/src/preamble.js b/src/preamble.js index a02459ff..e495c548 100644 --- a/src/preamble.js +++ b/src/preamble.js @@ -666,13 +666,32 @@ function demangle(func) { for (var a = 0; a < i; a++) pre += ' '; Module.print (pre + '^'); } - function parse(rawList, limit, allowVoid) { // parses code until an 'E' ending + var subs = []; + function parseNested() { + i++; + if (func[i] === 'K') { + suffix = ' const'; + i++; + } + var parts = []; + while (func[i] !== 'E') { + var size = parseInt(func.substr(i)); + var pre = size.toString().length; + if (!size || !pre) { i--; break; } // counter i++ below us + var curr = func.substr(i + pre, size); + parts.push(curr); + subs.push(curr); + i += pre + size; + } + i++; // skip E + return parts; + } + function parse(rawList, limit, allowVoid) { // main parser limit = limit || Infinity; var ret = '', list = []; function flushList() { return '(' + list.join(', ') + ')'; } - var name, suffix = ''; if (func[i] !== 'N') { // not namespaced @@ -688,21 +707,7 @@ function demangle(func) { } } else { // namespaced N-E - i++; - if (func[i] === 'K') { - suffix = ' const'; - i++; - } - var parts = []; - while (func[i] !== 'E') { - var size = parseInt(func.substr(i)); - var pre = size.toString().length; - if (!size || !pre) { i--; break; } // counter i++ below us - parts.push(func.substr(i + pre, size)); - i += pre + size; - } - i++; // skip E - name = parts.join('::'); + name = parseNested().join('::'); } if (func[i] === 'I') { @@ -720,6 +725,13 @@ function demangle(func) { } else { switch (c) { case 'P': list.push(parse(true, 1, true)[0] + '*'); break; // pointer + case 'S': { // substitution + var next = func.indexOf('_', i); + var num = func.substring(i, next) || 0; + list.push(subs[num] || '?'); + i = next+1; + break; + } case 'L': { // literal i++; // skip basic type var end = func.indexOf('E', i); |