feat(tvix/eval): implement TracingObserver for runtime tracing
This produces similar output to the previous tracing feature, but can redirect the output somewhere else. Change-Id: I9493c260f480904f3932cb74809b622c24d7be96 Reviewed-on: https://cl.tvl.fyi/c/depot/+/6453 Reviewed-by: sterni <sternenseemann@systemli.org> Tested-by: BuildkiteCI
This commit is contained in:
		
							parent
							
								
									14ff889d60
								
							
						
					
					
						commit
						e03a729fa3
					
				
					 1 changed files with 54 additions and 0 deletions
				
			
		|  | @ -112,3 +112,57 @@ impl<W: Write> Observer for DisassemblingObserver<W> { | |||
|         let _ = self.writer.flush(); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| /// An observer that collects a textual representation of an entire
 | ||||
| /// runtime execution.
 | ||||
| pub struct TracingObserver<W: Write> { | ||||
|     writer: TabWriter<W>, | ||||
| } | ||||
| 
 | ||||
| impl<W: Write> TracingObserver<W> { | ||||
|     pub fn new(writer: W) -> Self { | ||||
|         Self { | ||||
|             writer: TabWriter::new(writer), | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl<W: Write> Observer for TracingObserver<W> { | ||||
|     fn observe_enter_frame(&mut self, arg_count: usize, lambda: &Rc<Lambda>, call_depth: usize) { | ||||
|         let _ = writeln!( | ||||
|             &mut self.writer, | ||||
|             "=== entering {} frame[{}] @ {:p} ===", | ||||
|             if arg_count == 0 { "thunk" } else { "closure" }, | ||||
|             call_depth, | ||||
|             lambda, | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     fn observe_exit_frame(&mut self, frame_at: usize) { | ||||
|         let _ = writeln!(&mut self.writer, "=== exiting frame {} ===", frame_at); | ||||
|     } | ||||
| 
 | ||||
|     fn observe_enter_builtin(&mut self, name: &'static str) { | ||||
|         let _ = writeln!(&mut self.writer, "=== entering builtin {} ===", name); | ||||
|     } | ||||
| 
 | ||||
|     fn observe_exit_builtin(&mut self, name: &'static str) { | ||||
|         let _ = writeln!(&mut self.writer, "=== exiting builtin {} ===", name); | ||||
|     } | ||||
| 
 | ||||
|     fn observe_execute_op(&mut self, ip: usize, op: &OpCode, stack: &[Value]) { | ||||
|         let _ = write!(&mut self.writer, "{:04} {:?}\t[ ", ip, op); | ||||
| 
 | ||||
|         for val in stack { | ||||
|             let _ = write!(&mut self.writer, "{} ", val); | ||||
|         } | ||||
| 
 | ||||
|         let _ = writeln!(&mut self.writer, "]"); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl<W: Write> Drop for TracingObserver<W> { | ||||
|     fn drop(&mut self) { | ||||
|         let _ = self.writer.flush(); | ||||
|     } | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue