From b34ddd03f71c8637a80a264a3ea757b8295d482b Mon Sep 17 00:00:00 2001 From: Mason Reed Date: Thu, 1 Aug 2024 17:03:39 -0400 Subject: Pass length to free flag conditions list callback and remove libc from rust api Allows language bindings like rust to free conditions lists sanely --- rust/src/callingconvention.rs | 52 ++++++++++++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 16 deletions(-) (limited to 'rust/src/callingconvention.rs') 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); - 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); - 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); - 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); - 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); - 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 }) } -- cgit v1.3.1