summaryrefslogtreecommitdiff
path: root/scriptingprovider.cpp
diff options
context:
space:
mode:
authorBrian Potchik <brian@vector35.com>2023-08-17 17:47:55 -0400
committerBrian Potchik <brian@vector35.com>2023-08-17 17:47:55 -0400
commit1174e544b0283bd30962d0a6a528af0aca43367c (patch)
tree786db6e7c4bc309bf54a5e4e957c95510516a90e /scriptingprovider.cpp
parentdf645681ec6c8c5e6121450cccd3ba8ab773f97b (diff)
Ensure consistent lifetimes for UI-accessible BinaryView instances in Python.
Diffstat (limited to 'scriptingprovider.cpp')
-rw-r--r--scriptingprovider.cpp19
1 files changed, 19 insertions, 0 deletions
diff --git a/scriptingprovider.cpp b/scriptingprovider.cpp
index c3c4d615..1aefd4f7 100644
--- a/scriptingprovider.cpp
+++ b/scriptingprovider.cpp
@@ -63,6 +63,7 @@ ScriptingInstance::ScriptingInstance(ScriptingProvider* provider)
cb.externalRefReleased = nullptr;
cb.executeScriptInput = ExecuteScriptInputCallback;
cb.cancelScriptInput = CancelScriptInputCallback;
+ cb.releaseBinaryView = ReleaseBinaryViewCallback;
cb.setCurrentBinaryView = SetCurrentBinaryViewCallback;
cb.setCurrentFunction = SetCurrentFunctionCallback;
cb.setCurrentBasicBlock = SetCurrentBasicBlockCallback;
@@ -102,6 +103,14 @@ void ScriptingInstance::CancelScriptInputCallback(void* ctxt)
}
+void ScriptingInstance::ReleaseBinaryViewCallback(void* ctxt, BNBinaryView* view)
+{
+ CallbackRef<ScriptingInstance> instance(ctxt);
+ Ref<BinaryView> object = view ? new BinaryView(BNNewViewReference(view)) : nullptr;
+ instance->ReleaseBinaryView(object);
+}
+
+
void ScriptingInstance::SetCurrentBinaryViewCallback(void* ctxt, BNBinaryView* view)
{
CallbackRef<ScriptingInstance> instance(ctxt);
@@ -168,6 +177,10 @@ void ScriptingInstance::DestroyInstance()
void ScriptingInstance::CancelScriptInput() {}
+
+void ScriptingInstance::ReleaseBinaryView(BinaryView*) {}
+
+
void ScriptingInstance::SetCurrentBinaryView(BinaryView*) {}
@@ -265,6 +278,12 @@ void CoreScriptingInstance::CancelScriptInput()
}
+void CoreScriptingInstance::ReleaseBinaryView(BinaryView* view)
+{
+ BNScriptingInstanceReleaseBinaryView(m_object, view ? view->GetObject() : nullptr);
+}
+
+
void CoreScriptingInstance::SetCurrentBinaryView(BinaryView* view)
{
BNSetScriptingInstanceCurrentBinaryView(m_object, view ? view->GetObject() : nullptr);