summaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/architecture.py2
-rw-r--r--python/binaryview.py8
-rw-r--r--python/generator.cpp10
-rw-r--r--python/interaction.py8
-rw-r--r--python/platform.py4
-rw-r--r--python/types.py10
-rw-r--r--python/update.py16
7 files changed, 32 insertions, 26 deletions
diff --git a/python/architecture.py b/python/architecture.py
index 51b1ae00..7dd8ff91 100644
--- a/python/architecture.py
+++ b/python/architecture.py
@@ -2570,7 +2570,7 @@ class CoreArchitecture(Architecture):
errors = ctypes.c_char_p()
if not core.BNAssemble(self.handle, code, addr, result.handle, errors):
error_str = errors.value
- core.BNFreeString(ctypes.cast(errors, ctypes.POINTER(ctypes.c_byte)))
+ core.free_string(errors)
raise ValueError("Could not assemble: %s" % error_str)
return bytes(result)
diff --git a/python/binaryview.py b/python/binaryview.py
index 4266e8a5..c9cd7562 100644
--- a/python/binaryview.py
+++ b/python/binaryview.py
@@ -5497,7 +5497,7 @@ class BinaryView(object):
if not core.BNParseTypeString(self.handle, text, result, errors, type_list):
assert errors.value is not None, "core.BNParseTypeString returned 'errors' set to None"
error_str = errors.value.decode("utf-8")
- core.BNFreeString(ctypes.cast(errors, ctypes.POINTER(ctypes.c_byte)))
+ core.free_string(errors)
raise SyntaxError(error_str)
type_obj = _types.Type(core.BNNewTypeReference(result.type), platform = self.platform)
name = _types.QualifiedName._from_core_struct(result.name)
@@ -5530,7 +5530,7 @@ class BinaryView(object):
if not core.BNParseTypesString(self.handle, text, parse, errors, type_list):
assert errors.value is not None, "core.BNParseTypesString returned errors set to None"
error_str = errors.value.decode("utf-8")
- core.BNFreeString(ctypes.cast(errors, ctypes.POINTER(ctypes.c_byte)))
+ core.free_string(errors)
raise SyntaxError(error_str)
type_dict = {}
@@ -5591,7 +5591,7 @@ class BinaryView(object):
else:
error_str = "Error parsing specified PossibleValueSet"
core.BNFreePossibleValueSet(result)
- core.BNFreeString(ctypes.cast(errors, ctypes.POINTER(ctypes.c_byte)))
+ core.free_string(errors)
raise ValueError(error_str)
return variable.PossibleValueSet(self.arch, result)
@@ -6685,7 +6685,7 @@ class BinaryView(object):
if not core.BNParseExpression(self.handle, expression, offset, here, errors):
assert errors.value is not None, "core.BNParseExpression returned errors set to None"
error_str = errors.value.decode("utf-8")
- core.BNFreeString(ctypes.cast(errors, ctypes.POINTER(ctypes.c_byte)))
+ core.free_string(errors)
raise ValueError(error_str)
return offset.value
diff --git a/python/generator.cpp b/python/generator.cpp
index 16fa5def..8b7b202c 100644
--- a/python/generator.cpp
+++ b/python/generator.cpp
@@ -209,13 +209,16 @@ int main(int argc, char* argv[])
fprintf(out, "def cstr(var) -> Optional[str]:\n");
fprintf(out, " if var is None:\n");
fprintf(out, " return None\n");
- fprintf(out, " return var.encode(\"utf-8\")\n");
+ fprintf(out, " return var.encode(\"utf-8\")\n\n");
fprintf(out, "def pyNativeStr(arg):\n");
fprintf(out, " if isinstance(arg, str):\n");
fprintf(out, " return arg\n");
fprintf(out, " else:\n");
- fprintf(out, " return arg.decode('utf8')\n");
+ fprintf(out, " return arg.decode('utf8')\n\n");
+
+ fprintf(out, "def free_string(value:ctypes.c_char_p) -> None:\n");
+ fprintf(out, " BNFreeString(ctypes.cast(value, ctypes.POINTER(ctypes.c_byte)))\n\n");
// Create type objects
fprintf(out, "# Type definitions\n");
@@ -245,6 +248,8 @@ int main(int argc, char* argv[])
if (!stringField)
fprintf(out, "\tpass\n");
+
+ fprintf(out, "%sPointer = ctypes.POINTER(%s)\n", name.c_str(), name.c_str());
}
else if (i.second->GetClass() == EnumerationTypeClass)
{
@@ -305,7 +310,6 @@ int main(int argc, char* argv[])
if (requiresDependency)
continue;
-
fprintf(out, "%s._fields_ = [\n", name.c_str());
for (auto& j : type->GetStructure()->GetMembers())
{
diff --git a/python/interaction.py b/python/interaction.py
index aecb3b44..a22987bf 100644
--- a/python/interaction.py
+++ b/python/interaction.py
@@ -1072,7 +1072,7 @@ def get_text_line_input(prompt, title):
if not core.BNGetTextLineInput(value, prompt, title):
return None
result = value.value
- core.BNFreeString(ctypes.cast(value, ctypes.POINTER(ctypes.c_byte)))
+ core.free_string(value)
return result
@@ -1172,7 +1172,7 @@ def get_open_filename_input(prompt:str, ext:str="") -> Optional[str]:
return None
result = value.value
assert result is not None
- core.BNFreeString(ctypes.cast(value, ctypes.POINTER(ctypes.c_byte)))
+ core.free_string(value)
return result.decode("utf-8")
@@ -1197,7 +1197,7 @@ def get_save_filename_input(prompt:str, ext:str="", default_name:str="") -> Opti
return None
result = value.value
assert result is not None
- core.BNFreeString(ctypes.cast(value, ctypes.POINTER(ctypes.c_byte)))
+ core.free_string(value)
return result.decode("utf-8")
@@ -1220,7 +1220,7 @@ def get_directory_name_input(prompt:str, default_name:str=""):
return None
result = value.value
assert result is not None
- core.BNFreeString(ctypes.cast(value, ctypes.POINTER(ctypes.c_byte)))
+ core.free_string(value)
return result.decode("utf-8")
diff --git a/python/platform.py b/python/platform.py
index 9c9d0657..882b4acb 100644
--- a/python/platform.py
+++ b/python/platform.py
@@ -422,7 +422,7 @@ class Platform(metaclass=_PlatformMetaClass):
len(include_dirs), auto_type_source)
assert errors.value is not None, "core.BNParseTypesFromSource returned errors set to None"
error_str = errors.value.decode("utf-8")
- core.BNFreeString(ctypes.cast(errors, ctypes.POINTER(ctypes.c_byte)))
+ core.free_string(errors)
if not result:
raise SyntaxError(error_str)
type_dict = {}
@@ -472,7 +472,7 @@ class Platform(metaclass=_PlatformMetaClass):
len(include_dirs), auto_type_source)
assert errors.value is not None, "core.BNParseTypesFromSourceFile returned errors set to None"
error_str = errors.value.decode("utf-8")
- core.BNFreeString(ctypes.cast(errors, ctypes.POINTER(ctypes.c_byte)))
+ core.free_string(errors)
if not result:
raise SyntaxError(error_str)
type_dict = {}
diff --git a/python/types.py b/python/types.py
index 3cd44bd8..87fa7ddb 100644
--- a/python/types.py
+++ b/python/types.py
@@ -1662,10 +1662,12 @@ def preprocess_source(source, filename=None, include_dirs=[]):
output = ctypes.c_char_p()
errors = ctypes.c_char_p()
result = core.BNPreprocessSource(source, filename, output, errors, dir_buf, len(include_dirs))
- output_str = output.value
- error_str = errors.value
- core.BNFreeString(ctypes.cast(output, ctypes.POINTER(ctypes.c_byte)))
- core.BNFreeString(ctypes.cast(errors, ctypes.POINTER(ctypes.c_byte)))
+ assert output.value is not None
+ assert errors.value is not None
+ output_str = output.value.decode('utf-8')
+ error_str = errors.value.decode('utf-8')
+ core.free_string(output)
+ core.free_string(errors)
if result:
return (output_str, error_str)
return (None, error_str)
diff --git a/python/update.py b/python/update.py
index 9537ad83..8d4611d6 100644
--- a/python/update.py
+++ b/python/update.py
@@ -38,7 +38,7 @@ class _UpdateChannelMetaClass(type):
assert channels is not None, "core.BNGetUpdateChannels returned None"
if errors:
error_str = errors.value
- core.BNFreeString(ctypes.cast(errors, ctypes.POINTER(ctypes.c_byte)))
+ core.free_string(errors)
raise IOError(error_str)
try:
for i in range(0, count.value):
@@ -54,7 +54,7 @@ class _UpdateChannelMetaClass(type):
assert channels is not None, "core.BNGetUpdateChannels returned None"
if errors:
error_str = errors.value
- core.BNFreeString(ctypes.cast(errors, ctypes.POINTER(ctypes.c_byte)))
+ core.free_string(errors)
raise IOError(error_str)
result = None
for i in range(0, count.value):
@@ -103,7 +103,7 @@ class UpdateChannel(metaclass=_UpdateChannelMetaClass):
assert versions is not None, "core.BNGetUpdateChannelVersions returned None"
if errors:
error_str = errors.value
- core.BNFreeString(ctypes.cast(errors, ctypes.POINTER(ctypes.c_byte)))
+ core.free_string(errors)
raise IOError(error_str)
result = []
for i in range(0, count.value):
@@ -120,7 +120,7 @@ class UpdateChannel(metaclass=_UpdateChannelMetaClass):
assert versions is not None, "core.BNGetUpdateChannelVersions returned None"
if errors:
error_str = errors.value
- core.BNFreeString(ctypes.cast(errors, ctypes.POINTER(ctypes.c_byte)))
+ core.free_string(errors)
raise IOError(error_str)
result = None
for i in range(0, count.value):
@@ -137,7 +137,7 @@ class UpdateChannel(metaclass=_UpdateChannelMetaClass):
result = core.BNAreUpdatesAvailable(self._name, None, None, errors)
if errors:
error_str = errors.value
- core.BNFreeString(ctypes.cast(errors, ctypes.POINTER(ctypes.c_byte)))
+ core.free_string(errors)
raise IOError(error_str)
return result
@@ -159,7 +159,7 @@ class UpdateChannel(metaclass=_UpdateChannelMetaClass):
result = core.BNUpdateToLatestVersion(self._name, errors, cb.cb, None)
if errors:
error_str = errors.value
- core.BNFreeString(ctypes.cast(errors, ctypes.POINTER(ctypes.c_byte)))
+ core.free_string(errors)
raise IOError(error_str)
return UpdateResult(result)
@@ -207,7 +207,7 @@ class UpdateVersion(object):
result = core.BNUpdateToVersion(self._channel.name, self._version, errors, cb.cb, None)
if errors:
error_str = errors.value
- core.BNFreeString(ctypes.cast(errors, ctypes.POINTER(ctypes.c_byte)))
+ core.free_string(errors)
raise IOError(error_str)
return UpdateResult(result)
@@ -294,7 +294,7 @@ def install_pending_update():
core.BNInstallPendingUpdate(errors)
if errors:
error_str = errors.value
- core.BNFreeString(ctypes.cast(errors, ctypes.POINTER(ctypes.c_byte)))
+ core.free_string(errors)
raise IOError(error_str)