From 801660d74afa17b73fd4c03cd66a782693049f95 Mon Sep 17 00:00:00 2001 From: Denys Zadorozhnyi Date: Fri, 21 Jul 2023 11:27:48 +0300 Subject: [PATCH] enrich Append eval error with source span; --- ergotree-interpreter/src/eval.rs | 19 +++++++++++++++++++ ergotree-interpreter/src/eval/expr.rs | 13 ++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/ergotree-interpreter/src/eval.rs b/ergotree-interpreter/src/eval.rs index 8202cd5c3..1a5ebfcd5 100644 --- a/ergotree-interpreter/src/eval.rs +++ b/ergotree-interpreter/src/eval.rs @@ -1,6 +1,7 @@ //! Interpreter use bounded_vec::BoundedVecOutOfBounds; use ergotree_ir::mir::constant::TryExtractInto; +use ergotree_ir::mir::expr::SourceSpan; use ergotree_ir::sigma_protocol::sigma_boolean::SigmaProp; use sigma_ser::ScorexParsingError; use sigma_ser::ScorexSerializationError; @@ -163,6 +164,24 @@ pub enum EvalError { /// environment after evaluation env: Env, }, + /// Wrapped eval error with source span + #[error("eval error: {error}, source span: {source_span:?}")] + WrappedWithSpan { + /// eval error + error: Box, + /// source span + source_span: SourceSpan, + }, +} + +impl EvalError { + /// Wrap eval error with source span + pub fn wrap_with_span(self, source_span: SourceSpan) -> Self { + EvalError::WrappedWithSpan { + error: Box::new(self), + source_span, + } + } } /// Result of expression reduction procedure (see `reduce_to_crypto`). diff --git a/ergotree-interpreter/src/eval/expr.rs b/ergotree-interpreter/src/eval/expr.rs index 8929c2ed2..8dd436445 100644 --- a/ergotree-interpreter/src/eval/expr.rs +++ b/ergotree-interpreter/src/eval/expr.rs @@ -1,4 +1,5 @@ use ergotree_ir::mir::expr::Expr; +use ergotree_ir::mir::expr::SourceSpan; use ergotree_ir::mir::value::Value; use super::Env; @@ -50,7 +51,7 @@ impl Evaluable for Expr { Expr::Upcast(op) => op.eval(env, ctx), Expr::Downcast(op) => op.eval(env, ctx), Expr::If(op) => op.eval(env, ctx), - Expr::Append(op) => op.expr().eval(env, ctx), + Expr::Append(op) => op.expr().eval(env, ctx).with_span(&op.source_span), Expr::ByIndex(op) => op.eval(env, ctx), Expr::ExtractScriptBytes(op) => op.eval(env, ctx), Expr::SizeOf(op) => op.eval(env, ctx), @@ -83,3 +84,13 @@ impl Evaluable for Expr { } } } + +pub trait ExtResultEvalError { + fn with_span(self, span: &SourceSpan) -> Result; +} + +impl ExtResultEvalError for Result { + fn with_span(self, span: &SourceSpan) -> Result { + self.map_err(|e| e.wrap_with_span(span.clone())) + } +}