Rename init_gc_metatable_for and get_gc_metatable_for
This commit is contained in:
parent
56b6b128b5
commit
582b2c585f
20
src/lua.rs
20
src/lua.rs
|
@ -27,8 +27,8 @@ use crate::userdata::{
|
||||||
};
|
};
|
||||||
use crate::util::{
|
use crate::util::{
|
||||||
self, assert_stack, callback_error, check_stack, get_destructed_userdata_metatable,
|
self, assert_stack, callback_error, check_stack, get_destructed_userdata_metatable,
|
||||||
get_gc_metatable_for, get_gc_userdata, get_main_state, get_userdata, get_wrapped_error,
|
get_gc_metatable, get_gc_userdata, get_main_state, get_userdata, get_wrapped_error,
|
||||||
init_error_registry, init_gc_metatable_for, init_userdata_metatable, pop_error, protect_lua,
|
init_error_registry, init_gc_metatable, init_userdata_metatable, pop_error, protect_lua,
|
||||||
push_gc_userdata, push_string, push_table, push_userdata, push_wrapped_error, rawset_field,
|
push_gc_userdata, push_string, push_table, push_userdata, push_wrapped_error, rawset_field,
|
||||||
safe_pcall, safe_xpcall, StackGuard, WrappedError, WrappedPanic,
|
safe_pcall, safe_xpcall, StackGuard, WrappedError, WrappedPanic,
|
||||||
};
|
};
|
||||||
|
@ -398,14 +398,14 @@ impl Lua {
|
||||||
// Create the internal metatables and place them in the registry
|
// Create the internal metatables and place them in the registry
|
||||||
// to prevent them from being garbage collected.
|
// to prevent them from being garbage collected.
|
||||||
|
|
||||||
init_gc_metatable_for::<Callback>(state, None)?;
|
init_gc_metatable::<Callback>(state, None)?;
|
||||||
init_gc_metatable_for::<CallbackUpvalue>(state, None)?;
|
init_gc_metatable::<CallbackUpvalue>(state, None)?;
|
||||||
#[cfg(feature = "async")]
|
#[cfg(feature = "async")]
|
||||||
{
|
{
|
||||||
init_gc_metatable_for::<AsyncCallback>(state, None)?;
|
init_gc_metatable::<AsyncCallback>(state, None)?;
|
||||||
init_gc_metatable_for::<AsyncCallbackUpvalue>(state, None)?;
|
init_gc_metatable::<AsyncCallbackUpvalue>(state, None)?;
|
||||||
init_gc_metatable_for::<AsyncPollUpvalue>(state, None)?;
|
init_gc_metatable::<AsyncPollUpvalue>(state, None)?;
|
||||||
init_gc_metatable_for::<Option<Waker>>(state, None)?;
|
init_gc_metatable::<Option<Waker>>(state, None)?;
|
||||||
|
|
||||||
// Create empty Waker slot
|
// Create empty Waker slot
|
||||||
push_gc_userdata::<Option<Waker>>(state, None)?;
|
push_gc_userdata::<Option<Waker>>(state, None)?;
|
||||||
|
@ -2420,7 +2420,7 @@ where
|
||||||
Ok(Err(err)) => {
|
Ok(Err(err)) => {
|
||||||
let wrapped_error = get_prealloc_err() as *mut WrappedError;
|
let wrapped_error = get_prealloc_err() as *mut WrappedError;
|
||||||
ptr::write(wrapped_error, WrappedError(err));
|
ptr::write(wrapped_error, WrappedError(err));
|
||||||
get_gc_metatable_for::<WrappedError>(state);
|
get_gc_metatable::<WrappedError>(state);
|
||||||
ffi::lua_setmetatable(state, -2);
|
ffi::lua_setmetatable(state, -2);
|
||||||
|
|
||||||
// Convert to CallbackError and attach traceback
|
// Convert to CallbackError and attach traceback
|
||||||
|
@ -2440,7 +2440,7 @@ where
|
||||||
Err(p) => {
|
Err(p) => {
|
||||||
let wrapped_panic = get_prealloc_err() as *mut WrappedPanic;
|
let wrapped_panic = get_prealloc_err() as *mut WrappedPanic;
|
||||||
ptr::write(wrapped_panic, WrappedPanic(Some(p)));
|
ptr::write(wrapped_panic, WrappedPanic(Some(p)));
|
||||||
get_gc_metatable_for::<WrappedPanic>(state);
|
get_gc_metatable::<WrappedPanic>(state);
|
||||||
ffi::lua_setmetatable(state, -2);
|
ffi::lua_setmetatable(state, -2);
|
||||||
ffi::lua_error(state)
|
ffi::lua_error(state)
|
||||||
}
|
}
|
||||||
|
|
18
src/util.rs
18
src/util.rs
|
@ -271,7 +271,7 @@ pub unsafe fn take_userdata<T>(state: *mut ffi::lua_State) -> T {
|
||||||
// Internally uses 3 stack spaces, does not call checkstack.
|
// Internally uses 3 stack spaces, does not call checkstack.
|
||||||
pub unsafe fn push_gc_userdata<T: Any>(state: *mut ffi::lua_State, t: T) -> Result<()> {
|
pub unsafe fn push_gc_userdata<T: Any>(state: *mut ffi::lua_State, t: T) -> Result<()> {
|
||||||
push_userdata(state, t)?;
|
push_userdata(state, t)?;
|
||||||
get_gc_metatable_for::<T>(state);
|
get_gc_metatable::<T>(state);
|
||||||
ffi::lua_setmetatable(state, -2);
|
ffi::lua_setmetatable(state, -2);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -282,7 +282,7 @@ pub unsafe fn get_gc_userdata<T: Any>(state: *mut ffi::lua_State, index: c_int)
|
||||||
if ud.is_null() || ffi::lua_getmetatable(state, index) == 0 {
|
if ud.is_null() || ffi::lua_getmetatable(state, index) == 0 {
|
||||||
return ptr::null_mut();
|
return ptr::null_mut();
|
||||||
}
|
}
|
||||||
get_gc_metatable_for::<T>(state);
|
get_gc_metatable::<T>(state);
|
||||||
let res = ffi::lua_rawequal(state, -1, -2);
|
let res = ffi::lua_rawequal(state, -1, -2);
|
||||||
ffi::lua_pop(state, 2);
|
ffi::lua_pop(state, 2);
|
||||||
if res == 0 {
|
if res == 0 {
|
||||||
|
@ -496,7 +496,7 @@ where
|
||||||
|
|
||||||
let wrapped_error = ud as *mut WrappedError;
|
let wrapped_error = ud as *mut WrappedError;
|
||||||
ptr::write(wrapped_error, WrappedError(err));
|
ptr::write(wrapped_error, WrappedError(err));
|
||||||
get_gc_metatable_for::<WrappedError>(state);
|
get_gc_metatable::<WrappedError>(state);
|
||||||
ffi::lua_setmetatable(state, -2);
|
ffi::lua_setmetatable(state, -2);
|
||||||
|
|
||||||
// Convert to CallbackError and attach traceback
|
// Convert to CallbackError and attach traceback
|
||||||
|
@ -516,7 +516,7 @@ where
|
||||||
Err(p) => {
|
Err(p) => {
|
||||||
ffi::lua_settop(state, 1);
|
ffi::lua_settop(state, 1);
|
||||||
ptr::write(ud as *mut WrappedPanic, WrappedPanic(Some(p)));
|
ptr::write(ud as *mut WrappedPanic, WrappedPanic(Some(p)));
|
||||||
get_gc_metatable_for::<WrappedPanic>(state);
|
get_gc_metatable::<WrappedPanic>(state);
|
||||||
ffi::lua_setmetatable(state, -2);
|
ffi::lua_setmetatable(state, -2);
|
||||||
ffi::lua_error(state)
|
ffi::lua_error(state)
|
||||||
}
|
}
|
||||||
|
@ -651,7 +651,7 @@ pub unsafe fn get_wrapped_error(state: *mut ffi::lua_State, index: c_int) -> *co
|
||||||
|
|
||||||
// Initialize the internal (with __gc method) metatable for a type T.
|
// Initialize the internal (with __gc method) metatable for a type T.
|
||||||
// Uses 6 stack spaces and calls checkstack.
|
// Uses 6 stack spaces and calls checkstack.
|
||||||
pub unsafe fn init_gc_metatable_for<T: Any>(
|
pub unsafe fn init_gc_metatable<T: Any>(
|
||||||
state: *mut ffi::lua_State,
|
state: *mut ffi::lua_State,
|
||||||
customize_fn: Option<fn(*mut ffi::lua_State) -> Result<()>>,
|
customize_fn: Option<fn(*mut ffi::lua_State) -> Result<()>>,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
|
@ -687,7 +687,7 @@ pub unsafe fn init_gc_metatable_for<T: Any>(
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub unsafe fn get_gc_metatable_for<T: Any>(state: *mut ffi::lua_State) {
|
pub unsafe fn get_gc_metatable<T: Any>(state: *mut ffi::lua_State) {
|
||||||
let type_id = TypeId::of::<T>();
|
let type_id = TypeId::of::<T>();
|
||||||
let ref_addr = {
|
let ref_addr = {
|
||||||
let mt_cache = mlua_expect!(METATABLE_CACHE.lock(), "cannot lock metatable cache");
|
let mt_cache = mlua_expect!(METATABLE_CACHE.lock(), "cannot lock metatable cache");
|
||||||
|
@ -773,7 +773,7 @@ pub unsafe fn init_error_registry(state: *mut ffi::lua_State) -> Result<()> {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
init_gc_metatable_for::<WrappedError>(
|
init_gc_metatable::<WrappedError>(
|
||||||
state,
|
state,
|
||||||
Some(|state| {
|
Some(|state| {
|
||||||
ffi::lua_pushcfunction(state, error_tostring);
|
ffi::lua_pushcfunction(state, error_tostring);
|
||||||
|
@ -781,7 +781,7 @@ pub unsafe fn init_error_registry(state: *mut ffi::lua_State) -> Result<()> {
|
||||||
}),
|
}),
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
init_gc_metatable_for::<WrappedPanic>(
|
init_gc_metatable::<WrappedPanic>(
|
||||||
state,
|
state,
|
||||||
Some(|state| {
|
Some(|state| {
|
||||||
ffi::lua_pushcfunction(state, error_tostring);
|
ffi::lua_pushcfunction(state, error_tostring);
|
||||||
|
@ -846,7 +846,7 @@ pub unsafe fn init_error_registry(state: *mut ffi::lua_State) -> Result<()> {
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
// Create error print buffer
|
// Create error print buffer
|
||||||
init_gc_metatable_for::<String>(state, None)?;
|
init_gc_metatable::<String>(state, None)?;
|
||||||
push_gc_userdata(state, String::new())?;
|
push_gc_userdata(state, String::new())?;
|
||||||
protect_lua(state, 1, 0, |state| {
|
protect_lua(state, 1, 0, |state| {
|
||||||
let err_buf_key = &ERROR_PRINT_BUFFER_KEY as *const u8 as *const c_void;
|
let err_buf_key = &ERROR_PRINT_BUFFER_KEY as *const u8 as *const c_void;
|
||||||
|
|
Loading…
Reference in New Issue