Skip to main content

luaur_vm/functions/
lua_settop.rs

1use core::ffi::c_int;
2
3use crate::enums::lua_type::lua_Type;
4use crate::macros::api_check::api_check;
5use crate::macros::setnilvalue::setnilvalue;
6use crate::type_aliases::lua_state::lua_State;
7
8#[no_mangle]
9pub unsafe fn lua_settop(L: *mut lua_State, idx: c_int) {
10    if idx >= 0 {
11        api_check!(
12            L,
13            idx as isize <= unsafe { (*L).stack_last.offset_from((*L).base) }
14        );
15        while unsafe { (*L).top < (*L).base.add(idx as usize) } {
16            setnilvalue!(unsafe { (*L).top });
17            unsafe {
18                (*L).top = (*L).top.add(1);
19            }
20        }
21        unsafe {
22            (*L).top = (*L).base.add(idx as usize);
23        }
24    } else {
25        api_check!(
26            L,
27            -(idx + 1) as isize <= unsafe { (*L).top.offset_from((*L).base) }
28        );
29        unsafe {
30            (*L).top = (*L).top.offset((idx + 1) as isize); // `subtract' index (index is negative)
31        }
32    }
33}