diff options
| -rw-r--r-- | binaryninjacore.h | 4 | ||||
| -rw-r--r-- | demangle.cpp | 66 | ||||
| -rw-r--r-- | python/demangle.py | 24 | ||||
| -rw-r--r-- | python/generator.cpp | 12 |
4 files changed, 27 insertions, 79 deletions
diff --git a/binaryninjacore.h b/binaryninjacore.h index 4b4f43cc..7ac582d6 100644 --- a/binaryninjacore.h +++ b/binaryninjacore.h @@ -6436,9 +6436,7 @@ extern "C" BINARYNINJACOREAPI uint32_t BNGetAddressRenderedWidth(uint64_t addr); - BINARYNINJACOREAPI void BNRustFreeString(const char* const); - BINARYNINJACOREAPI void BNRustFreeStringArray(const char** const, uint64_t); - BINARYNINJACOREAPI char** BNRustSimplifyStrToFQN(const char* const, bool); + BINARYNINJACOREAPI BNQualifiedName BNRustSimplifyStrToFQN(const char* const, bool); BINARYNINJACOREAPI char* BNRustSimplifyStrToStr(const char* const); BINARYNINJACOREAPI BNDebugInfoParser* BNRegisterDebugInfoParser(const char* name, diff --git a/demangle.cpp b/demangle.cpp index b2f92c2e..d371c368 100644 --- a/demangle.cpp +++ b/demangle.cpp @@ -61,72 +61,32 @@ namespace BinaryNinja { } - string SimplifyName::to_string(const string& input) + string SimplifyToString(const string& input) { - return (string)SimplifyName(input, SimplifierDest::str, true); + return BNRustSimplifyStrToStr(input.c_str()); } - string SimplifyName::to_string(const QualifiedName& input) + string SimplifyToString(const QualifiedName& input) { - return (string)SimplifyName(input.GetString(), SimplifierDest::str, true); + return BNRustSimplifyStrToStr(input.GetString().c_str()); } - QualifiedName SimplifyName::to_qualified_name(const string& input, bool simplify) + QualifiedName SimplifyToQualifiedName(const string& input, bool simplify) { - return SimplifyName(input, SimplifierDest::fqn, simplify).operator QualifiedName(); - } - - - QualifiedName SimplifyName::to_qualified_name(const QualifiedName& input) - { - return SimplifyName(input.GetString(), SimplifierDest::fqn, true).operator QualifiedName(); - } - - - SimplifyName::SimplifyName(const string& input, const SimplifierDest dest, const bool simplify) : - m_rust_string(nullptr), m_rust_array(nullptr), m_length(0) - { - if (dest == SimplifierDest::str) - m_rust_string = BNRustSimplifyStrToStr(input.c_str()); - else - m_rust_array = const_cast<const char**>(BNRustSimplifyStrToFQN(input.c_str(), simplify)); - } - - - SimplifyName::~SimplifyName() - { - if (m_rust_string) - BNRustFreeString(m_rust_string); - if (m_rust_array) - { - if (m_length == 0) - { - // Should never reach here - LogWarn("Deallocating SimplifyName without having been used; Likely misuse of API.\n"); - uint64_t index = 0; - while (m_rust_array[index][0] != 0x0) - ++index; - m_length = index + 1; - } - BNRustFreeStringArray(m_rust_array, m_length); - } + BNQualifiedName name = BNRustSimplifyStrToFQN(input.c_str(), simplify); + QualifiedName result = QualifiedName::FromAPIObject(&name); + BNFreeQualifiedName(&name); + return result; } - SimplifyName::operator string() const { return string(m_rust_string); } - - - SimplifyName::operator QualifiedName() + QualifiedName SimplifyToQualifiedName(const QualifiedName& input) { - QualifiedName result; - uint64_t index = 0; - while (m_rust_array[index][0] != 0x0) - { - result.push_back(string(m_rust_array[index++])); - } - m_length = index; + BNQualifiedName name = BNRustSimplifyStrToFQN(input.GetString().c_str(), true); + QualifiedName result = QualifiedName::FromAPIObject(&name); + BNFreeQualifiedName(&name); return result; } } // namespace BinaryNinja diff --git a/python/demangle.py b/python/demangle.py index ce57b601..d3d01c97 100644 --- a/python/demangle.py +++ b/python/demangle.py @@ -171,23 +171,19 @@ def simplify_name_to_qualified_name(input_name, simplify=True): 'std::wstring' >>> """ - result = None + name = None if isinstance(input_name, str): - result = core.BNRustSimplifyStrToFQN(input_name, simplify) - assert result is not None, "core.BNRustSimplifyStrToFQN returned None" + name = core.BNRustSimplifyStrToFQN(input_name, simplify) + assert name is not None, "core.BNRustSimplifyStrToFQN returned None" elif isinstance(input_name, types.QualifiedName): - result = core.BNRustSimplifyStrToFQN(str(input_name), True) - assert result is not None, "core.BNRustSimplifyStrToFQN returned None" + name = core.BNRustSimplifyStrToFQN(str(input_name), True) + assert name is not None, "core.BNRustSimplifyStrToFQN returned None" else: raise TypeError("Parameter must be of type `str` or `types.QualifiedName`") - native_result = [] - for name in result: - if name == b'': - break - native_result.append(name.decode("utf-8")) - name_count = len(native_result) + result = types.QualifiedName._from_core_struct(name) + core.BNFreeQualifiedName(name) + if len(result) == 0: + return None + return result - native_result = types.QualifiedName(native_result) - core.BNRustFreeStringArray(result, name_count + 1) - return native_result diff --git a/python/generator.cpp b/python/generator.cpp index 9f5e24eb..fb9c3567 100644 --- a/python/generator.cpp +++ b/python/generator.cpp @@ -437,12 +437,9 @@ int main(int argc, char* argv[]) // From python -> C python3 requires str -> str.encode('charmap') bool swizzleArgs = true; - if (name == "BNFreeString" || name == "BNRustFreeString") + if (name == "BNFreeString") swizzleArgs = false; - // Rust-allocated strings are deallocated differently - bool rustFFI = name.rfind("BNRust", 0) == 0; - bool callbackConvention = false; if (name == "BNAllocString") { @@ -467,7 +464,7 @@ int main(int argc, char* argv[]) for (auto& j : i.second->GetParameters()) { fprintf(out, "\t\t"); - if (name == "BNFreeString" || name == "BNRustFreeString") + if (name == "BNFreeString") { // BNFreeString expects a pointer to a string allocated by the core, so do not use // a c_char_p here, as that would be allocated by the Python runtime. This can @@ -568,10 +565,7 @@ int main(int argc, char* argv[]) fprintf(out, "\tresult = "); fprintf(out, "%s\n", stringArgFuncCall.c_str()); fprintf(out, "\tstring = str(pyNativeStr(ctypes.cast(result, ctypes.c_char_p).value))\n"); - if (rustFFI) - fprintf(out, "\tBNRustFreeString(result)\n"); - else - fprintf(out, "\tBNFreeString(result)\n"); + fprintf(out, "\tBNFreeString(result)\n"); fprintf(out, "\treturn string\n"); } else if (pointerResult) |
