hex_patch/app/plugins/
instruction_info.rs

1use mlua::UserData;
2
3use crate::app::asm::assembly_line::AssemblyLine;
4
5#[derive(Debug, Clone)]
6pub struct InstructionInfo {
7    pub instruction: String,
8    pub physical_address: u64,
9    pub virtual_address: u64,
10    pub size: usize,
11}
12
13impl InstructionInfo {
14    pub fn new(
15        instruction: impl Into<String>,
16        physical_address: u64,
17        virtual_address: u64,
18        size: usize,
19    ) -> Self {
20        Self {
21            instruction: instruction.into(),
22            physical_address,
23            virtual_address,
24            size,
25        }
26    }
27}
28
29impl From<&AssemblyLine> for InstructionInfo {
30    fn from(value: &AssemblyLine) -> Self {
31        match value {
32            AssemblyLine::Instruction(i) => InstructionInfo::new(
33                i.instruction.to_string(),
34                i.file_address,
35                i.instruction.ip(),
36                i.instruction.len(),
37            ),
38            AssemblyLine::SectionTag(s) => InstructionInfo::new(
39                format!(".{}:", s.name),
40                s.file_address,
41                s.virtual_address,
42                s.size,
43            ),
44        }
45    }
46}
47
48impl UserData for InstructionInfo {
49    fn add_fields<'lua, F: mlua::UserDataFields<Self>>(fields: &mut F) {
50        fields.add_field_method_get("instruction", |_lua, this| Ok(this.instruction.clone()));
51        fields.add_field_method_get("physical_address", |_lua, this| Ok(this.physical_address));
52        fields.add_field_method_get("virtual_address", |_lua, this| Ok(this.virtual_address));
53        fields.add_field_method_get("size", |_lua, this| Ok(this.size));
54    }
55}