blob: 6f4e0d8cbbf69cd8fe502270ed8c2c8a4a630020 [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
6const CXXBRIDGE: &str = "cxxbridge02";
7
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 {
16 Some(receiver) => join!(namespace, CXXBRIDGE, receiver.ident, efn.ident),
17 None => join!(namespace, CXXBRIDGE, efn.ident),
18 }
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}