blob: e4618875ddc378f2fa6a3b1a740f7303e0087254 [file] [log] [blame]
David Tolnay3caa50a2020-04-19 21:25:34 -07001use crate::syntax::namespace::Namespace;
David Tolnay891061b2020-04-19 22:42:33 -07002use crate::syntax::symbol::{self, Symbol};
3use crate::syntax::ExternFn;
4use proc_macro2::Ident;
David Tolnay5ea922a2020-04-19 21:58:06 -07005
David Tolnay8f16ae72020-10-08 18:21:13 -07006const CXXBRIDGE: &str = "cxxbridge05";
David Tolnay5ea922a2020-04-19 21:58:06 -07007
8macro_rules! join {
9 ($($segment:expr),*) => {
10 symbol::join(&[$(&$segment),*])
11 };
12}
David Tolnay3caa50a2020-04-19 21:25:34 -070013
David Tolnay891061b2020-04-19 22:42:33 -070014pub fn extern_fn(namespace: &Namespace, efn: &ExternFn) -> Symbol {
David Tolnay5ea922a2020-04-19 21:58:06 -070015 match &efn.receiver {
David Tolnaya4641c72020-09-08 14:05:53 -070016 Some(receiver) => join!(namespace, CXXBRIDGE, receiver.ty, efn.ident.rust),
17 None => join!(namespace, CXXBRIDGE, efn.ident.rust),
David Tolnay5ea922a2020-04-19 21:58:06 -070018 }
David Tolnay891061b2020-04-19 22:42:33 -070019}
20
21// The C half of a function pointer trampoline.
22pub fn c_trampoline(namespace: &Namespace, efn: &ExternFn, var: &Ident) -> Symbol {
23 join!(extern_fn(namespace, efn), var, 0)
24}
25
26// The Rust half of a function pointer trampoline.
27pub fn r_trampoline(namespace: &Namespace, efn: &ExternFn, var: &Ident) -> Symbol {
28 join!(extern_fn(namespace, efn), var, 1)
David Tolnay3caa50a2020-04-19 21:25:34 -070029}