fix(tvix/eval): thread thunk forcing errors through correctly
With this, if an error occurs while forcing a thunk (which is very likely) it is threaded through to the top by wrapping it in the ErrorKind::ThunkForce variant. We could use this to generate "stacktrace-like" error output if we wanted, or simply jump through and discard everything except the innermost error. Change-Id: I3c1c8708c2f73ae062815adf490ce935b1979da8 Reviewed-on: https://cl.tvl.fyi/c/depot/+/6409 Reviewed-by: sterni <sternenseemann@systemli.org> Tested-by: BuildkiteCI
This commit is contained in:
parent
377ba19d75
commit
0a13d267f0
2 changed files with 7 additions and 3 deletions
|
@ -48,6 +48,10 @@ pub enum ErrorKind {
|
|||
// These are user-generated errors through builtins.
|
||||
Throw(String),
|
||||
Abort(String),
|
||||
|
||||
// An error occured while forcing a thunk, and needs to be chained
|
||||
// up.
|
||||
ThunkForce(Box<Error>),
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
|
|
|
@ -85,9 +85,9 @@ impl Thunk {
|
|||
std::mem::replace(&mut *thunk_mut, ThunkRepr::Blackhole)
|
||||
{
|
||||
vm.call(lambda, upvalues, 0);
|
||||
// TODO: find a cheap way to actually retain
|
||||
// the original error span
|
||||
*thunk_mut = ThunkRepr::Evaluated(vm.run().map_err(|e| e.kind)?);
|
||||
*thunk_mut = ThunkRepr::Evaluated(
|
||||
vm.run().map_err(|e| ErrorKind::ThunkForce(Box::new(e)))?,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue