1use std::cell::UnsafeCell;
2use std::os::raw::{c_int, c_void};
3
4#[cfg(not(feature = "luau"))]
5use crate::debug::{Debug, HookTriggers};
6use crate::error::Result;
7use crate::state::{ExtraData, Lua, RawLua};
8
9pub(crate) use sync::{ArcReentrantMutexGuard, ReentrantMutex, ReentrantMutexGuard, XRc, XWeak};
11
12#[cfg(all(feature = "async", feature = "send"))]
13pub(crate) type BoxFuture<'a, T> = futures_util::future::BoxFuture<'a, T>;
14
15#[cfg(all(feature = "async", not(feature = "send")))]
16pub(crate) type BoxFuture<'a, T> = futures_util::future::LocalBoxFuture<'a, T>;
17
18pub use app_data::{AppData, AppDataRef, AppDataRefMut};
19pub use either::Either;
20pub use registry_key::RegistryKey;
21pub(crate) use value_ref::ValueRef;
22
23#[cfg(feature = "async")]
24pub(crate) use value_ref::ValueRefIndex;
25
26pub type Integer = ffi::lua_Integer;
28pub type Number = ffi::lua_Number;
30
31#[derive(Debug, Copy, Clone, Eq, PartialEq)]
33pub struct LightUserData(pub *mut c_void);
34
35#[cfg(feature = "send")]
36unsafe impl Send for LightUserData {}
37#[cfg(feature = "send")]
38unsafe impl Sync for LightUserData {}
39
40#[cfg(feature = "send")]
41type CallbackFn<'a> = dyn Fn(&RawLua, c_int) -> Result<c_int> + Send + 'a;
42
43#[cfg(not(feature = "send"))]
44type CallbackFn<'a> = dyn Fn(&RawLua, c_int) -> Result<c_int> + 'a;
45
46pub(crate) type Callback = Box<CallbackFn<'static>>;
47pub(crate) type CallbackPtr = *const CallbackFn<'static>;
48
49pub(crate) type ScopedCallback<'s> = Box<dyn Fn(&RawLua, c_int) -> Result<c_int> + 's>;
50
51pub(crate) struct Upvalue<T> {
52 pub(crate) data: T,
53 pub(crate) extra: XRc<UnsafeCell<ExtraData>>,
54}
55
56pub(crate) type CallbackUpvalue = Upvalue<Option<Callback>>;
57
58#[cfg(all(feature = "async", feature = "send"))]
59pub(crate) type AsyncCallback =
60 Box<dyn for<'a> Fn(&'a RawLua, c_int) -> BoxFuture<'a, Result<c_int>> + Send + 'static>;
61
62#[cfg(all(feature = "async", not(feature = "send")))]
63pub(crate) type AsyncCallback =
64 Box<dyn for<'a> Fn(&'a RawLua, c_int) -> BoxFuture<'a, Result<c_int>> + 'static>;
65
66#[cfg(feature = "async")]
67pub(crate) type AsyncCallbackUpvalue = Upvalue<AsyncCallback>;
68
69#[cfg(feature = "async")]
70pub(crate) type AsyncPollUpvalue = Upvalue<Option<BoxFuture<'static, Result<c_int>>>>;
71
72pub enum VmState {
74 Continue,
75 Yield,
79}
80
81#[cfg(not(feature = "luau"))]
82pub(crate) enum HookKind {
83 Global,
84 Thread(HookTriggers, HookCallback),
85}
86
87#[cfg(all(feature = "send", not(feature = "luau")))]
88pub(crate) type HookCallback = XRc<dyn Fn(&Lua, &Debug) -> Result<VmState> + Send>;
89
90#[cfg(all(not(feature = "send"), not(feature = "luau")))]
91pub(crate) type HookCallback = XRc<dyn Fn(&Lua, &Debug) -> Result<VmState>>;
92
93#[cfg(all(feature = "send", feature = "luau"))]
94pub(crate) type InterruptCallback = XRc<dyn Fn(&Lua) -> Result<VmState> + Send>;
95
96#[cfg(all(not(feature = "send"), feature = "luau"))]
97pub(crate) type InterruptCallback = XRc<dyn Fn(&Lua) -> Result<VmState>>;
98
99#[cfg(all(feature = "send", feature = "luau"))]
100pub(crate) type ThreadCreationCallback = XRc<dyn Fn(&Lua, crate::Thread) -> Result<()> + Send>;
101
102#[cfg(all(not(feature = "send"), feature = "luau"))]
103pub(crate) type ThreadCreationCallback = XRc<dyn Fn(&Lua, crate::Thread) -> Result<()>>;
104
105#[cfg(all(feature = "send", feature = "luau"))]
106pub(crate) type ThreadCollectionCallback = XRc<dyn Fn(crate::LightUserData) + Send>;
107
108#[cfg(all(not(feature = "send"), feature = "luau"))]
109pub(crate) type ThreadCollectionCallback = XRc<dyn Fn(crate::LightUserData)>;
110
111#[cfg(all(feature = "send", feature = "lua54"))]
112pub(crate) type WarnCallback = XRc<dyn Fn(&Lua, &str, bool) -> Result<()> + Send>;
113
114#[cfg(all(not(feature = "send"), feature = "lua54"))]
115pub(crate) type WarnCallback = XRc<dyn Fn(&Lua, &str, bool) -> Result<()>>;
116
117#[cfg(feature = "send")]
119pub trait MaybeSend: Send {}
120#[cfg(feature = "send")]
121impl<T: Send> MaybeSend for T {}
122
123#[cfg(not(feature = "send"))]
124pub trait MaybeSend {}
125#[cfg(not(feature = "send"))]
126impl<T> MaybeSend for T {}
127
128pub(crate) struct DestructedUserdata;
129
130pub(crate) trait LuaType {
131 const TYPE_ID: c_int;
132}
133
134impl LuaType for bool {
135 const TYPE_ID: c_int = ffi::LUA_TBOOLEAN;
136}
137
138impl LuaType for Number {
139 const TYPE_ID: c_int = ffi::LUA_TNUMBER;
140}
141
142impl LuaType for LightUserData {
143 const TYPE_ID: c_int = ffi::LUA_TLIGHTUSERDATA;
144}
145
146mod app_data;
147mod registry_key;
148mod sync;
149mod value_ref;
150
151#[cfg(test)]
152mod assertions {
153 use super::*;
154
155 #[cfg(not(feature = "send"))]
156 static_assertions::assert_not_impl_any!(ValueRef: Send);
157 #[cfg(feature = "send")]
158 static_assertions::assert_impl_all!(ValueRef: Send, Sync);
159}