diff options
author | Alon Zakai <alonzakai@gmail.com> | 2013-10-12 16:05:46 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2013-10-12 16:05:46 -0700 |
commit | ea871e65dd75ef5a12a8700ce4b6adba5a2f6946 (patch) | |
tree | 3981fddc6e32d6d6dd1e56906ca7e4b0f142694d /src | |
parent | 0a9d778a2435d51535c2103217a33699a3a20f8d (diff) |
demangle basic templates
Diffstat (limited to 'src')
-rw-r--r-- | src/preamble.js | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/src/preamble.js b/src/preamble.js index 77f7dc9a..016248ea 100644 --- a/src/preamble.js +++ b/src/preamble.js @@ -660,7 +660,7 @@ function demangle(func) { while (func[i] !== 'E') { var size = parseInt(func.substr(i)); var pre = size.toString().length; - if (!size || !pre) return ret.join('::') + '?'; + if (!size || !pre) { i--; break; } // counter i++ below us ret.push(func.substr(i + pre, size)); i += pre + size; } @@ -678,7 +678,16 @@ function demangle(func) { 'f': 'float', 'd': 'double' }; - function parse(name, rawList) { // parses code until an 'E' ending + function debug(x) { + //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 + limit = limit || Infinity; var ret = '', list = []; function flushList() { return '(' + list.join(', ') + ')'; @@ -686,24 +695,33 @@ function demangle(func) { if (func[i] === 'I') { i++; var iList = parse('', true); - var iRet = basicTypes[func[i++]] || '?'; - ret += iRet + ' ' + name + '<' + iList.join(', ') + '>'; + //i++; + var iRet = parse('', true, 1, true); + ret += iRet[0] + ' ' + name + '<' + iList.join(', ') + '>'; } else { ret = name; } - paramLoop: while (i < func.length) { + paramLoop: while (i < func.length && limit-- > 0) { 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 'P': list.push(basicTypes[func[i++]] + '*'); break; // pointer + case 'L': { // literal + i++; // skip basic type + var end = func.indexOf('E', i); + var size = end - i; + list.push(func.substr(i, size)); + i += size + 2; // size + 'EE' + break; + } case 'E': break paramLoop; default: ret += '?' + c; break paramLoop; } } } - if (list.length === 1 && list[0] === 'void') list = []; // avoid (void) + if (!allowVoid && list.length === 1 && list[0] === 'void') list = []; // avoid (void) return rawList ? list : ret + flushList(); } return parse(ret); |