move error / panic metatable creation
This commit is contained in:
parent
fa1703d3d1
commit
2b7e89e7c6
132
src/util.rs
132
src/util.rs
|
@ -393,50 +393,11 @@ pub struct WrappedPanic(pub Option<Box<Any + Send>>);
|
||||||
|
|
||||||
// Pushes a WrappedError::Error to the top of the stack
|
// Pushes a WrappedError::Error to the top of the stack
|
||||||
pub unsafe fn push_wrapped_error(state: *mut ffi::lua_State, err: Error) {
|
pub unsafe fn push_wrapped_error(state: *mut ffi::lua_State, err: Error) {
|
||||||
unsafe extern "C" fn error_tostring(state: *mut ffi::lua_State) -> c_int {
|
|
||||||
callback_error(state, || if is_wrapped_error(state, -1) {
|
|
||||||
let error = get_userdata::<WrappedError>(state, -1);
|
|
||||||
push_string(state, &(*error).0.to_string());
|
|
||||||
ffi::lua_remove(state, -2);
|
|
||||||
|
|
||||||
Ok(1)
|
|
||||||
} else {
|
|
||||||
panic!("internal error: userdata mismatch in Error metamethod");
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
ffi::luaL_checkstack(state, 2, ptr::null());
|
ffi::luaL_checkstack(state, 2, ptr::null());
|
||||||
|
|
||||||
push_userdata(state, WrappedError(err));
|
push_userdata(state, WrappedError(err));
|
||||||
|
|
||||||
get_error_metatable(state);
|
get_error_metatable(state);
|
||||||
if ffi::lua_isnil(state, -1) != 0 {
|
|
||||||
ffi::lua_pop(state, 1);
|
|
||||||
|
|
||||||
ffi::luaL_checkstack(state, 7, ptr::null());
|
|
||||||
|
|
||||||
ffi::lua_newtable(state);
|
|
||||||
ffi::lua_pushlightuserdata(
|
|
||||||
state,
|
|
||||||
&ERROR_METATABLE_REGISTRY_KEY as *const u8 as *mut c_void,
|
|
||||||
);
|
|
||||||
ffi::lua_pushvalue(state, -2);
|
|
||||||
|
|
||||||
push_string(state, "__gc");
|
|
||||||
ffi::lua_pushcfunction(state, userdata_destructor::<WrappedError>);
|
|
||||||
ffi::lua_settable(state, -3);
|
|
||||||
|
|
||||||
push_string(state, "__tostring");
|
|
||||||
ffi::lua_pushcfunction(state, error_tostring);
|
|
||||||
ffi::lua_settable(state, -3);
|
|
||||||
|
|
||||||
push_string(state, "__metatable");
|
|
||||||
ffi::lua_pushboolean(state, 0);
|
|
||||||
ffi::lua_settable(state, -3);
|
|
||||||
|
|
||||||
ffi::lua_settable(state, ffi::LUA_REGISTRYINDEX);
|
|
||||||
}
|
|
||||||
|
|
||||||
ffi::lua_setmetatable(state, -2);
|
ffi::lua_setmetatable(state, -2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -447,29 +408,6 @@ pub unsafe fn push_wrapped_panic(state: *mut ffi::lua_State, panic: Box<Any + Se
|
||||||
push_userdata(state, WrappedPanic(Some(panic)));
|
push_userdata(state, WrappedPanic(Some(panic)));
|
||||||
|
|
||||||
get_panic_metatable(state);
|
get_panic_metatable(state);
|
||||||
if ffi::lua_isnil(state, -1) != 0 {
|
|
||||||
ffi::lua_pop(state, 1);
|
|
||||||
|
|
||||||
ffi::luaL_checkstack(state, 7, ptr::null());
|
|
||||||
|
|
||||||
ffi::lua_newtable(state);
|
|
||||||
ffi::lua_pushlightuserdata(
|
|
||||||
state,
|
|
||||||
&PANIC_METATABLE_REGISTRY_KEY as *const u8 as *mut c_void,
|
|
||||||
);
|
|
||||||
ffi::lua_pushvalue(state, -2);
|
|
||||||
|
|
||||||
push_string(state, "__gc");
|
|
||||||
ffi::lua_pushcfunction(state, userdata_destructor::<WrappedPanic>);
|
|
||||||
ffi::lua_settable(state, -3);
|
|
||||||
|
|
||||||
push_string(state, "__metatable");
|
|
||||||
ffi::lua_pushboolean(state, 0);
|
|
||||||
ffi::lua_settable(state, -3);
|
|
||||||
|
|
||||||
ffi::lua_settable(state, ffi::LUA_REGISTRYINDEX);
|
|
||||||
}
|
|
||||||
|
|
||||||
ffi::lua_setmetatable(state, -2);
|
ffi::lua_setmetatable(state, -2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -537,11 +475,52 @@ pub unsafe fn is_wrapped_panic(state: *mut ffi::lua_State, index: c_int) -> bool
|
||||||
}
|
}
|
||||||
|
|
||||||
pub unsafe fn get_error_metatable(state: *mut ffi::lua_State) -> c_int {
|
pub unsafe fn get_error_metatable(state: *mut ffi::lua_State) -> c_int {
|
||||||
|
unsafe extern "C" fn error_tostring(state: *mut ffi::lua_State) -> c_int {
|
||||||
|
callback_error(state, || if is_wrapped_error(state, -1) {
|
||||||
|
let error = get_userdata::<WrappedError>(state, -1);
|
||||||
|
push_string(state, &(*error).0.to_string());
|
||||||
|
ffi::lua_remove(state, -2);
|
||||||
|
|
||||||
|
Ok(1)
|
||||||
|
} else {
|
||||||
|
panic!("internal error: userdata mismatch in Error metamethod");
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
ffi::lua_pushlightuserdata(
|
ffi::lua_pushlightuserdata(
|
||||||
state,
|
state,
|
||||||
&ERROR_METATABLE_REGISTRY_KEY as *const u8 as *mut c_void,
|
&ERROR_METATABLE_REGISTRY_KEY as *const u8 as *mut c_void,
|
||||||
);
|
);
|
||||||
ffi::lua_gettable(state, ffi::LUA_REGISTRYINDEX)
|
let t = ffi::lua_gettable(state, ffi::LUA_REGISTRYINDEX);
|
||||||
|
|
||||||
|
if t != ffi::LUA_TTABLE {
|
||||||
|
ffi::lua_pop(state, 1);
|
||||||
|
|
||||||
|
ffi::luaL_checkstack(state, 8, ptr::null());
|
||||||
|
|
||||||
|
ffi::lua_newtable(state);
|
||||||
|
ffi::lua_pushlightuserdata(
|
||||||
|
state,
|
||||||
|
&ERROR_METATABLE_REGISTRY_KEY as *const u8 as *mut c_void,
|
||||||
|
);
|
||||||
|
ffi::lua_pushvalue(state, -2);
|
||||||
|
|
||||||
|
push_string(state, "__gc");
|
||||||
|
ffi::lua_pushcfunction(state, userdata_destructor::<WrappedError>);
|
||||||
|
ffi::lua_settable(state, -3);
|
||||||
|
|
||||||
|
push_string(state, "__tostring");
|
||||||
|
ffi::lua_pushcfunction(state, error_tostring);
|
||||||
|
ffi::lua_settable(state, -3);
|
||||||
|
|
||||||
|
push_string(state, "__metatable");
|
||||||
|
ffi::lua_pushboolean(state, 0);
|
||||||
|
ffi::lua_settable(state, -3);
|
||||||
|
|
||||||
|
ffi::lua_settable(state, ffi::LUA_REGISTRYINDEX);
|
||||||
|
}
|
||||||
|
|
||||||
|
ffi::LUA_TTABLE
|
||||||
}
|
}
|
||||||
|
|
||||||
pub unsafe fn get_panic_metatable(state: *mut ffi::lua_State) -> c_int {
|
pub unsafe fn get_panic_metatable(state: *mut ffi::lua_State) -> c_int {
|
||||||
|
@ -549,7 +528,32 @@ pub unsafe fn get_panic_metatable(state: *mut ffi::lua_State) -> c_int {
|
||||||
state,
|
state,
|
||||||
&PANIC_METATABLE_REGISTRY_KEY as *const u8 as *mut c_void,
|
&PANIC_METATABLE_REGISTRY_KEY as *const u8 as *mut c_void,
|
||||||
);
|
);
|
||||||
ffi::lua_gettable(state, ffi::LUA_REGISTRYINDEX)
|
let t = ffi::lua_gettable(state, ffi::LUA_REGISTRYINDEX);
|
||||||
|
|
||||||
|
if t != ffi::LUA_TTABLE {
|
||||||
|
ffi::lua_pop(state, 1);
|
||||||
|
|
||||||
|
ffi::luaL_checkstack(state, 8, ptr::null());
|
||||||
|
|
||||||
|
ffi::lua_newtable(state);
|
||||||
|
ffi::lua_pushlightuserdata(
|
||||||
|
state,
|
||||||
|
&PANIC_METATABLE_REGISTRY_KEY as *const u8 as *mut c_void,
|
||||||
|
);
|
||||||
|
ffi::lua_pushvalue(state, -2);
|
||||||
|
|
||||||
|
push_string(state, "__gc");
|
||||||
|
ffi::lua_pushcfunction(state, userdata_destructor::<WrappedPanic>);
|
||||||
|
ffi::lua_settable(state, -3);
|
||||||
|
|
||||||
|
push_string(state, "__metatable");
|
||||||
|
ffi::lua_pushboolean(state, 0);
|
||||||
|
ffi::lua_settable(state, -3);
|
||||||
|
|
||||||
|
ffi::lua_settable(state, ffi::LUA_REGISTRYINDEX);
|
||||||
|
}
|
||||||
|
|
||||||
|
ffi::LUA_TTABLE
|
||||||
}
|
}
|
||||||
|
|
||||||
static ERROR_METATABLE_REGISTRY_KEY: u8 = 0;
|
static ERROR_METATABLE_REGISTRY_KEY: u8 = 0;
|
||||||
|
|
Loading…
Reference in New Issue