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