feat(tvix/eval): give generators human-readable names
This adds static strings to generator frames that describe the generator in a human-readable fashion, which are then logged in observers. This makes runtime traces very precise, explaining exactly what is being requested from where. Change-Id: I695659a6bd0b7b0bdee75bc8049651f62b150e0c Reviewed-on: https://cl.tvl.fyi/c/depot/+/8206 Tested-by: BuildkiteCI Reviewed-by: raitobezarius <tvl@lahfa.xyz>
This commit is contained in:
parent
dfd0066de5
commit
1e37f8b52e
5 changed files with 84 additions and 55 deletions
|
|
@ -49,16 +49,16 @@ pub trait RuntimeObserver {
|
|||
fn observe_suspend_call_frame(&mut self, _frame_at: usize, _stack: &[Value]) {}
|
||||
|
||||
/// Called when the runtime enters a generator frame.
|
||||
fn observe_enter_generator(&mut self, _frame_at: usize, _stack: &[Value]) {}
|
||||
fn observe_enter_generator(&mut self, _frame_at: usize, _name: &str, _stack: &[Value]) {}
|
||||
|
||||
/// Called when the runtime exits a generator frame.
|
||||
fn observe_exit_generator(&mut self, _frame_at: usize, _stack: &[Value]) {}
|
||||
fn observe_exit_generator(&mut self, _frame_at: usize, _name: &str, _stack: &[Value]) {}
|
||||
|
||||
/// Called when the runtime suspends a generator frame.
|
||||
fn observe_suspend_generator(&mut self, _frame_at: usize, _stack: &[Value]) {}
|
||||
fn observe_suspend_generator(&mut self, _frame_at: usize, _name: &str, _stack: &[Value]) {}
|
||||
|
||||
/// Called when a generator requests an action from the VM.
|
||||
fn observe_generator_request(&mut self, _msg: &GeneratorRequest) {}
|
||||
fn observe_generator_request(&mut self, _name: &str, _msg: &GeneratorRequest) {}
|
||||
|
||||
/// Called when the runtime replaces the current call frame for a
|
||||
/// tail call.
|
||||
|
|
@ -219,34 +219,42 @@ impl<W: Write> RuntimeObserver for TracingObserver<W> {
|
|||
self.write_stack(stack);
|
||||
}
|
||||
|
||||
fn observe_enter_generator(&mut self, frame_at: usize, stack: &[Value]) {
|
||||
fn observe_enter_generator(&mut self, frame_at: usize, name: &str, stack: &[Value]) {
|
||||
let _ = write!(
|
||||
&mut self.writer,
|
||||
"=== entering generator frame {} ===\t",
|
||||
frame_at
|
||||
"=== entering generator frame '{}' [{}] ===\t",
|
||||
name, frame_at,
|
||||
);
|
||||
|
||||
self.write_stack(stack);
|
||||
}
|
||||
|
||||
fn observe_exit_generator(&mut self, frame_at: usize, stack: &[Value]) {
|
||||
let _ = write!(&mut self.writer, "=== exiting generator {} ===\t", frame_at);
|
||||
|
||||
self.write_stack(stack);
|
||||
}
|
||||
|
||||
fn observe_suspend_generator(&mut self, frame_at: usize, stack: &[Value]) {
|
||||
fn observe_exit_generator(&mut self, frame_at: usize, name: &str, stack: &[Value]) {
|
||||
let _ = write!(
|
||||
&mut self.writer,
|
||||
"=== suspending generator {} ===\t",
|
||||
frame_at
|
||||
"=== exiting generator '{}' [{}] ===\t",
|
||||
name, frame_at
|
||||
);
|
||||
|
||||
self.write_stack(stack);
|
||||
}
|
||||
|
||||
fn observe_generator_request(&mut self, msg: &GeneratorRequest) {
|
||||
let _ = writeln!(&mut self.writer, "=== generator requested {} ===", msg);
|
||||
fn observe_suspend_generator(&mut self, frame_at: usize, name: &str, stack: &[Value]) {
|
||||
let _ = write!(
|
||||
&mut self.writer,
|
||||
"=== suspending generator '{}' [{}] ===\t",
|
||||
name, frame_at
|
||||
);
|
||||
|
||||
self.write_stack(stack);
|
||||
}
|
||||
|
||||
fn observe_generator_request(&mut self, name: &str, msg: &GeneratorRequest) {
|
||||
let _ = writeln!(
|
||||
&mut self.writer,
|
||||
"=== generator '{}' requested {} ===",
|
||||
name, msg
|
||||
);
|
||||
}
|
||||
|
||||
fn observe_enter_builtin(&mut self, name: &'static str) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue