-
Notifications
You must be signed in to change notification settings - Fork 158
/
debug.rs
61 lines (54 loc) · 2.03 KB
/
debug.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
use core::fmt;
use crate::ast::{ImmU16, ImmU32, ImmU8};
// DEBUG OPTIONS
// ================================================================================================
/// A proxy for [vm_core::DebugOptions], but with [super::Immediate] values.
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum DebugOptions {
StackAll,
StackTop(ImmU8),
MemAll,
MemInterval(ImmU32, ImmU32),
LocalInterval(ImmU16, ImmU16),
LocalRangeFrom(ImmU16),
LocalAll,
}
impl crate::prettier::PrettyPrint for DebugOptions {
fn render(&self) -> crate::prettier::Document {
crate::prettier::display(self)
}
}
impl TryFrom<DebugOptions> for vm_core::DebugOptions {
type Error = ();
fn try_from(options: DebugOptions) -> Result<Self, Self::Error> {
match options {
DebugOptions::StackAll => Ok(Self::StackAll),
DebugOptions::StackTop(ImmU8::Value(n)) => Ok(Self::StackTop(n.into_inner())),
DebugOptions::MemAll => Ok(Self::MemAll),
DebugOptions::MemInterval(ImmU32::Value(start), ImmU32::Value(end)) => {
Ok(Self::MemInterval(start.into_inner(), end.into_inner()))
},
DebugOptions::LocalInterval(ImmU16::Value(start), ImmU16::Value(end)) => {
let start = start.into_inner();
let end = end.into_inner();
Ok(Self::LocalInterval(start, end, end - start))
},
_ => Err(()),
}
}
}
impl fmt::Display for DebugOptions {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::StackAll => write!(f, "stack"),
Self::StackTop(n) => write!(f, "stack.{n}"),
Self::MemAll => write!(f, "mem"),
Self::MemInterval(n, m) => write!(f, "mem.{n}.{m}"),
Self::LocalAll => write!(f, "local"),
Self::LocalRangeFrom(start) => write!(f, "local.{start}"),
Self::LocalInterval(start, end) => {
write!(f, "local.{start}.{end}")
},
}
}
}