mirror of
https://github.com/topjohnwu/cxx.git
synced 2025-02-19 15:41:12 +00:00
46 lines
1.2 KiB
Rust
46 lines
1.2 KiB
Rust
use crate::syntax::symbol::{self, Symbol};
|
|
use crate::syntax::{ExternFn, Pair, Types};
|
|
|
|
const CXXBRIDGE: &str = "cxxbridge1";
|
|
|
|
macro_rules! join {
|
|
($($segment:expr),+ $(,)?) => {
|
|
symbol::join(&[$(&$segment),+])
|
|
};
|
|
}
|
|
|
|
pub fn extern_fn(efn: &ExternFn, types: &Types) -> Symbol {
|
|
match &efn.receiver {
|
|
Some(receiver) => {
|
|
let receiver_ident = types.resolve(&receiver.ty);
|
|
join!(
|
|
efn.name.namespace,
|
|
CXXBRIDGE,
|
|
receiver_ident.name.cxx,
|
|
efn.name.rust,
|
|
)
|
|
}
|
|
None => join!(efn.name.namespace, CXXBRIDGE, efn.name.rust),
|
|
}
|
|
}
|
|
|
|
pub fn operator(receiver: &Pair, operator: &'static str) -> Symbol {
|
|
join!(
|
|
receiver.namespace,
|
|
CXXBRIDGE,
|
|
receiver.cxx,
|
|
"operator",
|
|
operator,
|
|
)
|
|
}
|
|
|
|
// The C half of a function pointer trampoline.
|
|
pub fn c_trampoline(efn: &ExternFn, var: &Pair, types: &Types) -> Symbol {
|
|
join!(extern_fn(efn, types), var.rust, 0)
|
|
}
|
|
|
|
// The Rust half of a function pointer trampoline.
|
|
pub fn r_trampoline(efn: &ExternFn, var: &Pair, types: &Types) -> Symbol {
|
|
join!(extern_fn(efn, types), var.rust, 1)
|
|
}
|