Communicate a little bit better about the checkstack constant
This commit is contained in:
parent
ace5cb44f0
commit
d78420b51c
23
src/util.rs
23
src/util.rs
|
@ -55,15 +55,13 @@ where
|
||||||
res
|
res
|
||||||
}
|
}
|
||||||
|
|
||||||
// Run an operation on a lua_State and automatically clean up the stack before
|
// Run an operation on a lua_State and automatically clean up the stack before returning. Takes the
|
||||||
// returning. Takes the lua_State, the expected stack size change, and an
|
// lua_State, the expected stack size change, and an operation to run. If the operation results in
|
||||||
// operation to run. If the operation results in success, then the stack is
|
// success, then the stack is inspected to make sure the change in stack size matches the expected
|
||||||
// inspected to make sure the change in stack size matches the expected change
|
// change and otherwise this is a logic error and will panic. If the operation results in an error,
|
||||||
// and otherwise this is a logic error and will panic. If the operation results
|
// the stack is shrunk to the value before the call. If the operation results in an error and the
|
||||||
// in an error, the stack is shrunk to the value before the call. If the
|
// stack is smaller than the value before the call, then this is unrecoverable and this will panic.
|
||||||
// operation results in an error and the stack is smaller than the value before
|
// If this function panics, it will clear the stack before panicking.
|
||||||
// the call, then this is unrecoverable and this will panic. If this function
|
|
||||||
// panics, it will clear the stack before panicking.
|
|
||||||
pub unsafe fn stack_err_guard<F, R>(state: *mut ffi::lua_State, change: c_int, op: F) -> Result<R>
|
pub unsafe fn stack_err_guard<F, R>(state: *mut ffi::lua_State, change: c_int, op: F) -> Result<R>
|
||||||
where
|
where
|
||||||
F: FnOnce() -> Result<R>,
|
F: FnOnce() -> Result<R>,
|
||||||
|
@ -312,10 +310,13 @@ where
|
||||||
// traceback, and if it is a WrappedPanic, does not modify it.
|
// traceback, and if it is a WrappedPanic, does not modify it.
|
||||||
#[cfg_attr(unwind, unwind)]
|
#[cfg_attr(unwind, unwind)]
|
||||||
pub unsafe extern "C" fn error_traceback(state: *mut ffi::lua_State) -> c_int {
|
pub unsafe extern "C" fn error_traceback(state: *mut ffi::lua_State) -> c_int {
|
||||||
|
// I believe luaL_traceback requires this much free stack to not error.
|
||||||
|
const LUA_TRACEBACK_STACK: c_int = 11;
|
||||||
|
|
||||||
if ffi::lua_checkstack(state, 2) == 0 {
|
if ffi::lua_checkstack(state, 2) == 0 {
|
||||||
// If we don't have enough stack space to even check the error type, do nothing
|
// If we don't have enough stack space to even check the error type, do nothing
|
||||||
} else if is_wrapped_error(state, 1) {
|
} else if is_wrapped_error(state, 1) {
|
||||||
let traceback = if ffi::lua_checkstack(state, 11) != 0 {
|
let traceback = if ffi::lua_checkstack(state, LUA_TRACEBACK_STACK) != 0 {
|
||||||
gc_guard(state, || {
|
gc_guard(state, || {
|
||||||
ffi::luaL_traceback(state, state, ptr::null(), 0);
|
ffi::luaL_traceback(state, state, ptr::null(), 0);
|
||||||
});
|
});
|
||||||
|
@ -337,7 +338,7 @@ pub unsafe extern "C" fn error_traceback(state: *mut ffi::lua_State) -> c_int {
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
} else if !is_wrapped_panic(state, 1) {
|
} else if !is_wrapped_panic(state, 1) {
|
||||||
if ffi::lua_checkstack(state, 11) != 0 {
|
if ffi::lua_checkstack(state, LUA_TRACEBACK_STACK) != 0 {
|
||||||
gc_guard(state, || {
|
gc_guard(state, || {
|
||||||
let s = ffi::lua_tostring(state, 1);
|
let s = ffi::lua_tostring(state, 1);
|
||||||
let s = if s.is_null() {
|
let s = if s.is_null() {
|
||||||
|
|
Loading…
Reference in New Issue