aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2013-10-12 12:47:17 -0700
committerAlon Zakai <alonzakai@gmail.com>2013-10-12 12:47:17 -0700
commit7842940b421846c9ea796d3756799036b2bb1166 (patch)
tree38474466c53fd885e99d71d968ff9683e367496d /src
parenta6cfef0ce650e089d8b23bb0035c8ac19bd7c417 (diff)
work towards demangling of templates
Diffstat (limited to 'src')
-rw-r--r--src/preamble.js66
1 files changed, 42 insertions, 24 deletions
diff --git a/src/preamble.js b/src/preamble.js
index ecabcf69..ed1cbcae 100644
--- a/src/preamble.js
+++ b/src/preamble.js
@@ -643,9 +643,9 @@ Module['stringToUTF32'] = stringToUTF32;
function demangle(func) {
try {
if (typeof func === 'number') func = Pointer_stringify(func);
- assert(func[0] === '_');
+ if (func[0] !== '_') return func;
if (func[1] !== '_') return func.substr(1); // C function
- assert(func[2] === 'Z');
+ if (func[2] !== 'Z') return func;
var i, ret;
if (func[3] !== 'N') {
// not namespaced
@@ -660,41 +660,59 @@ function demangle(func) {
while (func[i] !== 'E') {
var size = parseInt(func.substr(i));
var pre = size.toString().length;
+ if (!size || !pre) return ret.join('::') + '?';
ret.push(func.substr(i + pre, size));
i += pre + size;
- assert(pre > 0 && size > 0 && i < func.length);
}
i++; // skip E
ret = ret.join('::');
}
- // params
+ // params, etc.
if (i < func.length) {
- ret += '(';
- var first = true, suffix = null;
- paramLoop: while (i < func.length) {
- if (!suffix && !first) ret += ', ';
- first = false;
- switch (func[i]) {
- case 'c': ret += 'char'; i++; break;
- case 's': ret += 'short'; i++; break;
- case 'i': ret += 'int'; i++; break;
- case 'l': ret += 'long'; i++; break;
- case 'f': ret += 'float'; i++; break;
- case 'd': ret += 'double'; i++; break;
- case 'P': suffix = '*'; i++; continue; break;
- case 'v': ret += 'void'; i++; break;
- default: ret += '?' + func[i]; break paramLoop;
+ var basicTypes = {
+ 'v': 'void',
+ 'c': 'char',
+ 's': 'short',
+ 'i': 'int',
+ 'l': 'long',
+ 'f': 'float',
+ 'd': 'double'
+ };
+ function parse(rawList) { // parses code until an 'E' ending
+ var ret = '', list = [];
+ function flushList() {
+ return '(' + list.join(', ') + ')';
}
- if (suffix) {
- ret += suffix;
- suffix = null;
+ var suffix = ''
+ paramLoop: while (i < func.length) {
+ var c = func[i++];
+ if (c in basicTypes) {
+ list.push(basicTypes[c] + suffix);
+ } else {
+ switch (c) {
+ case 'P': suffix = '*'; continue; break;
+ case 'I': {
+ var iList = parse(true);
+ var iRet = basicTypes[func[i++]] || '?';
+ return iRet + '<' + iList.join(', ') + '>';
+ break;
+ }
+ case 'E': {
+ break paramLoop;
+ }
+ default: ret += '?' + c; break paramLoop;
+ }
+ }
+ suffix = ''
}
+ if (list.length === 1 && list[0] === 'void') list = []; // avoid (void)
+ return rawList ? list : ret + flushList();
}
- ret += ')';
+ ret += parse();
}
return ret;
} catch(e) {
- return func + '<demangle-err>';
+ return func + '<demangle-err>' + e;
}
}