summaryrefslogtreecommitdiff
path: root/python/scriptingprovider.py
diff options
context:
space:
mode:
authorJosh Ferrell <josh@vector35.com>2023-03-29 15:41:59 -0400
committerJosh Ferrell <josh@vector35.com>2023-03-29 15:41:59 -0400
commitf270c5099ace1ae496257841a5bdff4bc36f01c1 (patch)
tree15f6ba3fd8f9906ed0b51715837648f835c218af /python/scriptingprovider.py
parent8d791bc9eb608139c6fd9d99ab0d96ed37561d3a (diff)
Add support for warnings to ScriptingInstance
Diffstat (limited to 'python/scriptingprovider.py')
-rw-r--r--python/scriptingprovider.py36
1 files changed, 29 insertions, 7 deletions
diff --git a/python/scriptingprovider.py b/python/scriptingprovider.py
index 06ac9170..e18a906a 100644
--- a/python/scriptingprovider.py
+++ b/python/scriptingprovider.py
@@ -44,10 +44,12 @@ from . import settings
from . import binaryview
from . import basicblock
from . import function
-from .log import log_info, log_error, is_output_redirected_to_log
+from .log import log_info, log_warn, log_error, is_output_redirected_to_log
from .pluginmanager import RepositoryManager
from .enums import ScriptingProviderExecuteResult, ScriptingProviderInputReadyState
+_WARNING_REGEX = re.compile(r'^\S+:\d+: \w+Warning: ')
+
class _ThreadActionContext:
_actions = []
@@ -76,6 +78,7 @@ class ScriptingOutputListener:
self._cb = core.BNScriptingOutputListener()
self._cb.context = 0
self._cb.output = self._cb.output.__class__(self._output)
+ self._cb.warning = self._cb.warning.__class__(self._warning)
self._cb.error = self._cb.error.__class__(self._error)
self._cb.inputReadyStateChanged = self._cb.inputReadyStateChanged.__class__(self._input_ready_state_changed)
core.BNRegisterScriptingInstanceOutputListener(handle, self._cb)
@@ -89,6 +92,13 @@ class ScriptingOutputListener:
except:
log_error(traceback.format_exc())
+ def _warning(self, ctxt, text):
+ try:
+ self.notify_warning(text)
+ except:
+ log_error(traceback.format_exc())
+
+
def _error(self, ctxt, text):
try:
self.notify_error(text)
@@ -104,6 +114,9 @@ class ScriptingOutputListener:
def notify_output(self, text):
pass
+ def notify_warning(self, text):
+ pass
+
def notify_error(self, text):
pass
@@ -293,6 +306,9 @@ class ScriptingInstance:
def output(self, text):
core.BNNotifyOutputForScriptingInstance(self.handle, text)
+ def warning(self, text):
+ core.BNNotifyWarningForScriptingInstance(self.handle, text)
+
def error(self, text):
core.BNNotifyErrorForScriptingInstance(self.handle, text)
@@ -421,9 +437,9 @@ class ScriptingProvider(metaclass=_ScriptingProviderMetaclass):
class _PythonScriptingInstanceOutput:
- def __init__(self, orig, is_error):
+ def __init__(self, orig, is_error_output):
self.orig = orig
- self.is_error = is_error
+ self.is_error_output = is_error_output
self.buffer = ""
self.encoding = 'UTF-8'
self.errors = None
@@ -485,8 +501,11 @@ class _PythonScriptingInstanceOutput:
line = self.buffer[:i]
self.buffer = self.buffer[i + 1:]
- if self.is_error:
- log_error(line)
+ if self.is_error_output:
+ if _WARNING_REGEX.match(line):
+ log_warn(line)
+ else:
+ log_error(line)
else:
log_info(line)
else:
@@ -494,8 +513,11 @@ class _PythonScriptingInstanceOutput:
else:
PythonScriptingInstance._interpreter.value = None
try:
- if self.is_error:
- interpreter.instance.error(data)
+ if self.is_error_output:
+ if _WARNING_REGEX.match(data):
+ interpreter.instance.warning(data)
+ else:
+ interpreter.instance.error(data)
else:
interpreter.instance.output(data)
finally: