luaur_vm/functions/
lua_h_get.rs1use crate::enums::lua_type::lua_Type;
2use crate::functions::lua_h_getnum::lua_h_getnum;
3use crate::functions::lua_h_getstr::lua_h_getstr;
4use crate::functions::lua_o_rawequal_key::luaO_rawequalKey;
5use crate::functions::mainposition::mainposition;
6use crate::macros::cast_num::cast_num;
7use crate::macros::gkey::gkey;
8use crate::macros::lua_o_nilobject::luaO_nilobject;
9use crate::macros::luai_num_2_int::luai_num2int;
10use crate::macros::luai_numeq::luai_numeq;
11use crate::macros::nvalue::nvalue;
12use crate::macros::tsvalue::tsvalue;
13use crate::macros::ttype::ttype;
14use crate::records::lua_table::LuaTable;
15use crate::type_aliases::t_value::TValue;
16use luaur_common::macros::luau_fallthrough::LUAU_FALLTHROUGH;
17
18#[allow(non_snake_case)]
19pub unsafe fn lua_h_get(t: *mut LuaTable, key: *const TValue) -> *const TValue {
20 let tt = ttype!(key);
21 match tt {
22 0 => luaO_nilobject,
23 6 => lua_h_getstr(t, tsvalue!(key) as *mut _),
24 3 => {
25 let mut k: core::ffi::c_int = 0;
26 let n = nvalue!(key);
27 luai_num2int!(k, n);
28 if luai_numeq(cast_num!(k), nvalue!(key)) {
29 return lua_h_getnum(t, k);
30 }
31 let mut n = mainposition(t, key);
32 loop {
33 if luaO_rawequalKey(gkey!(n), key) != 0 {
34 return crate::gval!(n);
35 }
36 let next = (*n).key.next();
37 if next == 0 {
38 break;
39 }
40 n = n.offset(next as isize);
41 }
42 luaO_nilobject
43 }
44 _ => {
45 let mut n = mainposition(t, key);
46 loop {
47 if luaO_rawequalKey(gkey!(n), key) != 0 {
48 return crate::gval!(n);
49 }
50 let next = (*n).key.next();
51 if next == 0 {
52 break;
53 }
54 n = n.offset(next as isize);
55 }
56 luaO_nilobject
57 }
58 }
59}
60
61pub use lua_h_get as luaH_get;