forked from maltek/swift-frida
/
mangling.js
34 lines (26 loc) · 897 Bytes
/
mangling.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
"use strict";
/* jshint esnext: true, evil: true */
module.exports = {
isSwiftName(symbol) {
let name = symbol.name || symbol;
return name.startsWith('_T') || name.startsWith('$s') || name.startsWith('_S');
},
knownMangled: new Map(),
demangle(name) {
if (!this.isSwiftName(name))
throw new Error("function name '" + name + "' is not a mangled Swift function");
let api = require('./runtime-api').api;
let cStr = Memory.allocUtf8String(name);
let demangled = api.swift_demangle(cStr, name.length, ptr(0), ptr(0), 0);
let res = demangled.readUtf8String();
api.free(demangled);
this.knownMangled.set(res, name);
return res;
},
demangleIfSwift(name) {
if (this.isSwiftName(name))
return this.demangle(name);
else
return name;
},
};