aboutsummaryrefslogtreecommitdiff
path: root/src/preamble.js
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2013-10-12 18:39:06 -0700
committerAlon Zakai <alonzakai@gmail.com>2013-10-12 18:39:06 -0700
commit07d68f04956f3db062de6b5ba4a9cb8107f92e9a (patch)
tree476d1b7452d878486be78c73366c7754792fa438 /src/preamble.js
parentafc095f513cf6601ef337ca53f4f1eda77b7f877 (diff)
refactor out parsing of nested demangled runs
Diffstat (limited to 'src/preamble.js')
-rw-r--r--src/preamble.js46
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);