Skip to main content

luaur_vm/functions/
correctstack.rs

1use crate::type_aliases::call_info::CallInfo;
2use crate::type_aliases::lua_state::lua_State;
3use crate::type_aliases::t_value::TValue;
4use crate::type_aliases::up_val::UpVal;
5
6#[allow(non_snake_case)]
7pub unsafe fn correctstack(L: *mut lua_State, oldstack: *mut TValue) {
8    let stack_bytes = (*L).stack as *mut u8;
9    let oldstack_addr = oldstack as isize;
10
11    (*L).top = stack_bytes.wrapping_offset((*L).top as isize - oldstack_addr) as *mut TValue;
12
13    let mut up: *mut UpVal = (*L).openupval;
14    while !up.is_null() {
15        (*up).v = stack_bytes.wrapping_offset((*up).v as isize - oldstack_addr) as *mut TValue;
16        up = (*up).u.open.threadnext;
17    }
18
19    let mut ci: *mut CallInfo = (*L).base_ci;
20    while ci <= (*L).ci {
21        (*ci).top = stack_bytes.wrapping_offset((*ci).top as isize - oldstack_addr) as *mut TValue;
22        (*ci).base =
23            stack_bytes.wrapping_offset((*ci).base as isize - oldstack_addr) as *mut TValue;
24        (*ci).func =
25            stack_bytes.wrapping_offset((*ci).func as isize - oldstack_addr) as *mut TValue;
26        ci = ci.wrapping_add(1);
27    }
28
29    (*L).base = stack_bytes.wrapping_offset((*L).base as isize - oldstack_addr) as *mut TValue;
30}