From 349e6c62ada1fa45a8b80edb877b5e7c9d0c306d Mon Sep 17 00:00:00 2001 From: Pavan Kumar Sunkara Date: Thu, 13 Aug 2020 02:57:26 +0200 Subject: Rename ra_proc_macro_srv -> proc_macro_srv --- .../src/proc_macro/bridge/closure.rs | 30 ++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 crates/proc_macro_srv/src/proc_macro/bridge/closure.rs (limited to 'crates/proc_macro_srv/src/proc_macro/bridge/closure.rs') diff --git a/crates/proc_macro_srv/src/proc_macro/bridge/closure.rs b/crates/proc_macro_srv/src/proc_macro/bridge/closure.rs new file mode 100644 index 000000000..273a97715 --- /dev/null +++ b/crates/proc_macro_srv/src/proc_macro/bridge/closure.rs @@ -0,0 +1,30 @@ +//! lib-proc-macro Closure type (equivalent to `&mut dyn FnMut(A) -> R`) that's `repr(C)`. +//! +//! Copy from https://github.com/rust-lang/rust/blob/6050e523bae6de61de4e060facc43dc512adaccd/src/libproc_macro/bridge/closure.rs# +//! augmented with removing unstable features + +#[repr(C)] +pub struct Closure<'a, A, R> { + call: unsafe extern "C" fn(&mut Env, A) -> R, + env: &'a mut Env, +} + +struct Env; + +// impl<'a, A, R> !Sync for Closure<'a, A, R> {} +// impl<'a, A, R> !Send for Closure<'a, A, R> {} + +impl<'a, A, R, F: FnMut(A) -> R> From<&'a mut F> for Closure<'a, A, R> { + fn from(f: &'a mut F) -> Self { + unsafe extern "C" fn call R>(env: &mut Env, arg: A) -> R { + (*(env as *mut _ as *mut F))(arg) + } + Closure { call: call::, env: unsafe { &mut *(f as *mut _ as *mut Env) } } + } +} + +impl<'a, A, R> Closure<'a, A, R> { + pub fn call(&mut self, arg: A) -> R { + unsafe { (self.call)(self.env, arg) } + } +} -- cgit v1.2.3