@@ -1162,17 +1162,18 @@ impl Architecture for CoreArchitecture {
1162
1162
& mut result as * mut _ ,
1163
1163
& mut count as * mut _ ,
1164
1164
) {
1165
- let vec = Vec :: < BNInstructionTextToken > :: from_raw_parts ( result, count , count)
1165
+ let vec = slice :: from_raw_parts ( result, count)
1166
1166
. iter ( )
1167
- . map ( |x| InstructionTextToken :: from_raw ( x) )
1167
+ . map ( |x| InstructionTextToken :: from_raw ( x) . to_owned ( ) )
1168
1168
. collect ( ) ;
1169
+ BNFreeInstructionText ( result, count) ;
1169
1170
Some ( ( consumed, vec) )
1170
1171
} else {
1171
1172
None
1172
1173
}
1173
1174
}
1174
1175
}
1175
-
1176
+
1176
1177
fn instruction_llil (
1177
1178
& self ,
1178
1179
data : & [ u8 ] ,
@@ -1811,27 +1812,25 @@ where
1811
1812
let data = unsafe { slice:: from_raw_parts ( data, * len) } ;
1812
1813
let result = unsafe { & mut * result } ;
1813
1814
1814
- match custom_arch. instruction_text ( data, addr) {
1815
- Some ( ( res_size, mut res_tokens) ) => {
1816
- unsafe {
1817
- // TODO: Can't use into_raw_parts as it's unstable so we do this instead...
1818
- let r_ptr = res_tokens. as_mut_ptr ( ) ;
1819
- let r_count = res_tokens. len ( ) ;
1820
- mem:: forget ( res_tokens) ;
1821
-
1822
- * result = & mut ( * r_ptr) . 0 ;
1823
- * count = r_count;
1824
- * len = res_size;
1825
- }
1826
- true
1827
- }
1828
- None => false ,
1815
+ let Some ( ( res_size, res_tokens) ) = custom_arch. instruction_text ( data, addr) else {
1816
+ return false ;
1817
+ } ;
1818
+
1819
+ let res_tokens: Box < [ _ ] > = res_tokens. into_boxed_slice ( ) ;
1820
+ unsafe {
1821
+ let res_tokens = Box :: leak ( res_tokens) ;
1822
+ let r_ptr = res_tokens. as_mut_ptr ( ) ;
1823
+ let r_count = res_tokens. len ( ) ;
1824
+
1825
+ * result = & mut ( * r_ptr) . 0 ;
1826
+ * count = r_count;
1827
+ * len = res_size;
1829
1828
}
1829
+ true
1830
1830
}
1831
1831
1832
1832
extern "C" fn cb_free_instruction_text ( tokens : * mut BNInstructionTextToken , count : usize ) {
1833
- let _tokens =
1834
- unsafe { Vec :: from_raw_parts ( tokens as * mut InstructionTextToken , count, count) } ;
1833
+ let _tokens = unsafe { Box :: from_raw ( ptr:: slice_from_raw_parts_mut ( tokens, count) ) } ;
1835
1834
}
1836
1835
1837
1836
extern "C" fn cb_instruction_llil < A > (
@@ -1931,15 +1930,7 @@ where
1931
1930
if len == 0 {
1932
1931
ptr:: null_mut ( )
1933
1932
} else {
1934
- let mut res = Vec :: with_capacity ( len + 1 ) ;
1935
-
1936
- res. push ( len as u32 ) ;
1937
-
1938
- for i in items {
1939
- res. push ( i) ;
1940
- }
1941
-
1942
- assert ! ( res. len( ) == len + 1 ) ;
1933
+ let mut res: Box < [ _ ] > = [ len as u32 ] . into_iter ( ) . chain ( items) . collect ( ) ;
1943
1934
1944
1935
let raw = res. as_mut_ptr ( ) ;
1945
1936
mem:: forget ( res) ;
@@ -2280,7 +2271,8 @@ where
2280
2271
unsafe {
2281
2272
let actual_start = regs. offset ( -1 ) ;
2282
2273
let len = * actual_start + 1 ;
2283
- let _regs = Vec :: from_raw_parts ( actual_start, len as usize , len as usize ) ;
2274
+ let regs_ptr = ptr:: slice_from_raw_parts_mut ( actual_start, len. try_into ( ) . unwrap ( ) ) ;
2275
+ let _regs = Box :: from_raw ( regs_ptr) ;
2284
2276
}
2285
2277
}
2286
2278
@@ -2420,28 +2412,25 @@ where
2420
2412
{
2421
2413
let custom_arch = unsafe { & * ( ctxt as * mut A ) } ;
2422
2414
2423
- if let Some ( intrinsic) = custom_arch. intrinsic_from_id ( intrinsic) {
2424
- let inputs = intrinsic. inputs ( ) ;
2425
- let mut res = Vec :: with_capacity ( inputs. len ( ) ) ;
2426
- for input in inputs {
2427
- res. push ( input. into_raw ( ) ) ;
2428
- }
2429
-
2430
- unsafe {
2431
- * count = res. len ( ) ;
2432
- if res. is_empty ( ) {
2433
- ptr:: null_mut ( )
2434
- } else {
2435
- let raw = res. as_mut_ptr ( ) ;
2436
- mem:: forget ( res) ;
2437
- raw
2438
- }
2439
- }
2440
- } else {
2415
+ let Some ( intrinsic) = custom_arch. intrinsic_from_id ( intrinsic) else {
2441
2416
unsafe {
2442
2417
* count = 0 ;
2443
2418
}
2444
- ptr:: null_mut ( )
2419
+ return ptr:: null_mut ( ) ;
2420
+ } ;
2421
+
2422
+ let inputs = intrinsic. inputs ( ) ;
2423
+ let mut res: Box < [ _ ] > = inputs. into_iter ( ) . map ( |input| input. into_raw ( ) ) . collect ( ) ;
2424
+
2425
+ unsafe {
2426
+ * count = res. len ( ) ;
2427
+ if res. is_empty ( ) {
2428
+ ptr:: null_mut ( )
2429
+ } else {
2430
+ let raw = res. as_mut_ptr ( ) ;
2431
+ mem:: forget ( res) ;
2432
+ raw
2433
+ }
2445
2434
}
2446
2435
}
2447
2436
@@ -2453,8 +2442,8 @@ where
2453
2442
2454
2443
if !nt. is_null ( ) {
2455
2444
unsafe {
2456
- let list = Vec :: from_raw_parts ( nt, count, count ) ;
2457
- for nt in list {
2445
+ let name_and_types = Box :: from_raw ( ptr :: slice_from_raw_parts_mut ( nt, count) ) ;
2446
+ for nt in name_and_types . into_iter ( ) {
2458
2447
BnString :: from_raw ( nt. name ) ;
2459
2448
}
2460
2449
}
@@ -2473,10 +2462,7 @@ where
2473
2462
2474
2463
if let Some ( intrinsic) = custom_arch. intrinsic_from_id ( intrinsic) {
2475
2464
let inputs = intrinsic. outputs ( ) ;
2476
- let mut res = Vec :: with_capacity ( inputs. len ( ) ) ;
2477
- for input in inputs {
2478
- res. push ( input. into ( ) ) ;
2479
- }
2465
+ let mut res: Box < [ _ ] > = inputs. iter ( ) . map ( |input| input. as_ref ( ) . into ( ) ) . collect ( ) ;
2480
2466
2481
2467
unsafe {
2482
2468
* count = res. len ( ) ;
@@ -2505,9 +2491,7 @@ where
2505
2491
{
2506
2492
let _custom_arch = unsafe { & * ( ctxt as * mut A ) } ;
2507
2493
if !tl. is_null ( ) {
2508
- unsafe {
2509
- let _list = Vec :: from_raw_parts ( tl, count, count) ;
2510
- }
2494
+ let _type_list = unsafe { Box :: from_raw ( ptr:: slice_from_raw_parts_mut ( tl, count) ) } ;
2511
2495
}
2512
2496
}
2513
2497
0 commit comments