mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-29 06:44:46 +00:00
wasm_interp: Add --debug flag
This commit is contained in:
parent
3d756a8fff
commit
9d77c474d9
4 changed files with 94 additions and 22 deletions
|
@ -146,6 +146,36 @@ impl<'a> ValueStack<'a> {
|
|||
_ => panic!("Expected F64 but value stack was empty"),
|
||||
}
|
||||
}
|
||||
|
||||
fn fmt_from_index(
|
||||
&self,
|
||||
f: &mut std::fmt::Formatter<'_>,
|
||||
from_index: usize,
|
||||
) -> std::fmt::Result {
|
||||
write!(f, "[")?;
|
||||
let mut bytes_index = 0;
|
||||
assert_eq!(self.is_64.len(), self.is_float.len());
|
||||
if from_index < self.is_64.len() {
|
||||
let iter_64 = self.is_64.iter().by_vals();
|
||||
let iter_float = self.is_float.iter().by_vals();
|
||||
for (i, (is_64, is_float)) in iter_64.zip(iter_float).enumerate() {
|
||||
if i < from_index {
|
||||
continue;
|
||||
}
|
||||
let value = self.get(is_64, is_float, bytes_index);
|
||||
bytes_index += if is_64 { 8 } else { 4 };
|
||||
value.fmt(f)?;
|
||||
if i < self.is_64.len() - 1 {
|
||||
write!(f, ", ")?;
|
||||
}
|
||||
}
|
||||
}
|
||||
write!(f, "]")
|
||||
}
|
||||
|
||||
pub fn get_slice<'b>(&'b self, index: usize) -> ValueStackSlice<'a, 'b> {
|
||||
ValueStackSlice { stack: self, index }
|
||||
}
|
||||
}
|
||||
|
||||
fn type_from_flags(is_float: bool, is_64: bool) -> ValueType {
|
||||
|
@ -159,20 +189,18 @@ fn type_from_flags(is_float: bool, is_64: bool) -> ValueType {
|
|||
|
||||
impl Debug for ValueStack<'_> {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
write!(f, "[")?;
|
||||
let mut index = 0;
|
||||
assert_eq!(self.is_64.len(), self.is_float.len());
|
||||
let iter_64 = self.is_64.iter().by_vals();
|
||||
let iter_float = self.is_float.iter().by_vals();
|
||||
for (i, (is_64, is_float)) in iter_64.zip(iter_float).enumerate() {
|
||||
let value = self.get(is_64, is_float, index);
|
||||
index += if is_64 { 8 } else { 4 };
|
||||
value.fmt(f)?;
|
||||
if i < self.is_64.len() - 1 {
|
||||
write!(f, ", ")?;
|
||||
}
|
||||
}
|
||||
write!(f, "]")
|
||||
self.fmt_from_index(f, 0)
|
||||
}
|
||||
}
|
||||
|
||||
pub struct ValueStackSlice<'a, 'b> {
|
||||
stack: &'b ValueStack<'a>,
|
||||
index: usize,
|
||||
}
|
||||
|
||||
impl Debug for ValueStackSlice<'_, '_> {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
self.stack.fmt_from_index(f, self.index)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue