summaryrefslogtreecommitdiff
path: root/python/scriptingprovider.py
diff options
context:
space:
mode:
authorPeter LaFosse <peter@vector35.com>2019-01-29 22:33:57 -0500
committerPeter LaFosse <peter@vector35.com>2019-01-29 22:34:52 -0500
commit6c2ae47c4e88c5fe5fc1cbd987fbd5aac9b38239 (patch)
tree2adfc8975d2ffb1cc481fc717981c7ca1635d787 /python/scriptingprovider.py
parent2c80bc959151a6b9888a8521a0efbba1a1843cb6 (diff)
Add cancelScript api for scriptingProvider
Diffstat (limited to 'python/scriptingprovider.py')
-rw-r--r--python/scriptingprovider.py23
1 files changed, 23 insertions, 0 deletions
diff --git a/python/scriptingprovider.py b/python/scriptingprovider.py
index 21a68fcd..690bd6cc 100644
--- a/python/scriptingprovider.py
+++ b/python/scriptingprovider.py
@@ -107,6 +107,7 @@ class ScriptingInstance(object):
self._cb.context = 0
self._cb.destroyInstance = self._cb.destroyInstance.__class__(self._destroy_instance)
self._cb.executeScriptInput = self._cb.executeScriptInput.__class__(self._execute_script_input)
+ self._cb.cancelScriptInput = self._cb.cancelScriptInput.__class__(self._cancel_script_input)
self._cb.setCurrentBinaryView = self._cb.setCurrentBinaryView.__class__(self._set_current_binary_view)
self._cb.setCurrentFunction = self._cb.setCurrentFunction.__class__(self._set_current_function)
self._cb.setCurrentBasicBlock = self._cb.setCurrentBasicBlock.__class__(self._set_current_basic_block)
@@ -133,6 +134,13 @@ class ScriptingInstance(object):
log.log_error(traceback.format_exc())
return ScriptingProviderExecuteResult.InvalidScriptInput
+ def _cancel_script_input(self, ctxt):
+ try:
+ return self.perform_cancel_script_input()
+ except:
+ log.log_error(traceback.format_exc())
+ return ScriptingProviderExecuteResult.ScriptExecutionCancelled
+
def _set_current_binary_view(self, ctxt, view):
try:
if view:
@@ -189,6 +197,10 @@ class ScriptingInstance(object):
return ScriptingProviderExecuteResult.InvalidScriptInput
@abc.abstractmethod
+ def perform_cancel_script_input(self):
+ return ScriptingProviderExecuteResult.ScriptExecutionCancelled
+
+ @abc.abstractmethod
def perform_set_current_binary_view(self, view):
raise NotImplementedError
@@ -225,6 +237,9 @@ class ScriptingInstance(object):
def execute_script_input(self, text):
return core.BNExecuteScriptInput(self.handle, text)
+ def cancel_script_input(self, text):
+ return core.BNCancelScriptInput(self.handle)
+
def set_current_binary_view(self, view):
if view is not None:
view = view.handle
@@ -636,6 +651,14 @@ class PythonScriptingInstance(ScriptingInstance):
return ScriptingProviderExecuteResult.SuccessfulScriptExecution
@abc.abstractmethod
+ def perform_cancel_script_input(self):
+ for tid, tobj in threading._active.items():
+ if tobj is self.interpreter:
+ if ctypes.pythonapi.PyThreadState_SetAsyncExc(ctypes.c_long(tid), ctypes.py_object(KeyboardInterrupt)) != 1:
+ ctypes.pythonapi.PyThreadState_SetAsyncExc(ctypes.c_long(tid), None)
+ break
+
+ @abc.abstractmethod
def perform_set_current_binary_view(self, view):
self.interpreter.current_view = view