| David Tolnay | 3caa50a | 2020-04-19 21:25:34 -0700 | [diff] [blame] | 1 | use crate::syntax::namespace::Namespace; |
| David Tolnay | 891061b | 2020-04-19 22:42:33 -0700 | [diff] [blame^] | 2 | use crate::syntax::symbol::{self, Symbol}; |
| 3 | use crate::syntax::ExternFn; |
| 4 | use proc_macro2::Ident; |
| David Tolnay | 5ea922a | 2020-04-19 21:58:06 -0700 | [diff] [blame] | 5 | |
| 6 | const CXXBRIDGE: &str = "cxxbridge02"; |
| 7 | |
| 8 | macro_rules! join { |
| 9 | ($($segment:expr),*) => { |
| 10 | symbol::join(&[$(&$segment),*]) |
| 11 | }; |
| 12 | } |
| David Tolnay | 3caa50a | 2020-04-19 21:25:34 -0700 | [diff] [blame] | 13 | |
| David Tolnay | 891061b | 2020-04-19 22:42:33 -0700 | [diff] [blame^] | 14 | pub fn extern_fn(namespace: &Namespace, efn: &ExternFn) -> Symbol { |
| David Tolnay | 5ea922a | 2020-04-19 21:58:06 -0700 | [diff] [blame] | 15 | match &efn.receiver { |
| 16 | Some(receiver) => join!(namespace, CXXBRIDGE, receiver.ident, efn.ident), |
| 17 | None => join!(namespace, CXXBRIDGE, efn.ident), |
| 18 | } |
| David Tolnay | 891061b | 2020-04-19 22:42:33 -0700 | [diff] [blame^] | 19 | } |
| 20 | |
| 21 | // The C half of a function pointer trampoline. |
| 22 | pub 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. |
| 27 | pub fn r_trampoline(namespace: &Namespace, efn: &ExternFn, var: &Ident) -> Symbol { |
| 28 | join!(extern_fn(namespace, efn), var, 1) |
| David Tolnay | 3caa50a | 2020-04-19 21:25:34 -0700 | [diff] [blame] | 29 | } |