Skip to main content

luaur_vm/functions/
moveelements.rs

1use crate::functions::lua_g_readonlyerror::lua_g_readonlyerror;
2use crate::functions::lua_rawgeti::lua_rawgeti;
3use crate::functions::lua_rawseti::lua_rawseti;
4use crate::macros::hvalue::hvalue;
5use crate::macros::lua_c_barrierfast::lua_c_barrierfast;
6use crate::macros::setobj_2_t::setobj2t;
7use crate::records::lua_table::LuaTable;
8use crate::type_aliases::lua_state::lua_State;
9use crate::type_aliases::t_value::TValue;
10
11#[allow(non_snake_case)]
12pub unsafe fn moveelements(L: *mut lua_State, srct: i32, dstt: i32, f: i32, e: i32, t: i32) {
13    let src = hvalue!((*L).base.offset((srct - 1) as isize));
14    let dst = hvalue!((*L).base.offset((dstt - 1) as isize));
15
16    if (*dst).readonly != 0 {
17        lua_g_readonlyerror(L);
18    }
19
20    let n = e - f + 1;
21    let f_index = (f as u32).wrapping_sub(1);
22    let t_index = (t as u32).wrapping_sub(1);
23    let n_unsigned = n as u32;
24
25    if f_index < (*src).sizearray as u32
26        && t_index < (*dst).sizearray as u32
27        && f_index.wrapping_add(n_unsigned) <= (*src).sizearray as u32
28        && t_index.wrapping_add(n_unsigned) <= (*dst).sizearray as u32
29    {
30        let srcarray = (*src).array;
31        let dstarray = (*dst).array;
32
33        if t > e || t <= f || (dstt != srct && dst != src) {
34            for i in 0..n {
35                let s: *mut TValue = srcarray.offset((f + i - 1) as isize);
36                let d: *mut TValue = dstarray.offset((t + i - 1) as isize);
37                setobj2t!(L, d, s);
38            }
39        } else {
40            for i in (0..n).rev() {
41                let s: *mut TValue = srcarray.offset((f + i - 1) as isize);
42                let d: *mut TValue = dstarray.offset((t + i - 1) as isize);
43                setobj2t!(L, d, s);
44            }
45        }
46
47        lua_c_barrierfast!(L, dst);
48    } else {
49        if t > e || t <= f || dst != src {
50            for i in 0..n {
51                lua_rawgeti(L, srct, f + i);
52                lua_rawseti(L, dstt, t + i);
53            }
54        } else {
55            for i in (0..n).rev() {
56                lua_rawgeti(L, srct, f + i);
57                lua_rawseti(L, dstt, t + i);
58            }
59        }
60    }
61}