@@ -1455,12 +1455,17 @@ impl InterfaceGenerator<'_> {
1455
1455
}
1456
1456
1457
1457
TypeDefKind :: List ( t) => {
1458
+ self . src . c_helpers ( "size_t list_len = ptr->len;\n " ) ;
1459
+ uwriteln ! ( self . src. c_helpers, "if (list_len > 0) {{" ) ;
1460
+ let mut t_name = String :: new ( ) ;
1461
+ self . gen . push_type_name ( t, & mut t_name) ;
1458
1462
self . src
1459
- . c_helpers ( "for (size_t i = 0; i < ptr->len; i++) {\n " ) ;
1460
- self . free ( t, "&ptr->ptr[i]" ) ;
1463
+ . c_helpers ( & format ! ( "{t_name} *list_ptr = ptr->ptr;\n " ) ) ;
1464
+ self . src
1465
+ . c_helpers ( "for (size_t i = 0; i < list_len; i++) {\n " ) ;
1466
+ self . free ( t, "&list_ptr[i]" ) ;
1461
1467
self . src . c_helpers ( "}\n " ) ;
1462
- uwriteln ! ( self . src. c_helpers, "if (ptr->len > 0) {{" ) ;
1463
- uwriteln ! ( self . src. c_helpers, "free(ptr->ptr);" ) ;
1468
+ uwriteln ! ( self . src. c_helpers, "free(list_ptr);" ) ;
1464
1469
uwriteln ! ( self . src. c_helpers, "}}" ) ;
1465
1470
}
1466
1471
@@ -2111,13 +2116,13 @@ impl Bindgen for FunctionBindgen<'_, '_> {
2111
2116
self . import_return_pointer_area_size = self . import_return_pointer_area_size . max ( size) ;
2112
2117
self . import_return_pointer_area_align =
2113
2118
self . import_return_pointer_area_align . max ( align) ;
2114
- uwriteln ! ( self . src, "int32_t {} = (int32_t ) &ret_area;" , ptr) ;
2119
+ uwriteln ! ( self . src, "uint8_t * {} = (uint8_t * ) &ret_area;" , ptr) ;
2115
2120
} else {
2116
2121
self . gen . gen . return_pointer_area_size = self . gen . gen . return_pointer_area_size . max ( size) ;
2117
2122
self . gen . gen . return_pointer_area_align =
2118
2123
self . gen . gen . return_pointer_area_align . max ( align) ;
2119
2124
// Declare a statically-allocated return area.
2120
- uwriteln ! ( self . src, "int32_t {} = (int32_t ) &RET_AREA;" , ptr) ;
2125
+ uwriteln ! ( self . src, "uint8_t * {} = (uint8_t * ) &RET_AREA;" , ptr) ;
2121
2126
}
2122
2127
2123
2128
ptr
@@ -2562,23 +2567,23 @@ impl Bindgen for FunctionBindgen<'_, '_> {
2562
2567
Instruction :: EnumLift { .. } => results. push ( operands. pop ( ) . unwrap ( ) ) ,
2563
2568
2564
2569
Instruction :: ListCanonLower { .. } | Instruction :: StringLower { .. } => {
2565
- results. push ( format ! ( "(int32_t ) ({}).ptr" , operands[ 0 ] ) ) ;
2566
- results. push ( format ! ( "(int32_t) ( {}).len" , operands[ 0 ] ) ) ;
2570
+ results. push ( format ! ( "(uint8_t * ) ({}).ptr" , operands[ 0 ] ) ) ;
2571
+ results. push ( format ! ( "({}).len" , operands[ 0 ] ) ) ;
2567
2572
}
2568
2573
Instruction :: ListCanonLift { element, ty, .. } => {
2569
2574
self . assert_no_droppable_borrows ( "list" , & Type :: Id ( * ty) ) ;
2570
2575
2571
2576
let list_name = self . gen . gen . type_name ( & Type :: Id ( * ty) ) ;
2572
2577
let elem_name = self . gen . gen . type_name ( element) ;
2573
2578
results. push ( format ! (
2574
- "({}) {{ ({}*)({}), (size_t)( {}) }}" ,
2579
+ "({}) {{ ({}*)({}), ({}) }}" ,
2575
2580
list_name, elem_name, operands[ 0 ] , operands[ 1 ]
2576
2581
) ) ;
2577
2582
}
2578
2583
Instruction :: StringLift { .. } => {
2579
2584
let list_name = self . gen . gen . type_name ( & Type :: String ) ;
2580
2585
results. push ( format ! (
2581
- "({}) {{ ({}*)({}), (size_t)( {}) }}" ,
2586
+ "({}) {{ ({}*)({}), ({}) }}" ,
2582
2587
list_name,
2583
2588
self . gen . gen . char_type( ) ,
2584
2589
operands[ 0 ] ,
@@ -2588,8 +2593,8 @@ impl Bindgen for FunctionBindgen<'_, '_> {
2588
2593
2589
2594
Instruction :: ListLower { .. } => {
2590
2595
let _body = self . blocks . pop ( ) . unwrap ( ) ;
2591
- results. push ( format ! ( "(int32_t ) ({}).ptr" , operands[ 0 ] ) ) ;
2592
- results. push ( format ! ( "(int32_t) ( {}).len" , operands[ 0 ] ) ) ;
2596
+ results. push ( format ! ( "(uint8_t * ) ({}).ptr" , operands[ 0 ] ) ) ;
2597
+ results. push ( format ! ( "({}).len" , operands[ 0 ] ) ) ;
2593
2598
}
2594
2599
2595
2600
Instruction :: ListLift { element, ty, .. } => {
@@ -2599,7 +2604,7 @@ impl Bindgen for FunctionBindgen<'_, '_> {
2599
2604
let list_name = self . gen . gen . type_name ( & Type :: Id ( * ty) ) ;
2600
2605
let elem_name = self . gen . gen . type_name ( element) ;
2601
2606
results. push ( format ! (
2602
- "({}) {{ ({}*)({}), (size_t)( {}) }}" ,
2607
+ "({}) {{ ({}*)({}), ({}) }}" ,
2603
2608
list_name, elem_name, operands[ 0 ] , operands[ 1 ]
2604
2609
) ) ;
2605
2610
}
@@ -2841,22 +2846,22 @@ impl Bindgen for FunctionBindgen<'_, '_> {
2841
2846
}
2842
2847
}
2843
2848
2844
- Instruction :: I32Load { offset }
2845
- | Instruction :: PointerLoad { offset }
2846
- | Instruction :: LengthLoad { offset } => {
2847
- self . load ( "int32_t" , * offset, operands, results)
2848
- }
2849
+ Instruction :: I32Load { offset } => self . load ( "int32_t" , * offset, operands, results) ,
2849
2850
Instruction :: I64Load { offset } => self . load ( "int64_t" , * offset, operands, results) ,
2850
2851
Instruction :: F32Load { offset } => self . load ( "float" , * offset, operands, results) ,
2851
2852
Instruction :: F64Load { offset } => self . load ( "double" , * offset, operands, results) ,
2852
- Instruction :: I32Store { offset }
2853
- | Instruction :: PointerStore { offset }
2854
- | Instruction :: LengthStore { offset } => self . store ( "int32_t" , * offset, operands) ,
2853
+ Instruction :: PointerLoad { offset } => {
2854
+ self . load ( "uint8_t *" , * offset, operands, results)
2855
+ }
2856
+ Instruction :: LengthLoad { offset } => self . load ( "size_t" , * offset, operands, results) ,
2857
+ Instruction :: I32Store { offset } => self . store ( "int32_t" , * offset, operands) ,
2855
2858
Instruction :: I64Store { offset } => self . store ( "int64_t" , * offset, operands) ,
2856
2859
Instruction :: F32Store { offset } => self . store ( "float" , * offset, operands) ,
2857
2860
Instruction :: F64Store { offset } => self . store ( "double" , * offset, operands) ,
2858
2861
Instruction :: I32Store8 { offset } => self . store ( "int8_t" , * offset, operands) ,
2859
2862
Instruction :: I32Store16 { offset } => self . store ( "int16_t" , * offset, operands) ,
2863
+ Instruction :: PointerStore { offset } => self . store ( "uint8_t *" , * offset, operands) ,
2864
+ Instruction :: LengthStore { offset } => self . store ( "size_t" , * offset, operands) ,
2860
2865
2861
2866
Instruction :: I32Load8U { offset } => {
2862
2867
self . load_ext ( "uint8_t" , * offset, operands, results)
@@ -2872,11 +2877,11 @@ impl Bindgen for FunctionBindgen<'_, '_> {
2872
2877
}
2873
2878
2874
2879
Instruction :: GuestDeallocate { .. } => {
2875
- uwriteln ! ( self . src, "free((void*) ({}) );" , operands[ 0 ] ) ;
2880
+ uwriteln ! ( self . src, "free({} );" , operands[ 0 ] ) ;
2876
2881
}
2877
2882
Instruction :: GuestDeallocateString => {
2878
2883
uwriteln ! ( self . src, "if (({}) > 0) {{" , operands[ 1 ] ) ;
2879
- uwriteln ! ( self . src, "free((void*) ({}) );" , operands[ 0 ] ) ;
2884
+ uwriteln ! ( self . src, "free({} );" , operands[ 0 ] ) ;
2880
2885
uwriteln ! ( self . src, "}}" ) ;
2881
2886
}
2882
2887
Instruction :: GuestDeallocateVariant { blocks } => {
@@ -2897,19 +2902,19 @@ impl Bindgen for FunctionBindgen<'_, '_> {
2897
2902
Instruction :: GuestDeallocateList { element } => {
2898
2903
let ( body, results) = self . blocks . pop ( ) . unwrap ( ) ;
2899
2904
assert ! ( results. is_empty( ) ) ;
2900
- let ptr = self . locals . tmp ( "ptr" ) ;
2901
2905
let len = self . locals . tmp ( "len" ) ;
2902
- uwriteln ! ( self . src, "int32_t {ptr} = {};" , operands[ 0 ] ) ;
2903
- uwriteln ! ( self . src, "int32_t {len} = {};" , operands[ 1 ] ) ;
2906
+ uwriteln ! ( self . src, "size_t {len} = {};" , operands[ 1 ] ) ;
2907
+ uwriteln ! ( self . src, "if ({len} > 0) {{" ) ;
2908
+ let ptr = self . locals . tmp ( "ptr" ) ;
2909
+ uwriteln ! ( self . src, "uint8_t *{ptr} = {};" , operands[ 0 ] ) ;
2904
2910
let i = self . locals . tmp ( "i" ) ;
2905
- uwriteln ! ( self . src, "for (int32_t {i} = 0; {i} < {len}; {i}++) {{" ) ;
2911
+ uwriteln ! ( self . src, "for (size_t {i} = 0; {i} < {len}; {i}++) {{" ) ;
2906
2912
let size = self . gen . gen . sizes . size ( element) ;
2907
- uwriteln ! ( self . src, "int32_t base = {ptr} + {i} * {size};" ) ;
2913
+ uwriteln ! ( self . src, "uint8_t * base = {ptr} + {i} * {size};" ) ;
2908
2914
uwriteln ! ( self . src, "(void) base;" ) ;
2909
2915
uwrite ! ( self . src, "{body}" ) ;
2910
2916
uwriteln ! ( self . src, "}}" ) ;
2911
- uwriteln ! ( self . src, "if ({len} > 0) {{" ) ;
2912
- uwriteln ! ( self . src, "free((void*) ({ptr}));" ) ;
2917
+ uwriteln ! ( self . src, "free({ptr});" ) ;
2913
2918
uwriteln ! ( self . src, "}}" ) ;
2914
2919
}
2915
2920
@@ -2935,14 +2940,16 @@ fn perform_cast(op: &str, cast: &Bitcast) -> String {
2935
2940
Bitcast :: I32ToI64 | Bitcast :: LToI64 | Bitcast :: PToP64 => {
2936
2941
format ! ( "(int64_t) {}" , op)
2937
2942
}
2938
- Bitcast :: I64ToI32 | Bitcast :: I64ToL | Bitcast :: P64ToP => {
2943
+ Bitcast :: I64ToI32 | Bitcast :: I64ToL => {
2939
2944
format ! ( "(int32_t) {}" , op)
2940
2945
}
2941
2946
Bitcast :: I64ToP64 | Bitcast :: P64ToI64 => {
2942
2947
format ! ( "{}" , op)
2943
2948
}
2944
- Bitcast :: I32ToP
2945
- | Bitcast :: PToI32
2949
+ Bitcast :: P64ToP | Bitcast :: I32ToP => {
2950
+ format ! ( "(uint8_t *) {}" , op)
2951
+ }
2952
+ Bitcast :: PToI32
2946
2953
| Bitcast :: I32ToL
2947
2954
| Bitcast :: LToI32
2948
2955
| Bitcast :: LToP
@@ -3031,7 +3038,7 @@ fn wasm_type(ty: WasmType) -> &'static str {
3031
3038
WasmType :: I64 => "int64_t" ,
3032
3039
WasmType :: F32 => "float" ,
3033
3040
WasmType :: F64 => "double" ,
3034
- WasmType :: Pointer => "uintptr_t " ,
3041
+ WasmType :: Pointer => "uint8_t * " ,
3035
3042
WasmType :: PointerOrI64 => "int64_t" ,
3036
3043
WasmType :: Length => "size_t" ,
3037
3044
}
0 commit comments