Skip to main content

luaur_vm/functions/
validatetable.rs

1use crate::enums::lua_type::lua_Type;
2use crate::functions::validateobjref::validateobjref;
3use crate::functions::validateref::validateref;
4use crate::macros::gkey::gkey;
5use crate::macros::gkey::gval;
6use crate::records::gc_object::GCObject;
7use crate::records::global_state::global_State;
8use crate::records::lua_node::LuaNode;
9use crate::records::lua_table::LuaTable;
10use crate::type_aliases::t_value::TValue;
11use luaur_common::macros::luau_assert::LUAU_ASSERT;
12
13#[allow(non_snake_case)]
14pub(crate) unsafe fn validatetable(g: *mut global_State, h: *mut LuaTable) {
15    let sizenode = 1 << (*h).lsizenode;
16
17    LUAU_ASSERT!((*h).union.lastfree as i32 <= sizenode);
18
19    let h_gco = h as *mut GCObject;
20
21    if !(*h).metatable.is_null() {
22        validateobjref(g, h_gco, (*h).metatable as *mut GCObject);
23    }
24
25    for i in 0..(*h).sizearray {
26        validateref(g, h_gco, (*h).array.add(i as usize));
27    }
28
29    for i in 0..sizenode {
30        let n: *mut LuaNode = (*h).node.add(i as usize);
31
32        // ttype(gkey(n)) -> (*gkey!(n)).tt()
33        // ttisnil(gval(n)) -> crate::macros::ttisnil::ttisnil!(gval!(n))
34        LUAU_ASSERT!(
35            (*gkey!(n)).tt() != lua_Type::LUA_TDEADKEY as i32
36                || crate::macros::ttisnil::ttisnil!(gval!(n))
37        );
38
39        // gnext(n) -> (*n).key.next()
40        let next_val = (*n).key.next();
41        LUAU_ASSERT!(i + next_val >= 0 && i + next_val < sizenode);
42
43        if !crate::macros::ttisnil::ttisnil!(gval!(n)) {
44            let mut k: TValue = core::mem::zeroed();
45            k.tt = (*gkey!(n)).tt();
46            k.value = (*gkey!(n)).value;
47
48            validateref(g, h_gco, &mut k as *mut TValue);
49            validateref(g, h_gco, gval!(n));
50        }
51    }
52}