Skip to main content

luaur_vm/functions/
lua_h_setnum.rs

1use crate::functions::lua_h_getnum::lua_h_getnum;
2use crate::functions::newkey::newkey;
3use crate::macros::cast_num::cast_num;
4use crate::macros::cast_to::cast_to;
5use crate::macros::setnvalue::setnvalue;
6use crate::records::lua_table::LuaTable;
7use crate::type_aliases::lua_state::lua_State;
8use crate::type_aliases::t_value::TValue;
9
10use crate::macros::lua_o_nilobject::luaO_nilobject;
11
12#[allow(non_snake_case)]
13pub unsafe fn luaH_setnum(
14    l: *mut lua_State,
15    t: *mut LuaTable,
16    key: core::ffi::c_int,
17) -> *mut TValue {
18    // (1 <= key && key <= t->sizearray)
19    if (key as core::ffi::c_uint).wrapping_sub(1) < (*t).sizearray as core::ffi::c_uint {
20        return (*t).array.add((key - 1) as usize);
21    }
22
23    // hash fallback
24    let p = lua_h_getnum(t, key);
25    if p != luaO_nilobject {
26        cast_to!(*mut TValue, p)
27    } else {
28        let mut k: TValue = core::mem::zeroed();
29        setnvalue!(&mut k, cast_num!(key));
30
31        // The skeleton for newkey is a stub with no arguments.
32        // We must cast the call to match the expected signature (L, t, key) -> TValue*.
33        core::mem::transmute::<
34            _,
35            unsafe fn(*mut lua_State, *mut LuaTable, *const TValue) -> *mut TValue,
36        >(newkey as *const core::ffi::c_void)(l, t, &k)
37    }
38}
39
40#[export_name = "luaH_setnum"]
41pub unsafe extern "C" fn lua_h_setnum_export(
42    l: *mut lua_State,
43    t: *mut core::ffi::c_void,
44    key: core::ffi::c_int,
45) -> *mut TValue {
46    luaH_setnum(l, t as *mut LuaTable, key)
47}