aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/preamble.js79
1 files changed, 41 insertions, 38 deletions
diff --git a/src/preamble.js b/src/preamble.js
index aa0787a0..6e5d85b4 100644
--- a/src/preamble.js
+++ b/src/preamble.js
@@ -646,40 +646,11 @@ function demangle(func) {
if (func[0] !== '_') return func;
if (func[1] !== '_') return func.substr(1); // C function
if (func[2] !== 'Z') return func;
- var i = 3, ret, suffix = '';
- if (func[i] !== 'N') {
- // not namespaced
- if (func[i] === 'K') {
- suffix = ' const';
- i++;
- }
- var m = /(\d+)([^\d].*)/.exec(func.substr(i));
- if (!m) return func;
- var size = parseInt(m[1]);
- i += size.toString().length + size;
- ret = m[2].substr(0, size);
- } else {
- // namespaced N-E
- i++;
- if (func[i] === 'K') {
- suffix = ' const';
- i++;
- }
- var ret = [];
- while (func[i] !== 'E') {
- var size = parseInt(func.substr(i));
- var pre = size.toString().length;
- if (!size || !pre) { i--; break; } // counter i++ below us
- ret.push(func.substr(i + pre, size));
- i += pre + size;
- }
- i++; // skip E
- ret = ret.join('::');
- }
- if (i >= func.length) return ret;
+ var i = 3;
// params, etc.
var basicTypes = {
'v': 'void',
+ 'b': 'bool',
'c': 'char',
's': 'short',
'i': 'int',
@@ -688,24 +659,56 @@ function demangle(func) {
'd': 'double'
};
function debug(x) {
- //return;
+ return;
if (x) Module.print(x);
Module.print(func);
var pre = '';
for (var a = 0; a < i; a++) pre += ' ';
Module.print (pre + '^');
}
- function parse(name, rawList, limit, allowVoid) { // parses code until an 'E' ending
+ function parse(rawList, limit, allowVoid) { // parses code until an 'E' ending
limit = limit || Infinity;
var ret = '', list = [];
function flushList() {
return '(' + list.join(', ') + ')';
}
+
+ var name, suffix = '';
+ if (func[i] !== 'N') {
+ // not namespaced
+ if (func[i] === 'K') {
+ suffix = ' const';
+ i++;
+ }
+ var size = parseInt(func.substr(i));
+ if (size) {
+ var pre = size.toString().length;
+ name = func.substr(i + pre, size);
+ i += pre + size;
+ }
+ } 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('::');
+ }
+
if (func[i] === 'I') {
i++;
- var iList = parse('', true);
- //i++;
- var iRet = parse('', true, 1, true);
+ var iList = parse(true);
+ var iRet = parse(true, 1, true);
ret += iRet[0] + ' ' + name + '<' + iList.join(', ') + '>';
} else {
ret = name;
@@ -731,9 +734,9 @@ function demangle(func) {
}
}
if (!allowVoid && list.length === 1 && list[0] === 'void') list = []; // avoid (void)
- return rawList ? list : ret + flushList();
+ return rawList ? list : ret + flushList() + suffix;
}
- return parse(ret) + suffix;
+ return parse();
} catch(e) {
return func + '<demangle-err>' + e;
}