Skip to content

Commit 567d88e

Browse files
committed
Merge #293: Track dbg! calls
2806157 Track dbg! calls (Michael Zaikin) Pull request description: This PR extends the `ExecTracker` trait to support tracking debug calls (identity nodes generated by `dbg!` macro in Simfony). It is enabled by feature `debug` to avoid the decoding overhead by default. Ported from https://github.com/uncomputable/simfony-webide/blob/adb60d4e60c0d6b019ea13f64b1a166da3467d8d/src/function.rs#L144 Example of usage: https://github.com/keep-starknet-strange/stark-symphony/blob/37b0a1892c69ea3b0f2d1c8088563e7fae7c3825/simfony-cli/src/tracker.rs#L65 Sample output ![image](https://github.com/user-attachments/assets/af1b0ac1-0ad7-4354-8a4d-e0ce1fb82050) ACKs for top commit: apoelstra: ACK 2806157; successfully ran local tests Tree-SHA512: e4382691fdf8914e10e19f53d34e399b4ed8b5d8276343f1b0907df765e4078438563dd54b62a9cfb4adbcbdb1aa7d27cc2ba874dba63d45e27981dda98907d3
2 parents d07f6bd + 2806157 commit 567d88e

File tree

1 file changed

+33
-1
lines changed

1 file changed

+33
-1
lines changed

src/bit_machine/mod.rs

+33-1
Original file line numberDiff line numberDiff line change
@@ -347,11 +347,24 @@ impl BitMachine {
347347
call_stack.push(CallStack::Goto(left));
348348
}
349349
node::Inner::Case(..) | node::Inner::AssertL(..) | node::Inner::AssertR(..) => {
350-
let choice_bit = self.read[self.read.len() - 1].peek_bit(&self.data);
350+
let in_frame = &self.read[self.read.len() - 1];
351+
let choice_bit: bool = in_frame.peek_bit(&self.data);
351352

352353
let (sum_a_b, _c) = ip.arrow().source.as_product().unwrap();
353354
let (a, b) = sum_a_b.as_sum().unwrap();
354355

356+
if tracker.is_track_debug_enabled() {
357+
if let node::Inner::AssertL(_, cmr) = ip.inner() {
358+
let mut bits = in_frame.as_bit_iter(&self.data);
359+
// Skips 1 + max(a.bit_width, b.bit_width) - a.bit_width
360+
bits.nth(a.pad_left(b))
361+
.expect("AssertL: unexpected end of frame");
362+
let value = Value::from_padded_bits(&mut bits, _c)
363+
.expect("AssertL: decode `C` value");
364+
tracker.track_dbg_call(cmr, value);
365+
}
366+
}
367+
355368
match (ip.inner(), choice_bit) {
356369
(node::Inner::Case(_, right), true)
357370
| (node::Inner::AssertR(_, right), true) => {
@@ -545,6 +558,12 @@ pub trait ExecTracker<J: Jet> {
545558
output_buffer: &[UWORD],
546559
success: bool,
547560
);
561+
562+
/// Track the potential execution of a `dbg!` call with the given `cmr` and `value`.
563+
fn track_dbg_call(&mut self, cmr: &Cmr, value: Value);
564+
565+
/// Check if tracking debug calls is enabled.
566+
fn is_track_debug_enabled(&self) -> bool;
548567
}
549568

550569
/// Tracker of executed left and right branches for each case node.
@@ -580,6 +599,12 @@ impl<J: Jet> ExecTracker<J> for SetTracker {
580599
}
581600

582601
fn track_jet_call(&mut self, _: &J, _: &[UWORD], _: &[UWORD], _: bool) {}
602+
603+
fn track_dbg_call(&mut self, _: &Cmr, _: Value) {}
604+
605+
fn is_track_debug_enabled(&self) -> bool {
606+
false
607+
}
583608
}
584609

585610
impl<J: Jet> ExecTracker<J> for NoTracker {
@@ -588,6 +613,13 @@ impl<J: Jet> ExecTracker<J> for NoTracker {
588613
fn track_right(&mut self, _: Ihr) {}
589614

590615
fn track_jet_call(&mut self, _: &J, _: &[UWORD], _: &[UWORD], _: bool) {}
616+
617+
fn track_dbg_call(&mut self, _: &Cmr, _: Value) {}
618+
619+
fn is_track_debug_enabled(&self) -> bool {
620+
// Set flag to test frame decoding in unit tests
621+
cfg!(test)
622+
}
591623
}
592624

593625
/// Errors related to simplicity Execution

0 commit comments

Comments
 (0)