diff --git a/mlua-sys/src/lua51/lua.rs b/mlua-sys/src/lua51/lua.rs index db409aa..7103a72 100644 --- a/mlua-sys/src/lua51/lua.rs +++ b/mlua-sys/src/lua51/lua.rs @@ -328,6 +328,14 @@ pub unsafe fn lua_getglobal_(L: *mut lua_State, var: *const c_char) { lua_getfield_(L, LUA_GLOBALSINDEX, var) } +#[inline(always)] +pub unsafe fn lua_tolightuserdata(L: *mut lua_State, idx: c_int) -> *mut c_void { + if lua_islightuserdata(L, idx) != 0 { + return lua_touserdata(L, idx); + } + ptr::null_mut() +} + #[inline(always)] pub unsafe fn lua_tostring(L: *mut lua_State, i: c_int) -> *const c_char { lua_tolstring(L, i, ptr::null_mut()) diff --git a/mlua-sys/src/lua52/lua.rs b/mlua-sys/src/lua52/lua.rs index 8040d5d..c52bc9f 100644 --- a/mlua-sys/src/lua52/lua.rs +++ b/mlua-sys/src/lua52/lua.rs @@ -417,6 +417,14 @@ pub unsafe fn lua_pushglobaltable(L: *mut lua_State) { lua_rawgeti_(L, LUA_REGISTRYINDEX, LUA_RIDX_GLOBALS as _) } +#[inline(always)] +pub unsafe fn lua_tolightuserdata(L: *mut lua_State, idx: c_int) -> *mut c_void { + if lua_islightuserdata(L, idx) != 0 { + return lua_touserdata(L, idx); + } + ptr::null_mut() +} + #[inline(always)] pub unsafe fn lua_tostring(L: *mut lua_State, i: c_int) -> *const c_char { lua_tolstring(L, i, ptr::null_mut()) diff --git a/mlua-sys/src/lua53/lua.rs b/mlua-sys/src/lua53/lua.rs index b726911..24dbba2 100644 --- a/mlua-sys/src/lua53/lua.rs +++ b/mlua-sys/src/lua53/lua.rs @@ -424,6 +424,14 @@ pub unsafe fn lua_pushglobaltable(L: *mut lua_State) -> c_int { lua_rawgeti(L, LUA_REGISTRYINDEX, LUA_RIDX_GLOBALS) } +#[inline(always)] +pub unsafe fn lua_tolightuserdata(L: *mut lua_State, idx: c_int) -> *mut c_void { + if lua_islightuserdata(L, idx) != 0 { + return lua_touserdata(L, idx); + } + ptr::null_mut() +} + #[inline(always)] pub unsafe fn lua_tostring(L: *mut lua_State, i: c_int) -> *const c_char { lua_tolstring(L, i, ptr::null_mut()) diff --git a/mlua-sys/src/lua54/lua.rs b/mlua-sys/src/lua54/lua.rs index 26ad0a6..f628e69 100644 --- a/mlua-sys/src/lua54/lua.rs +++ b/mlua-sys/src/lua54/lua.rs @@ -457,6 +457,14 @@ pub unsafe fn lua_pushglobaltable(L: *mut lua_State) -> c_int { lua_rawgeti(L, LUA_REGISTRYINDEX, LUA_RIDX_GLOBALS) } +#[inline(always)] +pub unsafe fn lua_tolightuserdata(L: *mut lua_State, idx: c_int) -> *mut c_void { + if lua_islightuserdata(L, idx) != 0 { + return lua_touserdata(L, idx); + } + ptr::null_mut() +} + #[inline(always)] pub unsafe fn lua_tostring(L: *mut lua_State, i: c_int) -> *const c_char { lua_tolstring(L, i, ptr::null_mut()) diff --git a/src/lua.rs b/src/lua.rs index 30cfc5b..6d22e05 100644 --- a/src/lua.rs +++ b/src/lua.rs @@ -2965,8 +2965,7 @@ impl Lua { match fut.as_mut().poll(&mut ctx) { Poll::Pending => { ffi::lua_pushnil(state); - let pending = &ASYNC_POLL_PENDING as *const u8 as *mut c_void; - ffi::lua_pushlightuserdata(state, pending); + ffi::lua_pushlightuserdata(state, Lua::poll_pending().0); Ok(2) } Poll::Ready(nresults) => { @@ -3069,6 +3068,14 @@ impl Lua { mem::replace(&mut (*self.extra.get()).waker, waker) } + /// Returns internal `Poll::Pending` constant used for executing async callbacks. + #[cfg(feature = "async")] + #[doc(hidden)] + #[inline] + pub fn poll_pending() -> LightUserData { + LightUserData(&ASYNC_POLL_PENDING as *const u8 as *mut c_void) + } + pub(crate) unsafe fn make_userdata(&self, data: UserDataCell) -> Result where T: UserData + 'static, diff --git a/src/thread.rs b/src/thread.rs index 415bd21..e594297 100644 --- a/src/thread.rs +++ b/src/thread.rs @@ -15,7 +15,7 @@ use crate::{ #[cfg(feature = "async")] use { - crate::{lua::ASYNC_POLL_PENDING, value::MultiValue}, + crate::value::MultiValue, futures_util::stream::Stream, std::{ future::Future, @@ -530,12 +530,7 @@ where #[cfg(feature = "async")] #[inline(always)] unsafe fn is_poll_pending(state: *mut ffi::lua_State) -> bool { - if ffi::lua_islightuserdata(state, -1) != 0 { - let stack_ptr = ffi::lua_touserdata(state, -1) as *const u8; - let pending_ptr = &ASYNC_POLL_PENDING as *const u8; - return std::ptr::eq(stack_ptr, pending_ptr); - } - false + ffi::lua_tolightuserdata(state, -1) == Lua::poll_pending().0 } #[cfg(feature = "async")]