diff options
author | Alon Zakai <alonzakai@gmail.com> | 2013-10-12 13:44:52 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2013-10-12 13:44:52 -0700 |
commit | 0a9d778a2435d51535c2103217a33699a3a20f8d (patch) | |
tree | 8710b0a0afa651c6ff5756f936f0fb6e7262476b /src | |
parent | 7842940b421846c9ea796d3756799036b2bb1166 (diff) |
demangle some templates
Diffstat (limited to 'src')
-rw-r--r-- | src/preamble.js | 74 |
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; } |