aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2013-10-11 11:33:45 -0400
committerAlon Zakai <alonzakai@gmail.com>2013-10-11 11:33:59 -0400
commit2cc20b41629bc533902ab25771388665c9276e58 (patch)
treecbdf3a6738e32fad1867540ed75ca8c8811c0b53 /src
parent7c817f1d409f072d09caf39e7aa80290ce006d16 (diff)
C++ demangle helper
Diffstat (limited to 'src')
-rw-r--r--src/preamble.js22
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;