aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/preamble.js72
-rw-r--r--tests/test_other.py10
2 files changed, 63 insertions, 19 deletions
diff --git a/src/preamble.js b/src/preamble.js
index 6f148e60..ecabcf69 100644
--- a/src/preamble.js
+++ b/src/preamble.js
@@ -641,25 +641,61 @@ 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 ? m[2].substr(0, m[1]) : func;
- }
- // 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);
+ try {
+ if (typeof func === 'number') func = Pointer_stringify(func);
+ assert(func[0] === '_');
+ if (func[1] !== '_') return func.substr(1); // C function
+ assert(func[2] === 'Z');
+ var i, ret;
+ if (func[3] !== 'N') {
+ // not namespaced
+ var m = /(\d+)([^\d].*)/.exec(func.substr(3));
+ if (!m) return func;
+ var size = parseInt(m[1]);
+ i = 3 + size.toString().length + size;
+ ret = m[2].substr(0, size);
+ } else {
+ // 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);
+ }
+ i++; // skip E
+ ret = ret.join('::');
+ }
+ // params
+ if (i < func.length) {
+ ret += '(';
+ var first = true, suffix = null;
+ paramLoop: while (i < func.length) {
+ if (!suffix && !first) ret += ', ';
+ first = false;
+ switch (func[i]) {
+ case 'c': ret += 'char'; i++; break;
+ case 's': ret += 'short'; i++; break;
+ case 'i': ret += 'int'; i++; break;
+ case 'l': ret += 'long'; i++; break;
+ case 'f': ret += 'float'; i++; break;
+ case 'd': ret += 'double'; i++; break;
+ case 'P': suffix = '*'; i++; continue; break;
+ case 'v': ret += 'void'; i++; break;
+ default: ret += '?' + func[i]; break paramLoop;
+ }
+ if (suffix) {
+ ret += suffix;
+ suffix = null;
+ }
+ }
+ ret += ')';
+ }
+ return ret;
+ } catch(e) {
+ return func + '<demangle-err>';
}
- return ret.join('::');
}
// Memory management
diff --git a/tests/test_other.py b/tests/test_other.py
index bdd75490..c8d6cf70 100644
--- a/tests/test_other.py
+++ b/tests/test_other.py
@@ -1915,11 +1915,19 @@ done.
EM_ASM(Module.print(demangle('_main')));
EM_ASM(Module.print(demangle('__Z2f2v')));
EM_ASM(Module.print(demangle('__Z12abcdabcdabcdi')));
+ EM_ASM(Module.print(demangle('__Z4testcsifdPvPiPc')));
+ EM_ASM(Module.print(demangle('__ZN4test5moarrEcslfdPvPiPc')));
EM_ASM(Module.print(demangle('__ZN4Waka1f12a234123412345pointEv')));
return 0;
}
''')
Popen([PYTHON, EMCC, 'src.cpp']).communicate()
- self.assertContained('main\nf2\nabcdabcdabcd\nWaka::f::a23412341234::point\n', run_js('a.out.js'))
+ self.assertContained('''main
+f2(void)
+abcdabcdabcd(int)
+test(char, short, int, float, double, void*, int*, char*)
+test::moarr(char, short, long, float, double, void*, int*, char*)
+Waka::f::a23412341234::point(void)
+''', run_js('a.out.js'))