@@ -1940,7 +1940,7 @@ where
1940
1940
None => BnString :: new ( "invalid_flag_group" ) . into_raw ( ) ,
1941
1941
}
1942
1942
}
1943
-
1943
+
1944
1944
extern "C" fn cb_registers_full_width < A > ( ctxt : * mut c_void , count : * mut usize ) -> * mut u32
1945
1945
where
1946
1946
A : ' static + Architecture < Handle = CustomArchitectureHandle < A > > + Send + Sync ,
@@ -2101,7 +2101,7 @@ where
2101
2101
2102
2102
if let Some ( group) = custom_arch. flag_group_from_id ( group) {
2103
2103
let mut flags = group. flags_required ( ) ;
2104
-
2104
+
2105
2105
// SAFETY: `count` is an out parameter
2106
2106
unsafe { * count = flags. len ( ) } ;
2107
2107
let regs_ptr = flags. as_mut_ptr ( ) ;
@@ -2127,23 +2127,13 @@ where
2127
2127
2128
2128
if let Some ( group) = custom_arch. flag_group_from_id ( group) {
2129
2129
let flag_conditions = group. flag_conditions ( ) ;
2130
+ let mut flags = flag_conditions. values ( ) . collect :: < Vec < _ > > ( ) ;
2130
2131
2131
- unsafe {
2132
- let allocation_size =
2133
- mem:: size_of :: < BNFlagConditionForSemanticClass > ( ) * flag_conditions. len ( ) ;
2134
- let result = libc:: malloc ( allocation_size) as * mut BNFlagConditionForSemanticClass ;
2135
- let out_slice = slice:: from_raw_parts_mut ( result, flag_conditions. len ( ) ) ;
2136
-
2137
- for ( i, ( class, cond) ) in flag_conditions. iter ( ) . enumerate ( ) {
2138
- let out = out_slice. get_unchecked_mut ( i) ;
2139
-
2140
- out. semanticClass = class. id ( ) ;
2141
- out. condition = * cond;
2142
- }
2143
-
2144
- * count = flag_conditions. len ( ) ;
2145
- result
2146
- }
2132
+ // SAFETY: `count` is an out parameter
2133
+ unsafe { * count = flags. len ( ) } ;
2134
+ let regs_ptr = flags. as_mut_ptr ( ) ;
2135
+ mem:: forget ( flags) ;
2136
+ regs_ptr as * mut _
2147
2137
} else {
2148
2138
unsafe {
2149
2139
* count = 0 ;
@@ -2155,11 +2145,17 @@ where
2155
2145
extern "C" fn cb_free_flag_conditions_for_semantic_flag_group < A > (
2156
2146
_ctxt : * mut c_void ,
2157
2147
conds : * mut BNFlagConditionForSemanticClass ,
2148
+ count : usize ,
2158
2149
) where
2159
2150
A : ' static + Architecture < Handle = CustomArchitectureHandle < A > > + Send + Sync ,
2160
2151
{
2152
+ if conds. is_null ( ) {
2153
+ return ;
2154
+ }
2155
+
2161
2156
unsafe {
2162
- libc:: free ( conds as * mut _ ) ;
2157
+ let regs_ptr = ptr:: slice_from_raw_parts_mut ( conds, count) ;
2158
+ let _regs = Box :: from_raw ( regs_ptr) ;
2163
2159
}
2164
2160
}
2165
2161
@@ -2175,7 +2171,7 @@ where
2175
2171
2176
2172
if let Some ( write_type) = custom_arch. flag_write_from_id ( write_type) {
2177
2173
let mut written = write_type. flags_written ( ) ;
2178
-
2174
+
2179
2175
// SAFETY: `count` is an out parameter
2180
2176
unsafe { * count = written. len ( ) } ;
2181
2177
let regs_ptr = written. as_mut_ptr ( ) ;
@@ -2449,7 +2445,7 @@ where
2449
2445
{
2450
2446
let custom_arch = unsafe { & * ( ctxt as * mut A ) } ;
2451
2447
let mut intrinsics = custom_arch. intrinsics ( ) ;
2452
-
2448
+
2453
2449
// SAFETY: Passed in to be written
2454
2450
unsafe { * count = intrinsics. len ( ) } ;
2455
2451
let regs_ptr = intrinsics. as_mut_ptr ( ) ;
0 commit comments