summaryrefslogtreecommitdiff
path: root/rust/src/function.rs
diff options
context:
space:
mode:
authorBrandon Miller <brandon@vector35.com>2025-05-19 11:46:24 -0400
committerBrandon Miller <brandon@vector35.com>2025-05-19 11:46:24 -0400
commite6496396f37f337f3a8422fdb66f261257d25b61 (patch)
tree9f18a999420103338bb6b7f284da1060e4fd01d9 /rust/src/function.rs
parent42886bea7384f0163c43bacc5afa7b9ffe6a589c (diff)
Implement function level metadata
Diffstat (limited to 'rust/src/function.rs')
-rw-r--r--rust/src/function.rs43
1 files changed, 43 insertions, 0 deletions
diff --git a/rust/src/function.rs b/rust/src/function.rs
index 60c8970c..89ade8f8 100644
--- a/rust/src/function.rs
+++ b/rust/src/function.rs
@@ -43,6 +43,7 @@ use crate::high_level_il::HighLevelILFunction;
use crate::language_representation::CoreLanguageRepresentationFunction;
use crate::low_level_il::LowLevelILRegularFunction;
use crate::medium_level_il::MediumLevelILFunction;
+use crate::metadata::Metadata;
use crate::variable::{
IndirectBranchInfo, MergedVariable, NamedVariableWithType, RegisterValue, RegisterValueType,
StackVariableReference, Variable,
@@ -2428,6 +2429,48 @@ impl Function {
assert!(!result.is_null());
unsafe { Array::new(result, count, ()) }
}
+
+ pub fn query_metadata(&self, key: &str) -> Option<Ref<Metadata>> {
+ let key = key.to_cstr();
+ let value: *mut BNMetadata = unsafe { BNFunctionQueryMetadata(self.handle, key.as_ptr()) };
+ if value.is_null() {
+ None
+ } else {
+ Some(unsafe { Metadata::ref_from_raw(value) })
+ }
+ }
+
+ pub fn get_metadata(&self) -> Option<Ref<Metadata>> {
+ let value: *mut BNMetadata = unsafe { BNFunctionGetMetadata(self.handle) };
+ if value.is_null() {
+ None
+ } else {
+ Some(unsafe { Metadata::ref_from_raw(value) })
+ }
+ }
+
+ pub fn get_auto_metadata(&self) -> Option<Ref<Metadata>> {
+ let value: *mut BNMetadata = unsafe { BNFunctionGetAutoMetadata(self.handle) };
+ if value.is_null() {
+ None
+ } else {
+ Some(unsafe { Metadata::ref_from_raw(value) })
+ }
+ }
+
+ pub fn store_metadata<V>(&self, key: &str, value: V, is_auto: bool)
+ where
+ V: Into<Ref<Metadata>>,
+ {
+ let md = value.into();
+ let key = key.to_cstr();
+ unsafe { BNFunctionStoreMetadata(self.handle, key.as_ptr(), md.as_ref().handle, is_auto) };
+ }
+
+ pub fn remove_metadata(&self, key: &str) {
+ let key = key.to_cstr();
+ unsafe { BNFunctionRemoveMetadata(self.handle, key.as_ptr()) };
+ }
}
impl Debug for Function {