1 use crate::syntax::symbol::{self, Symbol};
2 use crate::syntax::{ExternFn, Types};
3 use proc_macro2::Ident;
4
5 const CXXBRIDGE: &str = "cxxbridge05";
6
7 macro_rules! join {
8 ($($segment:expr),*) => {
9 symbol::join(&[$(&$segment),*])
10 };
11 }
12
extern_fn(efn: &ExternFn, types: &Types) -> Symbol13 pub fn extern_fn(efn: &ExternFn, types: &Types) -> Symbol {
14 match &efn.receiver {
15 Some(receiver) => {
16 let receiver_ident = types.resolve(&receiver.ty);
17 join!(
18 efn.name.namespace,
19 CXXBRIDGE,
20 receiver_ident.cxx,
21 efn.name.rust
22 )
23 }
24 None => join!(efn.name.namespace, CXXBRIDGE, efn.name.rust),
25 }
26 }
27
28 // The C half of a function pointer trampoline.
c_trampoline(efn: &ExternFn, var: &Ident, types: &Types) -> Symbol29 pub fn c_trampoline(efn: &ExternFn, var: &Ident, types: &Types) -> Symbol {
30 join!(extern_fn(efn, types), var, 0)
31 }
32
33 // The Rust half of a function pointer trampoline.
r_trampoline(efn: &ExternFn, var: &Ident, types: &Types) -> Symbol34 pub fn r_trampoline(efn: &ExternFn, var: &Ident, types: &Types) -> Symbol {
35 join!(extern_fn(efn, types), var, 1)
36 }
37