luaur_vm/functions/
moveelements.rs1use 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}