blob: 9255feb6ebebf628a491fb3203e751aedf6ebd9b [file] [log] [blame]
David Tolnay891061b2020-04-19 22:42:33 -07001use crate::syntax::symbol::{self, Symbol};
Adrian Taylorc8713432020-10-21 18:20:55 -07002use crate::syntax::{ExternFn, Types};
David Tolnay891061b2020-04-19 22:42:33 -07003use proc_macro2::Ident;
David Tolnay5ea922a2020-04-19 21:58:06 -07004
David Tolnay8f16ae72020-10-08 18:21:13 -07005const CXXBRIDGE: &str = "cxxbridge05";
David Tolnay5ea922a2020-04-19 21:58:06 -07006
7macro_rules! join {
8 ($($segment:expr),*) => {
9 symbol::join(&[$(&$segment),*])
10 };
11}
David Tolnay3caa50a2020-04-19 21:25:34 -070012
Adrian Taylorc8713432020-10-21 18:20:55 -070013pub fn extern_fn(efn: &ExternFn, types: &Types) -> Symbol {
David Tolnay5ea922a2020-04-19 21:58:06 -070014 match &efn.receiver {
Adrian Taylorc8713432020-10-21 18:20:55 -070015 Some(receiver) => {
16 let receiver_ident = types.resolve(&receiver.ty);
17 join!(
18 efn.ident.cxx.ns,
19 CXXBRIDGE,
20 receiver_ident.ident,
21 efn.ident.rust
22 )
23 }
24 None => join!(efn.ident.cxx.ns, CXXBRIDGE, efn.ident.rust),
David Tolnay5ea922a2020-04-19 21:58:06 -070025 }
David Tolnay891061b2020-04-19 22:42:33 -070026}
27
28// The C half of a function pointer trampoline.
Adrian Taylorc8713432020-10-21 18:20:55 -070029pub fn c_trampoline(efn: &ExternFn, var: &Ident, types: &Types) -> Symbol {
30 join!(extern_fn(efn, types), var, 0)
David Tolnay891061b2020-04-19 22:42:33 -070031}
32
33// The Rust half of a function pointer trampoline.
Adrian Taylorc8713432020-10-21 18:20:55 -070034pub fn r_trampoline(efn: &ExternFn, var: &Ident, types: &Types) -> Symbol {
35 join!(extern_fn(efn, types), var, 1)
David Tolnay3caa50a2020-04-19 21:25:34 -070036}