blob: 71a60be6cec3bedc7bad72f32ceddbe27ff74d81 [file] [log] [blame]
David Tolnay891061b2020-04-19 22:42:33 -07001use crate::syntax::symbol::{self, Symbol};
David Tolnayb960ed22020-11-27 14:34:30 -08002use crate::syntax::{ExternFn, Pair, Types};
David Tolnay5ea922a2020-04-19 21:58:06 -07003
David Tolnay0f0162f2020-11-16 23:43:37 -08004const CXXBRIDGE: &str = "cxxbridge1";
David Tolnay5ea922a2020-04-19 21:58:06 -07005
6macro_rules! join {
David Tolnayad3db802020-11-27 14:45:49 -08007 ($($segment:expr),+ $(,)?) => {
8 symbol::join(&[$(&$segment),+])
David Tolnay5ea922a2020-04-19 21:58:06 -07009 };
10}
David Tolnay3caa50a2020-04-19 21:25:34 -070011
Adrian Taylorc8713432020-10-21 18:20:55 -070012pub fn extern_fn(efn: &ExternFn, types: &Types) -> Symbol {
David Tolnay5ea922a2020-04-19 21:58:06 -070013 match &efn.receiver {
Adrian Taylorc8713432020-10-21 18:20:55 -070014 Some(receiver) => {
15 let receiver_ident = types.resolve(&receiver.ty);
16 join!(
David Tolnay17a934c2020-11-02 00:40:04 -080017 efn.name.namespace,
Adrian Taylorc8713432020-10-21 18:20:55 -070018 CXXBRIDGE,
David Tolnay8faec772020-11-02 00:18:19 -080019 receiver_ident.cxx,
David Tolnayad3db802020-11-27 14:45:49 -080020 efn.name.rust,
Adrian Taylorc8713432020-10-21 18:20:55 -070021 )
22 }
David Tolnay17a934c2020-11-02 00:40:04 -080023 None => join!(efn.name.namespace, CXXBRIDGE, efn.name.rust),
David Tolnay5ea922a2020-04-19 21:58:06 -070024 }
David Tolnay891061b2020-04-19 22:42:33 -070025}
26
David Tolnayb960ed22020-11-27 14:34:30 -080027pub fn operator(receiver: &Pair, operator: &'static str) -> Symbol {
David Tolnay7da38202020-11-27 17:36:16 -080028 join!(
29 receiver.namespace,
30 CXXBRIDGE,
31 receiver.cxx,
32 "operator",
33 operator,
34 )
David Tolnayb960ed22020-11-27 14:34:30 -080035}
36
David Tolnay891061b2020-04-19 22:42:33 -070037// The C half of a function pointer trampoline.
David Tolnay84ed6ad2021-01-01 15:30:14 -080038pub fn c_trampoline(efn: &ExternFn, var: &Pair, types: &Types) -> Symbol {
39 join!(extern_fn(efn, types), var.rust, 0)
David Tolnay891061b2020-04-19 22:42:33 -070040}
41
42// The Rust half of a function pointer trampoline.
David Tolnay84ed6ad2021-01-01 15:30:14 -080043pub fn r_trampoline(efn: &ExternFn, var: &Pair, types: &Types) -> Symbol {
44 join!(extern_fn(efn, types), var.rust, 1)
David Tolnay3caa50a2020-04-19 21:25:34 -070045}