Skip to main content

luaur_vm/functions/
luau_f_replace.rs

1use crate::enums::lua_type::lua_Type;
2use crate::macros::luai_num_2_unsigned::luai_num2unsigned;
3use crate::macros::nvalue::nvalue;
4use crate::macros::setnvalue::setnvalue;
5use crate::macros::ttisnumber::ttisnumber;
6use crate::type_aliases::lua_state::lua_State;
7use crate::type_aliases::stk_id::StkId;
8use crate::type_aliases::t_value::TValue;
9
10#[allow(non_snake_case)]
11pub unsafe fn luau_f_replace(
12    _l: *mut lua_State,
13    res: StkId,
14    arg0: *mut TValue,
15    nresults: core::ffi::c_int,
16    args: StkId,
17    nparams: core::ffi::c_int,
18) -> core::ffi::c_int {
19    if nparams >= 3
20        && nresults <= 1
21        && ttisnumber!(arg0)
22        && ttisnumber!(args)
23        && ttisnumber!(args.offset(1))
24    {
25        let a1 = nvalue!(arg0);
26        let a2 = nvalue!(args);
27        let a3 = nvalue!(args.offset(1));
28
29        let mut n: u32 = 0;
30        luai_num2unsigned(&mut n, a1);
31
32        let mut v: u32 = 0;
33        luai_num2unsigned(&mut v, a2);
34
35        let f: i32 = a3 as i32;
36
37        if nparams == 3 {
38            if (f as u32) < 32 {
39                let m: u32 = 1;
40                let r: u32 = (n & !(m << (f as u32))) | ((v & m) << (f as u32));
41                setnvalue!(res, r as f64);
42                return 1;
43            }
44        } else if ttisnumber!(args.offset(2)) {
45            let a4 = nvalue!(args.offset(2));
46            let w: i32 = a4 as i32;
47
48            if f >= 0 && w > 0 && f + w <= 32 {
49                let m: u32 = !(0xFFFF_FFFE_u32 << (w - 1));
50                let r: u32 = (n & !(m << (f as u32))) | ((v & m) << (f as u32));
51                setnvalue!(res, r as f64);
52                return 1;
53            }
54        }
55    }
56
57    -1
58}