blob: 84e339892c44a1cd5757c79de9119538952b11de [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 Tolnay0f0162f2020-11-16 23:43:37 -08005const CXXBRIDGE: &str = "cxxbridge1";
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!(
David Tolnay17a934c2020-11-02 00:40:04 -080018 efn.name.namespace,
Adrian Taylorc8713432020-10-21 18:20:55 -070019 CXXBRIDGE,
David Tolnay8faec772020-11-02 00:18:19 -080020 receiver_ident.cxx,
David Tolnay17a934c2020-11-02 00:40:04 -080021 efn.name.rust
Adrian Taylorc8713432020-10-21 18:20:55 -070022 )
23 }
David Tolnay17a934c2020-11-02 00:40:04 -080024 None => join!(efn.name.namespace, CXXBRIDGE, efn.name.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}