Skip to main content

luaur_vm/functions/
lua_h_get.rs

1use 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;