start implementing visitors
This commit is contained in:
parent
55b4ef015b
commit
c3a7762fc8
11 changed files with 903 additions and 2016 deletions
|
|
@ -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),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
}))
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue