diff options
-rw-r--r-- | src/preamble.js | 72 | ||||
-rw-r--r-- | tests/test_other.py | 10 |
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')) |