Skip to main content

luaur_vm/macros/
ttype.rs

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);