Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore(blockifier): add with_attr error message #624

Merged
merged 2 commits into from
Aug 29, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -792,7 +792,26 @@
"L1_HANDLER": []
},
"program": {
"attributes": [],
"attributes": [
{
"accessible_scopes": [
"__main__",
"__main__",
"__main__.fail"
],
"end_pc": 1186,
"flow_tracking_data": {
"ap_tracking": {
"group": 95,
"offset": 0
},
"reference_ids": {}
},
"name": "error_message",
"start_pc": 1182,
"value": "You shall not pass!"
}
],
"builtins": [
"pedersen",
"range_check",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -274,7 +274,9 @@ func invoke_call_chain{syscall_ptr: felt*}(calldata_len: felt, calldata: felt*)

@external
func fail() {
assert 0 = 1;
with_attr error_message("You shall not pass!") {
assert 0 = 1;
}
return ();
}

Expand Down
16 changes: 13 additions & 3 deletions crates/blockifier/src/execution/stack_trace.rs
Original file line number Diff line number Diff line change
Expand Up @@ -66,18 +66,24 @@ impl From<&EntryPointErrorFrame> for String {

pub struct VmExceptionFrame {
pc: Relocatable,
error_attr_value: Option<String>,
traceback: Option<String>,
}

impl From<&VmExceptionFrame> for String {
fn from(value: &VmExceptionFrame) -> Self {
let error_msg = match &value.error_attr_value {
Some(error_msg) => error_msg.clone(),
None => String::new(),
};
let vm_exception_preamble = format!("Error at pc={}:", value.pc);
let vm_exception_traceback = if let Some(traceback) = &value.traceback {
format!("\n{}", traceback)
} else {
"".to_string()
};
format!("{vm_exception_preamble}{vm_exception_traceback}")
// TODO(Aner): add test for error message in intermediate call"
format!("{error_msg}{vm_exception_preamble}{vm_exception_traceback}")
}
}

Expand Down Expand Up @@ -217,8 +223,12 @@ fn extract_cairo_run_error_into_stack_trace(
) {
if let CairoRunError::VmException(vm_exception) = error {
error_stack.push(
VmExceptionFrame { pc: vm_exception.pc, traceback: vm_exception.traceback.clone() }
.into(),
VmExceptionFrame {
pc: vm_exception.pc,
error_attr_value: vm_exception.error_attr_value.clone(),
traceback: vm_exception.traceback.clone(),
}
.into(),
);
extract_virtual_machine_error_into_stack_trace(error_stack, depth, &vm_exception.inner_exc);
} else {
Expand Down
13 changes: 11 additions & 2 deletions crates/blockifier/src/execution/stack_trace_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,7 @@ Unknown location (pc=0:{entry_point_location})

2: Error in the called contract (contract address: {test_contract_address_2_felt:#064x}, class \
hash: {test_contract_hash:#064x}, selector: {inner_entry_point_selector_felt:#064x}):
Error message: You shall not pass!
Error at pc=0:1184:
Cairo traceback (most recent call last):
Unknown location (pc=0:1188)
Expand Down Expand Up @@ -160,6 +161,10 @@ fn test_trace_callchain_ends_with_regular_call(
#[case] expected_error: &str,
#[case] expected_pc_locations: (u16, u16),
) {
let expected_with_attr_error_msg = match (cairo_version, last_func_name) {
(CairoVersion::Cairo0, "fail") => "Error message: You shall not pass!\n".to_string(),
_ => String::new(),
};
let chain_info = ChainInfo::create_for_testing();
let account_contract = FeatureContract::AccountWithoutValidations(cairo_version);
let test_contract = FeatureContract::TestContract(cairo_version);
Expand Down Expand Up @@ -234,7 +239,7 @@ Unknown location (pc=0:{entry_point_location})

2: Error in the called contract (contract address: {contract_address_felt:#064x}, class hash: \
{test_contract_hash:#064x}, selector: {invoke_call_chain_selector_felt:#064x}):
Error at pc=0:{expected_pc0}:
{expected_with_attr_error_msg}Error at pc=0:{expected_pc0}:
Cairo traceback (most recent call last):
Unknown location (pc=0:{call_location})
Unknown location (pc=0:{expected_pc1})
Expand Down Expand Up @@ -285,6 +290,10 @@ fn test_trace_call_chain_with_syscalls(
#[case] call_type: u8,
#[case] expected_pcs: (u16, u16, u16, u16),
) {
let expected_with_attr_error_msg = match (cairo_version, last_func_name) {
(CairoVersion::Cairo0, "fail") => "Error message: You shall not pass!\n".to_string(),
_ => String::new(),
};
let chain_info = ChainInfo::create_for_testing();
let account_contract = FeatureContract::AccountWithoutValidations(cairo_version);
let test_contract = FeatureContract::TestContract(cairo_version);
Expand Down Expand Up @@ -387,7 +396,7 @@ Unknown location (pc=0:{call_location})
Unknown location (pc=0:{expected_pc1})

3: {last_call_preamble}:
Error at pc=0:{expected_pc2}:
{expected_with_attr_error_msg}Error at pc=0:{expected_pc2}:
Cairo traceback (most recent call last):
Unknown location (pc=0:{expected_pc3})

Expand Down
Loading