start implementing visitors

This commit is contained in:
Jean-Marie Mineau 2024-07-10 17:34:51 +02:00
parent 55b4ef015b
commit c3a7762fc8
Signed by: histausse
GPG key ID: B66AEEDA9B645AD2
11 changed files with 903 additions and 2016 deletions

View file

@ -33,6 +33,7 @@ impl std::fmt::Display for Error {
Self::DeserializationError(msg) => write!(f, "{}", msg),
Self::InvalidStringEncoding(msg) => write!(f, "{}", msg),
Self::InconsistantStruct(msg) => write!(f, "{}", msg),
Self::OutOfBound(msg) => write!(f, "{}", msg),
}
}
}

View file

@ -351,25 +351,29 @@ impl<'a> DebugStateMachine<'a> {
Ok(self.debug_info.bytecode[self.pc])
}
pub fn tick(&mut self) -> Result<Option<DebugInfo>> {
let ins = self.get_ins()?;
pub fn tick(&mut self) -> Option<DebugInfo> {
let ins = if let Ok(ins) = self.get_ins() {
ins
} else {
return Some(DebugInfo::EndOfData);
};
self.pc += 1;
match ins {
DbgBytecode::EndSequence => {
self.pc = self.debug_info.bytecode.len();
Ok(Some(DebugInfo::EndOfData))
Some(DebugInfo::EndOfData)
}
DbgBytecode::AdvancePC {
addr_diff: Uleb128(addr_diff),
} => {
self.address += addr_diff;
Ok(None)
None
}
DbgBytecode::AdvanceLine {
line_diff: Sleb128(line_diff),
} => {
self.line = (self.line as i32 + line_diff) as u32;
Ok(None)
None
}
DbgBytecode::StartLocal {
register_num: Uleb128(register_num),
@ -398,11 +402,11 @@ impl<'a> DebugStateMachine<'a> {
sig_idx: None,
in_scope: true,
};
Ok(Some(DebugInfo::DefLocal {
Some(DebugInfo::DefLocal {
addr: self.address,
reg: register_num,
val: self.register_states[register_num as usize],
}))
})
}
DbgBytecode::StartLocalExtended {
register_num: Uleb128(register_num),
@ -436,20 +440,20 @@ impl<'a> DebugStateMachine<'a> {
},
in_scope: true,
};
Ok(Some(DebugInfo::DefLocal {
Some(DebugInfo::DefLocal {
addr: self.address,
reg: register_num,
val: self.register_states[register_num as usize],
}))
})
}
DbgBytecode::EndLocal {
register_num: Uleb128(register_num),
} => {
self.register_states[register_num as usize].in_scope = false;
Ok(Some(DebugInfo::EndLocal {
Some(DebugInfo::EndLocal {
addr: self.address,
reg: register_num,
}))
})
}
DbgBytecode::RestartLocal {
register_num: Uleb128(register_num),
@ -463,35 +467,35 @@ impl<'a> DebugStateMachine<'a> {
})
}
self.register_states[register_num as usize].in_scope = true;
Ok(Some(DebugInfo::DefLocal {
Some(DebugInfo::DefLocal {
addr: self.address,
reg: register_num,
val: self.register_states[register_num as usize],
}))
})
}
DbgBytecode::SetPrologueEnd => {
//self.prologue_end = true;
Ok(Some(DebugInfo::PrologueEnd { addr: self.address }))
Some(DebugInfo::PrologueEnd { addr: self.address })
}
DbgBytecode::SetEpilogueBegin => {
//self.epilogue_begin = true;
Ok(Some(DebugInfo::EpilogueBegin { addr: self.address }))
Some(DebugInfo::EpilogueBegin { addr: self.address })
}
DbgBytecode::SetFile { name_idx: NO_INDEX } => {
//self.source_file_idx = None;
Ok(Some(DebugInfo::SetSourceFile {
Some(DebugInfo::SetSourceFile {
addr: self.address,
source_file_idx: None,
}))
})
}
DbgBytecode::SetFile {
name_idx: Uleb128p1(name_idx),
} => {
//self.source_file_idx = Some(name_idx);
Ok(Some(DebugInfo::SetSourceFile {
Some(DebugInfo::SetSourceFile {
addr: self.address,
source_file_idx: Some(name_idx),
}))
})
}
DbgBytecode::SpecialOpcode(op) => {
//if op >= 0x0a {
@ -502,10 +506,10 @@ impl<'a> DebugStateMachine<'a> {
let adjusted_opcode = op as u32 - 0x0a;
self.line = (self.line as i32 + (adjusted_opcode as i32 % 15) - 4) as u32;
self.address += adjusted_opcode / 15;
Ok(Some(DebugInfo::SetLineNumber {
Some(DebugInfo::SetLineNumber {
addr: self.address,
line_num: self.line,
}))
})
}
}
}