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")]
41pub(crate) type Callback = Box<dyn Fn(&RawLua, c_int) -> Result<c_int> + Send + 'static>;
42
43#[cfg(not(feature = "send"))]
44pub(crate) type Callback = Box<dyn Fn(&RawLua, c_int) -> Result<c_int> + 'static>;
45
46pub(crate) type ScopedCallback<'s> = Box<dyn Fn(&RawLua, c_int) -> Result<c_int> + 's>;
47
48pub(crate) struct Upvalue<T> {
49 pub(crate) data: T,
50 pub(crate) extra: XRc<UnsafeCell<ExtraData>>,
51}
52
53pub(crate) type CallbackUpvalue = Upvalue<Option<Callback>>;
54
55#[cfg(all(feature = "async", feature = "send"))]
56pub(crate) type AsyncCallback =
57 Box<dyn for<'a> Fn(&'a RawLua, c_int) -> BoxFuture<'a, Result<c_int>> + Send + 'static>;
58
59#[cfg(all(feature = "async", not(feature = "send")))]
60pub(crate) type AsyncCallback =
61 Box<dyn for<'a> Fn(&'a RawLua, c_int) -> BoxFuture<'a, Result<c_int>> + 'static>;
62
63#[cfg(feature = "async")]
64pub(crate) type AsyncCallbackUpvalue = Upvalue<AsyncCallback>;
65
66#[cfg(feature = "async")]
67pub(crate) type AsyncPollUpvalue = Upvalue<Option<BoxFuture<'static, Result<c_int>>>>;
68
69pub enum VmState {
71 Continue,
72 Yield,
76}
77
78#[cfg(not(feature = "luau"))]
79pub(crate) enum HookKind {
80 Global,
81 Thread(HookTriggers, HookCallback),
82}
83
84#[cfg(all(feature = "send", not(feature = "luau")))]
85pub(crate) type HookCallback = XRc<dyn Fn(&Lua, &Debug) -> Result<VmState> + Send>;
86
87#[cfg(all(not(feature = "send"), not(feature = "luau")))]
88pub(crate) type HookCallback = XRc<dyn Fn(&Lua, &Debug) -> Result<VmState>>;
89
90#[cfg(all(feature = "send", feature = "luau"))]
91pub(crate) type InterruptCallback = XRc<dyn Fn(&Lua) -> Result<VmState> + Send>;
92
93#[cfg(all(not(feature = "send"), feature = "luau"))]
94pub(crate) type InterruptCallback = XRc<dyn Fn(&Lua) -> Result<VmState>>;
95
96#[cfg(all(feature = "send", feature = "luau"))]
97pub(crate) type ThreadCreationCallback = XRc<dyn Fn(&Lua, crate::Thread) -> Result<()> + Send>;
98
99#[cfg(all(not(feature = "send"), feature = "luau"))]
100pub(crate) type ThreadCreationCallback = XRc<dyn Fn(&Lua, crate::Thread) -> Result<()>>;
101
102#[cfg(all(feature = "send", feature = "luau"))]
103pub(crate) type ThreadCollectionCallback = XRc<dyn Fn(crate::LightUserData) + Send>;
104
105#[cfg(all(not(feature = "send"), feature = "luau"))]
106pub(crate) type ThreadCollectionCallback = XRc<dyn Fn(crate::LightUserData)>;
107
108#[cfg(all(feature = "send", feature = "lua54"))]
109pub(crate) type WarnCallback = XRc<dyn Fn(&Lua, &str, bool) -> Result<()> + Send>;
110
111#[cfg(all(not(feature = "send"), feature = "lua54"))]
112pub(crate) type WarnCallback = XRc<dyn Fn(&Lua, &str, bool) -> Result<()>>;
113
114#[cfg(feature = "send")]
116pub trait MaybeSend: Send {}
117#[cfg(feature = "send")]
118impl<T: Send> MaybeSend for T {}
119
120#[cfg(not(feature = "send"))]
121pub trait MaybeSend {}
122#[cfg(not(feature = "send"))]
123impl<T> MaybeSend for T {}
124
125pub(crate) struct DestructedUserdata;
126
127pub(crate) trait LuaType {
128 const TYPE_ID: c_int;
129}
130
131impl LuaType for bool {
132 const TYPE_ID: c_int = ffi::LUA_TBOOLEAN;
133}
134
135impl LuaType for Number {
136 const TYPE_ID: c_int = ffi::LUA_TNUMBER;
137}
138
139impl LuaType for LightUserData {
140 const TYPE_ID: c_int = ffi::LUA_TLIGHTUSERDATA;
141}
142
143mod app_data;
144mod registry_key;
145mod sync;
146mod value_ref;
147
148#[cfg(test)]
149mod assertions {
150 use super::*;
151
152 #[cfg(not(feature = "send"))]
153 static_assertions::assert_not_impl_any!(ValueRef: Send);
154 #[cfg(feature = "send")]
155 static_assertions::assert_impl_all!(ValueRef: Send, Sync);
156}