use miden_core::mast::MastForest;
use crate::{
ExecutionError, Host,
continuation_stack::{Continuation, ContinuationStack},
errors::{OperationError, procedure_not_found_with_context},
};
pub(super) fn maybe_use_caller_error_context(
original_err: ExecutionError,
current_forest: &MastForest,
continuation_stack: &ContinuationStack,
host: &mut impl Host,
) -> ExecutionError {
let root_digest = match &original_err {
ExecutionError::ProcedureNotFound { root_digest, .. } => *root_digest,
ExecutionError::OperationError {
err: OperationError::MalformedMastForestInHost { root_digest },
..
} => *root_digest,
_ => return original_err,
};
let Some(top_continuation) = continuation_stack.peek_continuation() else {
return original_err;
};
let parent_node_id = match top_continuation {
Continuation::FinishCall(parent_node_id)
| Continuation::FinishJoin(parent_node_id)
| Continuation::FinishSplit(parent_node_id)
| Continuation::FinishLoop { node_id: parent_node_id, .. } => parent_node_id,
_ => return original_err,
};
match &original_err {
ExecutionError::ProcedureNotFound { .. } => {
procedure_not_found_with_context(root_digest, current_forest, *parent_node_id, host)
},
ExecutionError::OperationError { err, .. } => {
err.clone().with_context(current_forest, *parent_node_id, host)
},
_ => original_err,
}
}