Skip to content

Commit 27c5677

Browse files
committed
Cleanup callback handling
1 parent 0e65c0a commit 27c5677

File tree

3 files changed

+11
-12
lines changed

3 files changed

+11
-12
lines changed

binding-generator/src/writer/rust_native/func.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,8 @@ impl RustNativeGeneratedElement for Func<'_, '_> {
244244
if arg.is_user_data() {
245245
pre_post_arg_handle(
246246
format!(
247-
"userdata_arg!({name} in callbacks => {callback_name})",
247+
"userdata_arg!({decl} => {callback_name})",
248+
decl = arg_type_ref.render_lane().to_dyn().rust_extern_arg_func_decl(name),
248249
callback_name = callback_arg_name.expect("Can't get name of the callback arg")
249250
),
250251
&mut pre_call_args,

binding-generator/src/writer/rust_native/type_ref/render_lane/function.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,9 @@ impl RenderLaneTrait for FunctionRenderLane<'_, '_> {
5353
.join(", ");
5454
let ret = self.func.return_type();
5555
format!(
56-
"callback_arg!({name}_trampoline({tramp_args}) -> {tramp_ret} => {userdata_name} in callbacks => {name}({fw_args}) -> {fw_ret})",
56+
"callback_arg!({name}_trampoline({tramp_args}) -> {ret} => {userdata_name} in {name}({fw_args}) -> {ret})",
5757
tramp_args = tramp_args.iter().map(|(_, decl)| decl).join(", "),
58-
tramp_ret = ret.rust_extern(ExternDir::FromCpp),
59-
fw_ret = ret.rust_extern(ExternDir::FromCpp),
58+
ret = ret.rust_extern(ExternDir::FromCpp),
6059
)
6160
} else {
6261
"".to_string()

src/templ.rs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,26 +31,25 @@ macro_rules! string_arg_output_receive {
3131
}
3232

3333
macro_rules! callback_arg {
34-
($tr_name: ident($($tr_arg_name: ident: $tr_arg_type: ty),*) -> $tr_ret: ty => $tr_userdata_name: ident in $callbacks_name: ident => $callback_name: ident($($fw_arg_name: ident: $fw_arg_type: ty),*) -> $fw_ret: ty) => {
34+
($tr_name: ident($($tr_arg_name: ident: $tr_arg_type: ty),*) -> $tr_ret: ty => $tr_userdata_name: ident in $callback_name: ident($($fw_arg_name: ident: $fw_arg_type: ty),*) -> $fw_ret: ty) => {
3535
unsafe extern "C" fn trampoline($($tr_arg_name: $tr_arg_type),*) -> $tr_ret {
36-
let mut callback: Box<Box<dyn FnMut($($fw_arg_type),*) -> $fw_ret + Send + Sync>> = Box::from_raw($tr_userdata_name.cast());
37-
let out = callback($($fw_arg_name),*);
38-
Box::into_raw(callback);
36+
let callback: *mut Box<dyn FnMut($($fw_arg_type),*) -> $fw_ret> = $tr_userdata_name.cast();
37+
let out = (*callback)($($fw_arg_name),*);
3938
out
4039
}
4140

4241
let $tr_name = if $callback_name.is_some() {
43-
Some(trampoline as unsafe extern "C" fn($($tr_arg_name: $tr_arg_type),*) -> $tr_ret)
42+
Some(trampoline as unsafe extern "C" fn($($tr_arg_type),*) -> $tr_ret)
4443
} else {
4544
None
4645
};
4746
}
4847
}
4948

5049
macro_rules! userdata_arg {
51-
($userdata_name: ident in $callbacks_name: ident => $callback_name: ident) => {
52-
let $userdata_name = if let Some(callback) = $callback_name {
53-
Box::into_raw(Box::new(callback)).cast::<::std::ffi::c_void>()
50+
($userdata_name: ident: $userdata_type: ty => $callback_name: ident) => {
51+
let $userdata_name: $userdata_type = if let Some(callback) = $callback_name {
52+
Box::into_raw(Box::new(callback)).cast()
5453
} else {
5554
::std::ptr::null_mut() // fixme, remove previous callback
5655
};

0 commit comments

Comments
 (0)