blob: 287b443415a778f4eeda04d2d49110c8865c1d95 [file] [log] [blame]
David Tolnay415f2322021-02-17 15:48:13 -08001// Mangled symbol arrangements:
2//
3// (a) One-off internal symbol.
4// pattern: {CXXBRIDGE} $ {NAME}
5// examples:
6// - cxxbridge1$exception
7// defining characteristics:
8// - 2 segments
9// - starts with cxxbridge
10//
11// (b) Behavior on a builtin binding without generic parameter.
12// pattern: {CXXBRIDGE} $ {TYPE} $ {NAME}
13// examples:
14// - cxxbridge1$string$len
15// defining characteristics:
16// - 3 segments
17// - starts with cxxbridge
18//
19// (c) Behavior on a builtin binding with generic parameter.
20// pattern: {CXXBRIDGE} $ {TYPE} $ {PARAM...} $ {NAME}
21// examples:
22// - cxxbridge1$box$org$rust$Struct$alloc
23// - cxxbridge1$unique_ptr$std$vector$u8$drop
24// defining characteristics:
25// - 4+ segments
26// - starts with cxxbridge
27//
28// (d) User-defined extern function.
29// pattern: {NAMESPACE...} $ {CXXBRIDGE} $ {NAME}
30// examples:
31// - cxxbridge1$new_client
32// - org$rust$cxxbridge1$new_client
33// defining characteristics:
34// - cxxbridge is second from end
35// FIXME: conflict with (a) if they collide with one of our one-off symbol names in the global namespace
36//
37// (e) User-defined extern member function.
38// pattern: {NAMESPACE...} $ {CXXBRIDGE} $ {TYPE} $ {NAME}
39// examples:
40// - org$cxxbridge1$Struct$get
41// defining characteristics:
42// - cxxbridge is third from end
43// FIXME: conflict with (b) if e.g. user binds a type in global namespace that collides with our builtin type names
44//
45// (f) Operator overload.
46// pattern: {NAMESPACE...} $ {CXXBRIDGE} $ {TYPE} $ operator $ {NAME}
47// examples:
48// - org$rust$cxxbridge1$Struct$operator$eq
49// defining characteristics:
50// - second segment from end is `operator` (not possible in type or namespace names)
51//
52// (g) Closure trampoline.
53// pattern: {NAMESPACE...} $ {CXXBRIDGE} $ {TYPE?} $ {NAME} $ {ARGUMENT} $ {DIRECTION}
54// examples:
55// - org$rust$cxxbridge1$Struct$invoke$f$0
56// defining characteristics:
57// - last symbol is `0` (C half) or `1` (Rust half) which are not legal identifiers on their own
David Tolnay6c39d4b2021-02-17 15:49:52 -080058//
59//
60// Mangled preprocessor variable arrangements:
61//
62// (A) One-off internal variable.
63// pattern: {CXXBRIDGE} _ {NAME}
64// examples:
65// - CXXBRIDGE1_PANIC
66// - CXXBRIDGE1_RUST_STRING
67// defining characteristics:
68// - NAME does not begin with STRUCT or ENUM
69//
70// (B) Guard around user-defined type.
71// pattern: {CXXBRIDGE} _ {STRUCT or ENUM} _ {NAMESPACE...} $ {TYPE}
72// examples:
73// - CXXBRIDGE1_STRUCT_org$rust$Struct
74// - CXXBRIDGE1_ENUM_Enabled
David Tolnay415f2322021-02-17 15:48:13 -080075
David Tolnay891061b2020-04-19 22:42:33 -070076use crate::syntax::symbol::{self, Symbol};
David Tolnayb960ed22020-11-27 14:34:30 -080077use crate::syntax::{ExternFn, Pair, Types};
David Tolnay5ea922a2020-04-19 21:58:06 -070078
David Tolnay0f0162f2020-11-16 23:43:37 -080079const CXXBRIDGE: &str = "cxxbridge1";
David Tolnay5ea922a2020-04-19 21:58:06 -070080
81macro_rules! join {
David Tolnayad3db802020-11-27 14:45:49 -080082 ($($segment:expr),+ $(,)?) => {
83 symbol::join(&[$(&$segment),+])
David Tolnay5ea922a2020-04-19 21:58:06 -070084 };
85}
David Tolnay3caa50a2020-04-19 21:25:34 -070086
Adrian Taylorc8713432020-10-21 18:20:55 -070087pub fn extern_fn(efn: &ExternFn, types: &Types) -> Symbol {
David Tolnay5ea922a2020-04-19 21:58:06 -070088 match &efn.receiver {
Adrian Taylorc8713432020-10-21 18:20:55 -070089 Some(receiver) => {
90 let receiver_ident = types.resolve(&receiver.ty);
91 join!(
David Tolnay17a934c2020-11-02 00:40:04 -080092 efn.name.namespace,
Adrian Taylorc8713432020-10-21 18:20:55 -070093 CXXBRIDGE,
David Tolnay1e5fe232021-01-01 18:11:40 -080094 receiver_ident.name.cxx,
David Tolnayad3db802020-11-27 14:45:49 -080095 efn.name.rust,
Adrian Taylorc8713432020-10-21 18:20:55 -070096 )
97 }
David Tolnay17a934c2020-11-02 00:40:04 -080098 None => join!(efn.name.namespace, CXXBRIDGE, efn.name.rust),
David Tolnay5ea922a2020-04-19 21:58:06 -070099 }
David Tolnay891061b2020-04-19 22:42:33 -0700100}
101
David Tolnayb960ed22020-11-27 14:34:30 -0800102pub fn operator(receiver: &Pair, operator: &'static str) -> Symbol {
David Tolnay7da38202020-11-27 17:36:16 -0800103 join!(
104 receiver.namespace,
105 CXXBRIDGE,
106 receiver.cxx,
107 "operator",
108 operator,
109 )
David Tolnayb960ed22020-11-27 14:34:30 -0800110}
111
David Tolnay891061b2020-04-19 22:42:33 -0700112// The C half of a function pointer trampoline.
David Tolnay84ed6ad2021-01-01 15:30:14 -0800113pub fn c_trampoline(efn: &ExternFn, var: &Pair, types: &Types) -> Symbol {
114 join!(extern_fn(efn, types), var.rust, 0)
David Tolnay891061b2020-04-19 22:42:33 -0700115}
116
117// The Rust half of a function pointer trampoline.
David Tolnay84ed6ad2021-01-01 15:30:14 -0800118pub fn r_trampoline(efn: &ExternFn, var: &Pair, types: &Types) -> Symbol {
119 join!(extern_fn(efn, types), var.rust, 1)
David Tolnay3caa50a2020-04-19 21:25:34 -0700120}