diff options
author | Alon Zakai <alonzakai@gmail.com> | 2013-10-11 11:33:45 -0400 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2013-10-11 11:33:59 -0400 |
commit | 2cc20b41629bc533902ab25771388665c9276e58 (patch) | |
tree | cbdf3a6738e32fad1867540ed75ca8c8811c0b53 /src | |
parent | 7c817f1d409f072d09caf39e7aa80290ce006d16 (diff) |
C++ demangle helper
Diffstat (limited to 'src')
-rw-r--r-- | src/preamble.js | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/src/preamble.js b/src/preamble.js index 88aaff77..03627760 100644 --- a/src/preamble.js +++ b/src/preamble.js @@ -640,6 +640,28 @@ function stringToUTF32(str, outPtr) { } Module['stringToUTF32'] = stringToUTF32; +function demangle(func) { + if (typeof func === 'number') func = Pointer_stringify(func); + assert(func[0] === '_'); + if (func[1] !== '_') return func.substr(1); // C function + assert(func[2] === 'Z'); + if (func[3] !== 'N') { + // not namespaced + var m = /(\d+)([^\d].*)/.exec(func.substr(3)); + return m[2].substr(0, m[1]); + } + // namespaced N-E + var i = 4, ret = []; + while (func[i] !== 'E') { + var size = parseInt(func.substr(i)); + var pre = size.toString().length; + ret.push(func.substr(i + pre, size)); + i += pre + size; + assert(pre > 0 && size > 0 && i < func.length); + } + return ret.join('::'); +} + // Memory management var PAGE_SIZE = 4096; |