1#[allow(non_snake_case)]
2#[macro_export]
3macro_rules! ttype {
4 ($o:expr) => {
5 $crate::macros::ttype::TTypeOf::ttype($o)
6 };
7}
8
9pub use ttype;
10
11pub trait TTypeOf {
12 fn ttype(self) -> core::ffi::c_int;
13}
14
15impl TTypeOf for *const crate::records::lua_t_value::TValue {
16 fn ttype(self) -> core::ffi::c_int {
17 unsafe { (*self).tt() }
18 }
19}
20
21impl TTypeOf for *mut crate::records::lua_t_value::TValue {
22 fn ttype(self) -> core::ffi::c_int {
23 unsafe { (*self).tt() }
24 }
25}
26
27impl TTypeOf for &crate::records::lua_t_value::TValue {
28 fn ttype(self) -> core::ffi::c_int {
29 self.tt()
30 }
31}
32
33impl TTypeOf for &mut crate::records::lua_t_value::TValue {
34 fn ttype(self) -> core::ffi::c_int {
35 self.tt()
36 }
37}
38
39impl TTypeOf for *const crate::records::t_key::TKey {
40 fn ttype(self) -> core::ffi::c_int {
41 unsafe { (*self).tt() }
42 }
43}
44
45impl TTypeOf for *mut crate::records::t_key::TKey {
46 fn ttype(self) -> core::ffi::c_int {
47 unsafe { (*self).tt() }
48 }
49}
50
51impl TTypeOf for &crate::records::t_key::TKey {
52 fn ttype(self) -> core::ffi::c_int {
53 self.tt()
54 }
55}
56
57impl TTypeOf for &mut crate::records::t_key::TKey {
58 fn ttype(self) -> core::ffi::c_int {
59 self.tt()
60 }
61}
62
63macro_rules! impl_gc_ttype_direct {
64 ($t:ty) => {
65 impl TTypeOf for *const $t {
66 fn ttype(self) -> core::ffi::c_int {
67 unsafe { (*self).tt as core::ffi::c_int }
68 }
69 }
70
71 impl TTypeOf for *mut $t {
72 fn ttype(self) -> core::ffi::c_int {
73 unsafe { (*self).tt as core::ffi::c_int }
74 }
75 }
76 };
77}
78
79macro_rules! impl_gc_ttype_hdr {
80 ($t:ty) => {
81 impl TTypeOf for *const $t {
82 fn ttype(self) -> core::ffi::c_int {
83 unsafe { (*self).hdr.tt as core::ffi::c_int }
84 }
85 }
86
87 impl TTypeOf for *mut $t {
88 fn ttype(self) -> core::ffi::c_int {
89 unsafe { (*self).hdr.tt as core::ffi::c_int }
90 }
91 }
92 };
93}
94
95impl TTypeOf for *const crate::records::gc_object::GCObject {
96 fn ttype(self) -> core::ffi::c_int {
97 unsafe { (*self).gch.tt as core::ffi::c_int }
98 }
99}
100
101impl TTypeOf for *mut crate::records::gc_object::GCObject {
102 fn ttype(self) -> core::ffi::c_int {
103 unsafe { (*self).gch.tt as core::ffi::c_int }
104 }
105}
106
107impl_gc_ttype_hdr!(crate::records::t_string::TString);
108impl_gc_ttype_hdr!(crate::records::closure::Closure);
109impl_gc_ttype_hdr!(crate::records::lua_state::lua_State);
110impl_gc_ttype_hdr!(crate::records::proto::Proto);
111impl_gc_ttype_hdr!(crate::records::up_val::UpVal);
112
113impl_gc_ttype_direct!(crate::records::lua_table::LuaTable);
114impl_gc_ttype_direct!(crate::records::udata::Udata);
115impl_gc_ttype_direct!(crate::records::luau_buffer::LuauBuffer);
116impl_gc_ttype_direct!(crate::records::luau_class::LuauClass);
117impl_gc_ttype_direct!(crate::records::luau_object::LuauObject);