Skip to main content

luaur_vm/functions/
lua_resetthread.rs

1//! Node: `cxx:Function:Luau.VM:VM/src/lstate.cpp:148:lua_resetthread`
2//! Source: `VM/src/lstate.cpp:148-180` (hand-ported)
3
4use crate::enums::lua_status::lua_Status;
5use crate::functions::cleanupcistack::cleanupcistack;
6use crate::functions::lua_d_realloc_ci::lua_d_realloc_ci;
7use crate::functions::lua_d_reallocstack::luaD_reallocstack;
8use crate::functions::lua_f_close::lua_f_close;
9use crate::macros::api_check::api_check;
10use crate::macros::basic_ci_size::BASIC_CI_SIZE;
11use crate::macros::basic_stack_size::BASIC_STACK_SIZE;
12use crate::macros::extra_stack::EXTRA_STACK;
13use crate::macros::lua_minstack::LUA_MINSTACK;
14use crate::macros::setnilvalue::setnilvalue;
15use crate::type_aliases::lua_state::lua_State;
16
17pub unsafe fn lua_resetthread(L: *mut lua_State) {
18    api_check!(L, !(*L).isactive);
19    api_check!(
20        L,
21        (*L).status != lua_Status::LUA_OK as u8 || (*L).ci == (*L).base_ci
22    );
23
24    // close upvalues before clearing anything
25    lua_f_close(L, (*L).stack);
26    if luaur_common::FFlag::LuauClosureUsageCounter.get() {
27        cleanupcistack(L);
28    }
29
30    // clear call frames
31    let ci = (*L).base_ci;
32    (*ci).func = (*L).stack;
33    (*ci).base = (*ci).func.add(1);
34    (*ci).top = (*ci).base.add(LUA_MINSTACK as usize);
35    setnilvalue!((*ci).func);
36    (*L).ci = ci;
37    if (*L).size_ci != BASIC_CI_SIZE {
38        lua_d_realloc_ci(L, BASIC_CI_SIZE);
39    }
40    // clear thread state
41    (*L).status = lua_Status::LUA_OK as u8;
42    (*L).base = (*(*L).ci).base;
43    (*L).top = (*(*L).ci).base;
44    (*L).nCcalls = 0;
45    (*L).baseCcalls = 0;
46    // clear thread stack
47    if (*L).stacksize != BASIC_STACK_SIZE + EXTRA_STACK {
48        luaD_reallocstack(L, BASIC_STACK_SIZE, 0);
49    }
50    for i in 0..(*L).stacksize as usize {
51        setnilvalue!((*L).stack.add(i));
52    }
53}