diff options
author | Vincent Ambo <mail@tazj.in> | 2022-09-01T20·50+0300 |
---|---|---|
committer | tazjin <tazjin@tvl.su> | 2022-09-08T07·59+0000 |
commit | 377ba19d75a0354c51d73dd38c4a29feefcc68e4 (patch) | |
tree | 75cc9b21752a29c5b6b35db7530540b84bb78642 /tvix/eval/src/value/attrs.rs | |
parent | 197fe37daef242596900bcab948d6fc14348f910 (diff) |
feat(tvix/eval): ensure all errors always carry a span r/4741
Previously error spans were optional because the information about code spans was not available at runtime. Now that this information has been added, the error type will always carry a span. This change is very invasive all throughout the codebase. This is due to the fact that many functions that are called *by* the VM expected to return `EvalResult`, but this no longer works as the span information is not available to those functions - only to the VM itself. To work around this the majority of these functions have been changed to return `Result<T, ErrorKind>` instead and an accompanying macro in the VM constructs the "real" error. Note that this implementatino currently has a bug where errors occuring within thunks will yield the location at which the thunk was forced, not the location at which the error occured within the code. This will be fixed soon, but the commit is large enough as is. Change-Id: Ib1ecb81a4d09d464a95ea7ea9e589f3bd08d5202 Reviewed-on: https://cl.tvl.fyi/c/depot/+/6408 Reviewed-by: sterni <sternenseemann@systemli.org> Tested-by: BuildkiteCI
Diffstat (limited to 'tvix/eval/src/value/attrs.rs')
-rw-r--r-- | tvix/eval/src/value/attrs.rs | 14 |
1 files changed, 6 insertions, 8 deletions
diff --git a/tvix/eval/src/value/attrs.rs b/tvix/eval/src/value/attrs.rs index 2954f8522097..d122f9155d2c 100644 --- a/tvix/eval/src/value/attrs.rs +++ b/tvix/eval/src/value/attrs.rs @@ -10,7 +10,7 @@ use std::collections::BTreeMap; use std::fmt::Display; use std::rc::Rc; -use crate::errors::{ErrorKind, EvalResult}; +use crate::errors::ErrorKind; use super::string::NixString; use super::Value; @@ -236,7 +236,7 @@ impl NixAttrs { /// Implement construction logic of an attribute set, to encapsulate /// logic about attribute set optimisations inside of this module. - pub fn construct(count: usize, mut stack_slice: Vec<Value>) -> EvalResult<Self> { + pub fn construct(count: usize, mut stack_slice: Vec<Value>) -> Result<Self, ErrorKind> { debug_assert!( stack_slice.len() == count * 2, "construct_attrs called with count == {}, but slice.len() == {}", @@ -342,12 +342,11 @@ fn attempt_optimise_kv(slice: &mut [Value]) -> Option<NixAttrs> { // Set an attribute on an in-construction attribute set, while // checking against duplicate keys. -fn set_attr(attrs: &mut NixAttrs, key: NixString, value: Value) -> EvalResult<()> { +fn set_attr(attrs: &mut NixAttrs, key: NixString, value: Value) -> Result<(), ErrorKind> { match attrs.0.map_mut().entry(key) { btree_map::Entry::Occupied(entry) => Err(ErrorKind::DuplicateAttrsKey { key: entry.key().as_str().to_string(), - } - .into()), + }), btree_map::Entry::Vacant(entry) => { entry.insert(value); @@ -367,7 +366,7 @@ fn set_nested_attr( key: NixString, mut path: Vec<NixString>, value: Value, -) -> EvalResult<()> { +) -> Result<(), ErrorKind> { // If there is no next key we are at the point where we // should insert the value itself. if path.is_empty() { @@ -408,8 +407,7 @@ fn set_nested_attr( _ => { return Err(ErrorKind::DuplicateAttrsKey { key: entry.key().as_str().to_string(), - } - .into()) + }) } }, } |