summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--binaryninjacore.h4
-rw-r--r--demangle.cpp66
-rw-r--r--python/demangle.py24
-rw-r--r--python/generator.cpp12
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)