Skip to main content

luaur_vm/functions/
lua_h_setstr.rs

1use crate::functions::lua_h_getstr::lua_h_getstr;
2use crate::functions::newkey::newkey;
3use crate::macros::cast_to::cast_to;
4use crate::macros::invalidate_t_mcache::invalidateTMcache;
5use crate::macros::setsvalue::setsvalue;
6use crate::type_aliases::lua_state::lua_State;
7use crate::type_aliases::lua_table::LuaTable;
8use crate::type_aliases::t_string::TString;
9use crate::type_aliases::t_value::TValue;
10
11use crate::macros::lua_o_nilobject::luaO_nilobject;
12
13#[allow(non_snake_case)]
14pub unsafe fn lua_h_setstr(L: *mut lua_State, t: *mut LuaTable, key: *mut TString) -> *mut TValue {
15    // The dependency card for lua_h_getstr shows a stub signature pub fn lua_h_getstr();
16    // We must transmute it to the real signature (t, key) -> *const TValue to call it.
17    type LuaHGetStrFn = unsafe fn(*mut LuaTable, *mut TString) -> *const TValue;
18    let lua_h_getstr_ptr =
19        core::mem::transmute::<_, LuaHGetStrFn>(lua_h_getstr as *const core::ffi::c_void);
20
21    let p = lua_h_getstr_ptr(t, key);
22    invalidateTMcache(t);
23
24    if p != luaO_nilobject {
25        cast_to!(*mut TValue, p)
26    } else {
27        let mut k: TValue = core::mem::zeroed();
28        setsvalue!(L, &mut k, key);
29
30        // The newkey stub in the context is fn newkey(), but the C++ source and
31        // other examples show it takes (L, t, k). We must use the real signature
32        // required by the logic.
33        type NewKeyFn = unsafe fn(*mut lua_State, *mut LuaTable, *const TValue) -> *mut TValue;
34        let newkey_ptr: NewKeyFn = core::mem::transmute(newkey as *const core::ffi::c_void);
35        newkey_ptr(L, t, &k)
36    }
37}