Skip to main content

luaur_vm/functions/
lua_absindex.rs

1use core::ffi::c_int;
2
3use crate::macros::api_check::api_check;
4use crate::macros::cast_int::cast_int;
5use crate::macros::lua_ispseudo::lua_ispseudo;
6use crate::type_aliases::lua_state::lua_State;
7
8pub fn lua_absindex(L: *mut lua_State, idx: c_int) -> c_int {
9    let top_minus_base = unsafe { (*L).top.offset_from((*L).base) };
10
11    api_check!(
12        L,
13        (idx > 0 && idx <= unsafe { cast_int!(top_minus_base) })
14            || (idx < 0 && -idx <= unsafe { cast_int!(top_minus_base) })
15            || lua_ispseudo(idx)
16    );
17
18    if idx > 0 || lua_ispseudo(idx) {
19        idx
20    } else {
21        cast_int!(unsafe { (*L).top.offset_from((*L).base) }) + idx + 1
22    }
23}