luaur_vm/functions/
int_64_replace.rs1use crate::functions::lua_l_checkinteger_64::lua_l_checkinteger_64;
2use crate::functions::lua_l_optinteger_64::lua_l_optinteger_64;
3use crate::functions::lua_pushinteger_64::lua_pushinteger_64;
4use crate::macros::lua_l_argcheck::luaL_argcheck;
5use crate::macros::lua_l_error::luaL_error;
6use crate::type_aliases::lua_state::LuaState;
7
8pub unsafe fn int64_replace(l: *mut LuaState) -> core::ffi::c_int {
11 let n = lua_l_checkinteger_64(l, 1);
12 let r = lua_l_checkinteger_64(l, 2);
13 let f = lua_l_checkinteger_64(l, 3);
14 let w = lua_l_optinteger_64(l, 4, 1);
15
16 luaL_argcheck!(l, 0 <= f && f <= 63, 3, "field cannot be negative");
17 luaL_argcheck!(l, 0 < w, 4, "width must be positive");
18 if f + w > 64 {
19 luaL_error!(l, "trying to access non-existent bits");
20 }
21
22 let base_mask = 0xFFFFFFFFFFFFFFFFu64 >> (64 - w as u32);
23 let replacement = ((r as u64) & base_mask) << (f as u32);
24 let mask = 0xFFFFFFFFFFFFFFFFu64 ^ (base_mask << (f as u32));
25 lua_pushinteger_64(l, (((n as u64) & mask) | replacement) as i64);
26
27 1
28}