5
5
//! FFI info for callback interfaces
6
6
7
7
use super :: * ;
8
+ use heck:: ToUpperCamelCase ;
8
9
use std:: collections:: HashSet ;
9
10
10
11
pub fn pass ( module : & mut Module ) -> Result < ( ) > {
11
12
let crate_name = module. crate_name . clone ( ) ;
13
+ let module_name = module. name . clone ( ) ;
12
14
module. try_visit_mut ( |cbi : & mut CallbackInterface | {
13
- cbi. vtable = vtable ( & crate_name, & cbi. name , cbi. methods . clone ( ) ) ?;
15
+ cbi. vtable = vtable ( & module_name , & crate_name, & cbi. name , cbi. methods . clone ( ) ) ?;
14
16
Ok ( ( ) )
15
17
} ) ?;
16
18
module. try_visit_mut ( |int : & mut Interface | {
17
19
if int. imp . has_callback_interface ( ) {
18
- int. vtable = Some ( vtable ( & crate_name, & int. name , int. methods . clone ( ) ) ?) ;
20
+ int. vtable = Some ( vtable (
21
+ & module_name,
22
+ & crate_name,
23
+ & int. name ,
24
+ int. methods . clone ( ) ,
25
+ ) ?) ;
19
26
}
20
27
Ok ( ( ) )
21
28
} ) ?;
@@ -47,17 +54,27 @@ pub fn pass(module: &mut Module) -> Result<()> {
47
54
Ok ( ( ) )
48
55
}
49
56
50
- fn vtable ( crate_name : & str , interface_name : & str , methods : Vec < Method > ) -> Result < VTable > {
57
+ fn vtable (
58
+ module_name : & str ,
59
+ crate_name : & str ,
60
+ interface_name : & str ,
61
+ methods : Vec < Method > ,
62
+ ) -> Result < VTable > {
51
63
Ok ( VTable {
52
64
struct_type : FfiType :: Struct ( FfiStructName ( format ! (
53
65
"VTableCallbackInterface{}" ,
54
66
interface_name
55
- ) ) ) ,
67
+ ) ) )
68
+ . into ( ) ,
56
69
interface_name : interface_name. to_string ( ) ,
57
70
init_fn : RustFfiFunctionName ( uniffi_meta:: init_callback_vtable_fn_symbol_name (
58
71
crate_name,
59
72
interface_name,
60
73
) ) ,
74
+ free_fn_type : FfiFunctionTypeName ( format ! (
75
+ "CallbackInterfaceFree{}_{interface_name}" ,
76
+ module_name. to_upper_camel_case( ) ,
77
+ ) ) ,
61
78
methods : methods
62
79
. into_iter ( )
63
80
. enumerate ( )
@@ -67,7 +84,8 @@ fn vtable(crate_name: &str, interface_name: &str, methods: Vec<Method>) -> Resul
67
84
ffi_type : FfiType :: Function ( FfiFunctionTypeName ( format ! (
68
85
"CallbackInterface{}Method{i}" ,
69
86
interface_name
70
- ) ) ) ,
87
+ ) ) )
88
+ . into ( ) ,
71
89
} )
72
90
} )
73
91
. collect :: < Result < Vec < _ > > > ( ) ?,
@@ -119,7 +137,7 @@ fn add_vtable_ffi_definitions(module: &mut Module) -> Result<()> {
119
137
name : async_info. ffi_foreign_future_result . clone ( ) ,
120
138
fields : match ffi_return_type {
121
139
Some ( return_ffi_type) => vec ! [
122
- FfiField :: new( "return_value" , return_ffi_type) ,
140
+ FfiField :: new( "return_value" , return_ffi_type. ty ) ,
123
141
FfiField :: new( "call_status" , FfiType :: RustCallStatus ) ,
124
142
] ,
125
143
None => vec ! [
@@ -154,7 +172,8 @@ fn add_vtable_ffi_definitions(module: &mut Module) -> Result<()> {
154
172
ffi_definitions. extend ( [
155
173
FfiFunctionType {
156
174
name : FfiFunctionTypeName ( format ! (
157
- "CallbackInterfaceFree{module_name}_{interface_name}"
175
+ "CallbackInterfaceFree{}_{interface_name}" ,
176
+ module_name. to_upper_camel_case( ) ,
158
177
) ) ,
159
178
arguments : vec ! [ FfiArgument :: new(
160
179
"handle" ,
@@ -172,13 +191,15 @@ fn add_vtable_ffi_definitions(module: &mut Module) -> Result<()> {
172
191
fields : vtable
173
192
. methods
174
193
. iter ( )
175
- . map ( |vtable_meth| {
176
- FfiField :: new ( & vtable_meth. callable . name , vtable_meth. ffi_type . clone ( ) )
194
+ . map ( |vtable_meth| FfiField {
195
+ name : vtable_meth. callable . name . clone ( ) ,
196
+ ty : vtable_meth. ffi_type . clone ( ) ,
177
197
} )
178
198
. chain ( [ FfiField :: new (
179
199
"uniffi_free" ,
180
200
FfiType :: Function ( FfiFunctionTypeName ( format ! (
181
- "CallbackInterfaceFree{module_name}_{interface_name}"
201
+ "CallbackInterfaceFree{}_{interface_name}" ,
202
+ module_name. to_upper_camel_case( ) ,
182
203
) ) ) ,
183
204
) ] )
184
205
. collect ( ) ,
@@ -191,7 +212,7 @@ fn add_vtable_ffi_definitions(module: &mut Module) -> Result<()> {
191
212
name : vtable. init_fn . clone ( ) ,
192
213
arguments : vec ! [ FfiArgument {
193
214
name: "vtable" . into( ) ,
194
- ty: FfiType :: Reference ( Box :: new( vtable. struct_type. clone( ) ) ) ,
215
+ ty: FfiType :: Reference ( Box :: new( vtable. struct_type. ty . clone( ) ) ) . into ( ) ,
195
216
} ] ,
196
217
return_type : FfiReturnType { ty : None } ,
197
218
async_data : None ,
@@ -220,7 +241,8 @@ fn vtable_method(
220
241
ty : FfiType :: Handle ( HandleKind :: CallbackInterface {
221
242
module_name : module_name. to_string ( ) ,
222
243
interface_name : interface_name. to_string ( ) ,
223
- } ) ,
244
+ } )
245
+ . into ( ) ,
224
246
} )
225
247
. chain ( callable. arguments . iter ( ) . map ( |arg| FfiArgument {
226
248
name : arg. name . clone ( ) ,
@@ -229,11 +251,11 @@ fn vtable_method(
229
251
. chain ( std:: iter:: once ( match & callable. return_type . ty {
230
252
Some ( ty) => FfiArgument {
231
253
name : "uniffi_out_return" . into ( ) ,
232
- ty : FfiType :: MutReference ( Box :: new ( ty. ffi_type . clone ( ) ) ) ,
254
+ ty : FfiType :: MutReference ( Box :: new ( ty. ffi_type . ty . clone ( ) ) ) . into ( ) ,
233
255
} ,
234
256
None => FfiArgument {
235
257
name : "uniffi_out_return" . into ( ) ,
236
- ty : FfiType :: VoidPointer ,
258
+ ty : FfiType :: VoidPointer . into ( ) ,
237
259
} ,
238
260
} ) )
239
261
. collect ( ) ,
@@ -257,7 +279,8 @@ fn vtable_method_async(
257
279
ty : FfiType :: Handle ( HandleKind :: CallbackInterface {
258
280
module_name : module_name. to_string ( ) ,
259
281
interface_name : interface_name. to_string ( ) ,
260
- } ) ,
282
+ } )
283
+ . into ( ) ,
261
284
} )
262
285
. chain ( callable. arguments . iter ( ) . map ( |arg| FfiArgument {
263
286
name : arg. name . clone ( ) ,
@@ -266,17 +289,18 @@ fn vtable_method_async(
266
289
. chain ( [
267
290
FfiArgument {
268
291
name : "uniffi_future_callback" . into ( ) ,
269
- ty : FfiType :: Function ( async_data. ffi_foreign_future_complete . clone ( ) ) ,
292
+ ty : FfiType :: Function ( async_data. ffi_foreign_future_complete . clone ( ) ) . into ( ) ,
270
293
} ,
271
294
FfiArgument {
272
295
name : "uniffi_callback_data" . into ( ) ,
273
- ty : FfiType :: Handle ( HandleKind :: ForeignFutureCallbackData ) ,
296
+ ty : FfiType :: Handle ( HandleKind :: ForeignFutureCallbackData ) . into ( ) ,
274
297
} ,
275
298
FfiArgument {
276
299
name : "uniffi_out_return" . into ( ) ,
277
300
ty : FfiType :: MutReference ( Box :: new ( FfiType :: Struct ( FfiStructName (
278
301
"ForeignFuture" . to_owned ( ) ,
279
- ) ) ) ) ,
302
+ ) ) ) )
303
+ . into ( ) ,
280
304
} ,
281
305
] )
282
306
. collect ( ) ,
0 commit comments