1
- #[ derive( Clone , PartialEq , Eq , Debug ) ]
1
+ use salsa:: DebugWithDb ;
2
+
3
+ #[ derive( Clone , Debug , PartialEq , Eq ) ]
2
4
pub enum Code {
3
5
Return ,
4
6
Constant ( eq_float:: F64 ) ,
@@ -43,11 +45,69 @@ pub enum Code {
43
45
} ,
44
46
}
45
47
48
+ impl < ' db > DebugWithDb < dyn crate :: Db + ' db > for Code {
49
+ fn fmt (
50
+ & self ,
51
+ f : & mut std:: fmt:: Formatter < ' _ > ,
52
+ db : & dyn crate :: Db ,
53
+ _include_all_fields : bool ,
54
+ ) -> std:: fmt:: Result {
55
+ match self {
56
+ Code :: Return => write ! ( f, "return" ) ,
57
+ Code :: Constant ( c) => write ! ( f, "constant({})" , c) ,
58
+ Code :: True => write ! ( f, "true" ) ,
59
+ Code :: False => write ! ( f, "false" ) ,
60
+ Code :: Add => write ! ( f, "add" ) ,
61
+ Code :: Subtract => write ! ( f, "subtract" ) ,
62
+ Code :: Multiply => write ! ( f, "multiply" ) ,
63
+ Code :: Divide => write ! ( f, "divide" ) ,
64
+ Code :: Negate => write ! ( f, "negate" ) ,
65
+ Code :: Not => write ! ( f, "not" ) ,
66
+ Code :: Equal => write ! ( f, "equal" ) ,
67
+ Code :: NotEqual => write ! ( f, "not_equal" ) ,
68
+ Code :: Greater => write ! ( f, "greater" ) ,
69
+ Code :: GreaterEqual => write ! ( f, "greater_equal" ) ,
70
+ Code :: Less => write ! ( f, "less" ) ,
71
+ Code :: LessEqual => write ! ( f, "less_equal" ) ,
72
+ Code :: String ( s) => write ! ( f, "string({:?})" , s) ,
73
+ Code :: Print => write ! ( f, "print" ) ,
74
+ Code :: GlobalVarDeclaration { name } => write ! ( f, "global_var_declaration({})" , name) ,
75
+ Code :: ReadGlobalVariable { name } => write ! ( f, "read_global_variable({})" , name) ,
76
+ Code :: ReadLocalVariable { index_in_stack } => {
77
+ write ! ( f, "read_local_variable({})" , index_in_stack)
78
+ }
79
+ Code :: Nil => write ! ( f, "nil" ) ,
80
+ Code :: WriteGlobalVariable { name } => write ! ( f, "write_global_variable({})" , name) ,
81
+ Code :: WriteLocalVariable { index_in_stack } => {
82
+ write ! ( f, "write_local_variable({})" , index_in_stack)
83
+ }
84
+ Code :: Pop => write ! ( f, "pop" ) ,
85
+ Code :: JumpIfFalse ( ip) => write ! ( f, "jump_if_false({})" , ip) ,
86
+ Code :: Jump ( ip) => write ! ( f, "jump({})" , ip) ,
87
+ Code :: Function ( function) => write ! ( f, "function({:?})" , & function. debug( db) ) ,
88
+ Code :: Call { arity } => write ! ( f, "call({})" , arity) ,
89
+ }
90
+ }
91
+ }
92
+
46
93
#[ derive( PartialEq , Eq , Debug , Clone , Default ) ]
47
94
pub struct Chunk {
48
95
code : Vec < Code > ,
49
96
}
50
97
98
+ impl < ' db > DebugWithDb < dyn crate :: Db + ' db > for Chunk {
99
+ fn fmt (
100
+ & self ,
101
+ f : & mut std:: fmt:: Formatter < ' _ > ,
102
+ db : & dyn crate :: Db ,
103
+ _include_all_fields : bool ,
104
+ ) -> std:: fmt:: Result {
105
+ f. debug_list ( )
106
+ . entries ( self . code . iter ( ) . map ( |c| c. debug ( db) ) )
107
+ . finish ( )
108
+ }
109
+ }
110
+
51
111
impl Chunk {
52
112
pub fn emit_byte ( & mut self , byte : Code ) -> usize {
53
113
tracing:: debug!( ?byte, "emitting byte" ) ;
@@ -72,9 +132,23 @@ impl Chunk {
72
132
}
73
133
}
74
134
75
- #[ derive( PartialEq , Eq , Debug , Clone , Default ) ]
135
+ #[ derive( PartialEq , Eq , Clone , Debug , Default ) ]
76
136
pub struct CompiledFunction {
77
137
pub name : String ,
78
138
pub arity : usize ,
79
139
pub chunk : Chunk ,
80
140
}
141
+
142
+ impl DebugWithDb < dyn crate :: Db > for CompiledFunction {
143
+ fn fmt (
144
+ & self ,
145
+ f : & mut std:: fmt:: Formatter < ' _ > ,
146
+ db : & dyn crate :: Db ,
147
+ _include_all_fields : bool ,
148
+ ) -> std:: fmt:: Result {
149
+ f. debug_struct ( "Function" )
150
+ . field ( "name" , & self . name )
151
+ . field ( "chunk" , & self . chunk . debug ( db) )
152
+ . finish ( )
153
+ }
154
+ }
0 commit comments