luaur_vm/functions/
validatetable.rs1use 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 LUAU_ASSERT!(
35 (*gkey!(n)).tt() != lua_Type::LUA_TDEADKEY as i32
36 || crate::macros::ttisnil::ttisnil!(gval!(n))
37 );
38
39 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}