1+ use std:: fmt:: { self , Display } ;
2+
13use bumpalo:: { Bump , collections:: Vec } ;
24use hashbrown:: { DefaultHashBuilder , HashMap } ;
35use indexmap:: { IndexMap , IndexSet } ;
@@ -26,7 +28,7 @@ pub struct Interpreter<'a> {
2628 program_counter : usize ,
2729 registers : Registers < ' a > ,
2830 symbols : SymbolTable < ' a > ,
29- consts : IndexSet < Value > ,
31+ consts : Consts ,
3032 compat : ExecMode ,
3133}
3234
@@ -41,6 +43,9 @@ pub struct SymbolTable<'a> {
4143 // etc
4244}
4345
46+ #[ derive( Debug ) ]
47+ pub struct Consts ( pub IndexSet < Value > ) ;
48+
4449impl < ' a > Interpreter < ' a > {
4550 pub fn new ( compat : ExecMode , code : Code < ' a > ) -> Self {
4651 Self {
@@ -83,6 +88,12 @@ impl<'a> SymbolTable<'a> {
8388 }
8489}
8590
91+ impl Consts {
92+ pub fn new ( ) -> Self {
93+ Self ( IndexSet :: with_capacity ( 4 ) )
94+ }
95+ }
96+
8697impl Interpreter < ' _ > {
8798 pub fn run ( & mut self ) {
8899 while let Some ( instr) = self . bc . code . get ( self . program_counter ) {
@@ -103,7 +114,7 @@ impl Interpreter<'_> {
103114 ix if let Some ( & ( dest, src) ) = ix. get_load_store ( ) => match ix. opcode {
104115 OpCode :: LoadConst => self
105116 . registers
106- . write ( dest, self . consts . get_index ( src. 0 as _ ) . unwrap ( ) ) ,
117+ . write ( dest, self . consts . 0 . get_index ( src. 0 as _ ) . unwrap ( ) ) ,
107118 OpCode :: LoadUser => {
108119 self . registers
109120 . write ( dest, self . symbols . lookup_user_var ( src) ) ;
@@ -141,3 +152,64 @@ impl Registers<'_> {
141152 self . 0 [ dest. 0 as usize ] = Value :: clone ( src) ;
142153 }
143154}
155+
156+ impl Display for Interpreter < ' _ > {
157+ fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
158+ writeln ! ( f, "{}\n " , self . bc) ?;
159+ writeln ! ( f, "{}\n " , self . registers) ?;
160+ writeln ! ( f, "{}\n " , self . symbols) ?;
161+ write ! ( f, "{}" , self . consts)
162+ }
163+ }
164+
165+ impl Display for Code < ' _ > {
166+ fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
167+ writeln ! ( f, "{}\n " , self . bc) ?;
168+ writeln ! ( f, "{}\n " , self . symbols) ?;
169+ write ! ( f, "{}" , self . consts)
170+ }
171+ }
172+
173+ impl Display for Bytecode < ' _ > {
174+ fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
175+ write ! ( f, "Bytecode:" ) ?;
176+ let n = self . code . len ( ) . checked_ilog10 ( ) . unwrap_or ( 0 ) as usize + 1 ;
177+ fmt_list ( f, self . code . iter ( ) , |f, i, e| write ! ( f, "{i:0n$}: {e}" ) )
178+ }
179+ }
180+
181+ impl Display for Registers < ' _ > {
182+ fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
183+ write ! ( f, "Registers:" ) ?;
184+ let n = self . 0 . len ( ) . checked_ilog10 ( ) . unwrap_or ( 0 ) as usize + 1 ;
185+ fmt_list ( f, self . 0 . iter ( ) , |f, i, e| write ! ( f, "r{i:0n$} = {e:?}" ) )
186+ }
187+ }
188+
189+ impl Display for SymbolTable < ' _ > {
190+ fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
191+ write ! ( f, "Symbols:" ) ?;
192+ fmt_list ( f, self . user . iter ( ) , |f, i, ( k, v) | {
193+ write ! ( f, "user[{i}] @ {k} = {v:?}" )
194+ } )
195+ }
196+ }
197+
198+ impl Display for Consts {
199+ fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
200+ write ! ( f, "Consts:" ) ?;
201+ fmt_list ( f, self . 0 . iter ( ) , |f, i, e| write ! ( f, "mem[{i}] = {e:?}" ) )
202+ }
203+ }
204+
205+ fn fmt_list < ' a , T : Copy > (
206+ f : & mut fmt:: Formatter < ' a > ,
207+ iter : impl Iterator < Item = T > ,
208+ cb : impl Fn ( & mut fmt:: Formatter < ' a > , usize , T ) -> fmt:: Result ,
209+ ) -> fmt:: Result {
210+ for ( i, e) in iter. enumerate ( ) {
211+ write ! ( f, "\n " ) ?;
212+ cb ( f, i, e) ?;
213+ }
214+ Ok ( ( ) )
215+ }
0 commit comments