use std::cell::Cell; use std::marker::PhantomData; use std::os::raw::c_int; use super::UserDataStorage; use crate::util::{get_userdata, take_userdata}; // This is a trick to check if a type is `Sync` or not. // It uses leaked specialization feature from stdlib. struct IsSync<'a, T> { is_sync: &'a Cell, _marker: PhantomData, } impl Clone for IsSync<'_, T> { fn clone(&self) -> Self { self.is_sync.set(false); IsSync { is_sync: self.is_sync, _marker: PhantomData, } } } impl Copy for IsSync<'_, T> {} pub(crate) fn is_sync() -> bool { let is_sync = Cell::new(true); let _ = [IsSync:: { is_sync: &is_sync, _marker: PhantomData, }] .clone(); is_sync.get() } pub(super) unsafe extern "C-unwind" fn userdata_destructor(state: *mut ffi::lua_State) -> c_int { let ud = get_userdata::>(state, -1); if !(*ud).is_borrowed() { take_userdata::>(state); ffi::lua_pushboolean(state, 1); } else { ffi::lua_pushboolean(state, 0); } 1 }