luaur_vm/functions/
lua_v_getimport.rs1use crate::functions::lua_v_gettable::lua_v_gettable;
2use crate::macros::restorestack::restorestack;
3use crate::macros::savestack::savestack;
4use crate::macros::sethvalue::sethvalue;
5use crate::macros::ttisnil::ttisnil;
6use crate::type_aliases::lua_state::lua_State;
7use crate::type_aliases::lua_table::LuaTable;
8use crate::type_aliases::stk_id::StkId;
9use crate::type_aliases::t_value::TValue;
10use luaur_common::macros::luau_assert::LUAU_ASSERT;
11
12#[allow(non_snake_case)]
13pub unsafe fn lua_v_getimport(
14 L: *mut lua_State,
15 env: *mut LuaTable,
16 k: *mut TValue,
17 mut res: StkId,
18 id: u32,
19 propagatenil: bool,
20) {
21 let count = id >> 30;
22 LUAU_ASSERT!(count > 0);
23
24 let id0 = ((id >> 20) & 1023) as usize;
25 let id1 = ((id >> 10) & 1023) as usize;
26 let id2 = (id & 1023) as usize;
27
28 let resp = savestack!(L, res);
31
32 let mut g: TValue = core::mem::zeroed();
34 sethvalue!(L, &mut g as *mut TValue, env);
35 lua_v_gettable(L, &g as *const TValue, k.add(id0), res);
36
37 if count < 2 {
39 return;
40 }
41
42 res = restorestack!(L, resp);
43 if !propagatenil || !ttisnil!(res) {
44 lua_v_gettable(L, res as *const TValue, k.add(id1), res);
45 }
46
47 if count < 3 {
49 return;
50 }
51
52 res = restorestack!(L, resp);
53 if !propagatenil || !ttisnil!(res) {
54 lua_v_gettable(L, res as *const TValue, k.add(id2), res);
55 }
56}