luaur_vm/functions/
lua_absindex.rs1use 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}