mirror of
https://github.com/fluencelabs/aquavm
synced 2025-04-25 15:22:18 +00:00
feat(air-test-utils): print_trace
prints values (#633)
As traces contain CIDs for calls and canons, one cannot easily see values produced. Print them for convenience.
This commit is contained in:
parent
531956b9ba
commit
c530c93fcb
@ -137,15 +137,70 @@ macro_rules! assert_next_pks {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn print_trace(result: &RawAVMOutcome, trace_name: &str) {
|
pub fn print_trace(result: &RawAVMOutcome, trace_name: &str) {
|
||||||
let trace = trace_from_result(result);
|
let data = data_from_result(result);
|
||||||
|
let trace = &data.trace;
|
||||||
|
|
||||||
println!("trace {} (states_count: {}): [", trace_name, trace.len());
|
println!("trace {} (states_count: {}): [", trace_name, trace.len());
|
||||||
for (id, state) in trace.iter().enumerate() {
|
for (id, state) in trace.iter().enumerate() {
|
||||||
println!(" {id}: {state}");
|
print!(" {id}: {state}");
|
||||||
|
match state {
|
||||||
|
ExecutedState::Call(call_result) => print_call_value(&data, call_result),
|
||||||
|
ExecutedState::Canon(CanonResult(canon_cid)) => print_canon_values(&data, canon_cid),
|
||||||
|
ExecutedState::Par(_) | ExecutedState::Fold(_) | ExecutedState::Ap(_) => {}
|
||||||
|
}
|
||||||
|
println!();
|
||||||
}
|
}
|
||||||
println!("]");
|
println!("]");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn print_call_value(data: &InterpreterData, call_result: &CallResult) {
|
||||||
|
let service_result_cid = match call_result {
|
||||||
|
CallResult::Executed(ValueRef::Unused(_)) | CallResult::RequestSentBy(_) => return,
|
||||||
|
CallResult::Executed(ValueRef::Scalar(cid)) => cid,
|
||||||
|
CallResult::Executed(ValueRef::Stream { cid, .. }) => cid,
|
||||||
|
CallResult::Failed(cid) => cid,
|
||||||
|
};
|
||||||
|
|
||||||
|
let service_result = data
|
||||||
|
.cid_info
|
||||||
|
.service_result_store
|
||||||
|
.get(service_result_cid)
|
||||||
|
.unwrap_or_else(|| panic!("service result CID not found: {:?}", service_result_cid));
|
||||||
|
let value = data
|
||||||
|
.cid_info
|
||||||
|
.value_store
|
||||||
|
.get(&service_result.value_cid)
|
||||||
|
.unwrap_or_else(|| panic!("value CID not found: {:?}", service_result.value_cid));
|
||||||
|
print!(" => {:#?}", value);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn print_canon_values(
|
||||||
|
data: &InterpreterData,
|
||||||
|
canon_result_cid: &std::rc::Rc<air_interpreter_cid::CID<CanonResultCidAggregate>>,
|
||||||
|
) {
|
||||||
|
let canon_agg = data
|
||||||
|
.cid_info
|
||||||
|
.canon_result_store
|
||||||
|
.get(canon_result_cid)
|
||||||
|
.unwrap_or_else(|| panic!("canon result CID not found: {:?}", canon_result_cid));
|
||||||
|
let canon_vals: Vec<_> = canon_agg
|
||||||
|
.values
|
||||||
|
.iter()
|
||||||
|
.map(|elt_cid| {
|
||||||
|
let elt = data
|
||||||
|
.cid_info
|
||||||
|
.canon_element_store
|
||||||
|
.get(elt_cid)
|
||||||
|
.unwrap_or_else(|| panic!("canon element CID not found: {:?}", elt_cid));
|
||||||
|
data.cid_info
|
||||||
|
.value_store
|
||||||
|
.get(&elt.value)
|
||||||
|
.unwrap_or_else(|| panic!("value CID not found: {:?}", elt.value));
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
print!(" => {:?}", canon_vals)
|
||||||
|
}
|
||||||
|
|
||||||
#[macro_export]
|
#[macro_export]
|
||||||
macro_rules! rc {
|
macro_rules! rc {
|
||||||
($expr:expr) => {
|
($expr:expr) => {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user