summaryrefslogtreecommitdiff
path: root/rust/src/callingconvention.rs
diff options
context:
space:
mode:
authorMason Reed <mason@vector35.com>2024-08-01 17:03:39 -0400
committerMason Reed <mason@vector35.com>2024-12-14 13:37:40 -0500
commitb34ddd03f71c8637a80a264a3ea757b8295d482b (patch)
treeb1cbe1ce59e16a98d6dfa21975ce1661d80e9f38 /rust/src/callingconvention.rs
parent121c16592476754800b00a3b51595f4799944d04 (diff)
Pass length to free flag conditions list callback and remove libc from rust api
Allows language bindings like rust to free conditions lists sanely
Diffstat (limited to 'rust/src/callingconvention.rs')
-rw-r--r--rust/src/callingconvention.rs52
1 files changed, 36 insertions, 16 deletions
diff --git a/rust/src/callingconvention.rs b/rust/src/callingconvention.rs
index 915bdcc2..37c5012f 100644
--- a/rust/src/callingconvention.rs
+++ b/rust/src/callingconvention.rs
@@ -97,13 +97,18 @@ where
{
ffi_wrap!("CallingConvention::caller_saved_registers", unsafe {
let ctxt = &*(ctxt as *mut CustomCallingConventionContext<C>);
- let mut regs = ctxt.cc.caller_saved_registers();
+ let mut regs: Vec<_> = ctxt
+ .cc
+ .caller_saved_registers()
+ .iter()
+ .map(|r| r.id())
+ .collect();
// SAFETY: `count` is an out parameter
- unsafe { *count = regs.len() };
+ *count = regs.len();
let regs_ptr = regs.as_mut_ptr();
mem::forget(regs);
- regs_ptr as *mut _
+ regs_ptr
})
}
@@ -113,13 +118,18 @@ where
{
ffi_wrap!("CallingConvention::callee_saved_registers", unsafe {
let ctxt = &*(ctxt as *mut CustomCallingConventionContext<C>);
- let mut regs = ctxt.cc.callee_saved_registers();
-
+ let mut regs: Vec<_> = ctxt
+ .cc
+ .callee_saved_registers()
+ .iter()
+ .map(|r| r.id())
+ .collect();
+
// SAFETY: `count` is an out parameter
- unsafe { *count = regs.len() };
+ *count = regs.len();
let regs_ptr = regs.as_mut_ptr();
mem::forget(regs);
- regs_ptr as *mut _
+ regs_ptr
})
}
@@ -129,13 +139,13 @@ where
{
ffi_wrap!("CallingConvention::int_arg_registers", unsafe {
let ctxt = &*(ctxt as *mut CustomCallingConventionContext<C>);
- let mut regs = ctxt.cc.int_arg_registers();
+ let mut regs: Vec<_> = ctxt.cc.int_arg_registers().iter().map(|r| r.id()).collect();
// SAFETY: `count` is an out parameter
- unsafe { *count = regs.len() };
+ *count = regs.len();
let regs_ptr = regs.as_mut_ptr();
mem::forget(regs);
- regs_ptr as *mut _
+ regs_ptr
})
}
@@ -145,13 +155,18 @@ where
{
ffi_wrap!("CallingConvention::float_arg_registers", unsafe {
let ctxt = &*(ctxt as *mut CustomCallingConventionContext<C>);
- let mut regs = ctxt.cc.float_arg_registers();
+ let mut regs: Vec<_> = ctxt
+ .cc
+ .float_arg_registers()
+ .iter()
+ .map(|r| r.id())
+ .collect();
// SAFETY: `count` is an out parameter
- unsafe { *count = regs.len() };
+ *count = regs.len();
let regs_ptr = regs.as_mut_ptr();
mem::forget(regs);
- regs_ptr as *mut _
+ regs_ptr
})
}
@@ -267,13 +282,18 @@ where
{
ffi_wrap!("CallingConvention::implicitly_defined_registers", unsafe {
let ctxt = &*(ctxt as *mut CustomCallingConventionContext<C>);
- let mut regs = ctxt.cc.implicitly_defined_registers();
+ let mut regs: Vec<_> = ctxt
+ .cc
+ .implicitly_defined_registers()
+ .iter()
+ .map(|r| r.id())
+ .collect();
// SAFETY: `count` is an out parameter
- unsafe { *count = regs.len() };
+ *count = regs.len();
let regs_ptr = regs.as_mut_ptr();
mem::forget(regs);
- regs_ptr as *mut _
+ regs_ptr
})
}