Skip to main content

luaur_code_gen/functions/
forg_loop_table_iter.rs

1use luaur_vm::macros::lu_tag_iterator::LU_TAG_ITERATOR;
2use luaur_vm::macros::setnvalue::setnvalue;
3use luaur_vm::macros::setobj_2_s::setobj2s;
4use luaur_vm::macros::ttisnil::ttisnil;
5use luaur_vm::records::lua_table::LuaTable;
6use luaur_vm::type_aliases::t_value::TValue;
7
8use crate::type_aliases::lua_state::LuaState;
9
10#[allow(non_snake_case)]
11pub unsafe fn forg_loop_table_iter(
12    L: *mut LuaState,
13    h: *mut LuaTable,
14    mut index: i32,
15    ra: *mut TValue,
16) -> bool {
17    let sizearray = (*h).sizearray;
18
19    while (index as u32) < (sizearray as u32) {
20        let e = (*h).array.add(index as usize);
21
22        if !ttisnil!(e) {
23            (*ra.add(2)).value.p = (index + 1) as usize as *mut core::ffi::c_void;
24            (*ra.add(2)).tt = LU_TAG_ITERATOR;
25
26            setnvalue!(ra.add(3), (index + 1) as f64);
27            setobj2s!(L, ra.add(4), e);
28
29            return true;
30        }
31
32        index += 1;
33    }
34
35    false
36}
37
38#[no_mangle]
39pub unsafe extern "C" fn forgLoopTableIter(
40    L: *mut LuaState,
41    h: *mut core::ffi::c_void,
42    index: i32,
43    ra: *mut TValue,
44) -> bool {
45    forg_loop_table_iter(L, h as *mut LuaTable, index, ra)
46}