Skip to main content

luaur_code_gen/methods/
assembly_builder_x_64_bytes.rs

1use crate::enums::size_x_64::SizeX64;
2use crate::records::assembly_builder_x_64::AssemblyBuilderX64;
3use crate::records::operand_x_64::OperandX64;
4use crate::records::register_x_64::RegisterX64;
5
6impl AssemblyBuilderX64 {
7    pub fn bytes(
8        &mut self,
9        ptr: *const core::ffi::c_void,
10        size: usize,
11        align: usize,
12    ) -> OperandX64 {
13        let pos = {
14            // AssemblyBuilderX64::bytes in C++ calls a private helper `allocateData`.
15            // In Rust, that helper is currently not available as a method on this type.
16            // Fall back to the known layout/fields on AssemblyBuilderX64 to preserve behavior.
17            if self.data_pos < size {
18                let old_size = self.data.len();
19                self.data.resize(self.data.len() * 2, 0);
20
21                unsafe {
22                    core::ptr::copy_nonoverlapping(
23                        self.data.as_ptr(),
24                        self.data.as_mut_ptr().add(old_size),
25                        old_size,
26                    );
27                    core::ptr::write_bytes(self.data.as_mut_ptr(), 0, old_size);
28                }
29
30                self.data_pos += old_size;
31            }
32
33            self.data_pos = (self.data_pos - size) & !(align - 1);
34            self.data_pos
35        };
36
37        unsafe {
38            core::ptr::copy_nonoverlapping(ptr as *const u8, self.data.as_mut_ptr().add(pos), size);
39        }
40
41        OperandX64::operand_x_64_size_x_64_register_x_64_u8_register_x_64_i32(
42            SizeX64::none,
43            RegisterX64::noreg,
44            1,
45            RegisterX64::rip,
46            (pos as i32) - (self.data.len() as i32),
47        )
48    }
49}