aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2013-10-12 13:44:52 -0700
committerAlon Zakai <alonzakai@gmail.com>2013-10-12 13:44:52 -0700
commit0a9d778a2435d51535c2103217a33699a3a20f8d (patch)
tree8710b0a0afa651c6ff5756f936f0fb6e7262476b /src
parent7842940b421846c9ea796d3756799036b2bb1166 (diff)
demangle some templates
Diffstat (limited to 'src')
-rw-r--r--src/preamble.js74
1 files changed, 35 insertions, 39 deletions
diff --git a/src/preamble.js b/src/preamble.js
index ed1cbcae..77f7dc9a 100644
--- a/src/preamble.js
+++ b/src/preamble.js
@@ -667,50 +667,46 @@ function demangle(func) {
i++; // skip E
ret = ret.join('::');
}
+ if (i >= func.length) return ret;
// params, etc.
- if (i < func.length) {
- 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(', ') + ')';
- }
- 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;
- }
+ var basicTypes = {
+ 'v': 'void',
+ 'c': 'char',
+ 's': 'short',
+ 'i': 'int',
+ 'l': 'long',
+ 'f': 'float',
+ 'd': 'double'
+ };
+ function parse(name, rawList) { // parses code until an 'E' ending
+ var ret = '', list = [];
+ function flushList() {
+ return '(' + list.join(', ') + ')';
+ }
+ if (func[i] === 'I') {
+ i++;
+ var iList = parse('', true);
+ var iRet = basicTypes[func[i++]] || '?';
+ ret += iRet + ' ' + name + '<' + iList.join(', ') + '>';
+ } else {
+ ret = name;
+ }
+ paramLoop: while (i < func.length) {
+ var c = func[i++];
+ if (c in basicTypes) {
+ list.push(basicTypes[c]);
+ } else {
+ switch (c) {
+ case 'P': list.push(basicTypes[func[i++]] + '*'); continue; 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 += parse();
+ if (list.length === 1 && list[0] === 'void') list = []; // avoid (void)
+ return rawList ? list : ret + flushList();
}
- return ret;
+ return parse(ret);
} catch(e) {
return func + '<demangle-err>' + e;
}