diff options
| author | Mason Reed <mason@vector35.com> | 2024-08-01 17:03:39 -0400 |
|---|---|---|
| committer | Mason Reed <mason@vector35.com> | 2024-12-14 13:37:40 -0500 |
| commit | b34ddd03f71c8637a80a264a3ea757b8295d482b (patch) | |
| tree | b1cbe1ce59e16a98d6dfa21975ce1661d80e9f38 /rust/src/callingconvention.rs | |
| parent | 121c16592476754800b00a3b51595f4799944d04 (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.rs | 52 |
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 }) } |
