Skip to content
This repository was archived by the owner on Nov 26, 2020. It is now read-only.

Commit 23361c3

Browse files
committed
Greatly simplified callback code by making it fully generic
It didn't occur to me to make the extern functions generic. I don't know why.
1 parent 5551b82 commit 23361c3

File tree

3 files changed

+23
-81
lines changed

3 files changed

+23
-81
lines changed

fauxgen/gio.rs

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ extern crate "grust-GLib-2_0" as glib;
2828
extern crate "grust-GObject-2_0" as gobject;
2929
extern crate libc;
3030

31-
use grust::callback;
3231
use grust::error;
3332
use grust::gstr;
3433
use grust::gstr::IntoUtf8;
@@ -37,11 +36,12 @@ use grust::marker;
3736
use grust::object;
3837
use grust::quark;
3938
use grust::refcount;
40-
use grust::types;
39+
use grust::types::{gint, gpointer};
4140
use grust::wrap;
4241

4342
use std::fmt;
4443
use std::num::FromPrimitive;
44+
use std::mem;
4545
use std::sync::atomic;
4646

4747
#[repr(C)]
@@ -192,26 +192,28 @@ pub mod raw {
192192
}
193193
}
194194

195-
mod async_shim {
196-
197-
use grust::callback;
198-
use grust::types::gpointer;
199-
use grust::wrap;
200-
195+
mod async {
201196
use super::raw;
202197
use gobject;
203198

204-
pub extern "C" fn async_ready_callback(source_object: *mut gobject::raw::GObject,
205-
res: *mut raw::GAsyncResult,
206-
user_data: gpointer) {
207-
unsafe {
208-
let arg1 = wrap::from_raw_mut::<gobject::Object, _>(
209-
source_object, &source_object);
210-
let arg2 = wrap::from_raw_mut::<super::AsyncResult, _>(
211-
res, &res);
199+
use grust::types::gpointer;
200+
use grust::wrap;
201+
use std::mem;
212202

213-
callback::invoke(user_data, (arg1, arg2))
214-
}
203+
pub extern "C" fn async_ready_callback<F>(source_object: *mut gobject::raw::GObject,
204+
res: *mut raw::GAsyncResult,
205+
user_data: gpointer)
206+
where F: FnOnce(&mut gobject::Object, &mut super::AsyncResult) + Send
207+
{
208+
let cb: Box<F> = unsafe { mem::transmute(user_data) };
209+
let arg1 = unsafe {
210+
wrap::from_raw_mut::<gobject::Object, _>(source_object,
211+
&source_object)
212+
};
213+
let arg2 = unsafe {
214+
wrap::from_raw_mut::<super::AsyncResult, _>(res, &res)
215+
};
216+
cb(arg1, arg2);
215217
}
216218
}
217219

@@ -339,7 +341,7 @@ impl File {
339341
}
340342

341343
pub fn read_async<F>(&mut self,
342-
io_priority: types::gint,
344+
io_priority: gint,
343345
cancellable: Option<&mut Cancellable>,
344346
callback: Box<F>)
345347
where F : FnOnce(&mut gobject::Object, &mut AsyncResult) + Send
@@ -352,12 +354,12 @@ impl File {
352354
None => std::ptr::null_mut()
353355
}
354356
};
355-
let callback = callback::AsyncCallback::new(callback).into_raw_ptr();
357+
let callback: gpointer = mem::transmute(callback);
356358

357359
raw::g_file_read_async(&mut self.raw,
358360
io_priority as libc::c_int,
359361
cancellable,
360-
async_shim::async_ready_callback,
362+
async::async_ready_callback::<F>,
361363
callback);
362364
}
363365
}

src/callback.rs

Lines changed: 0 additions & 59 deletions
This file was deleted.

src/lib.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
extern crate libc;
2828
extern crate alloc;
2929

30-
pub mod callback;
3130
pub mod error;
3231
pub mod gstr;
3332
pub mod gtype;

0 commit comments

Comments
 (0)