hex_patch/app/plugins/
instruction_info.rs1use 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}