about summary refs log tree commit diff
path: root/tvix/eval
diff options
context:
space:
mode:
Diffstat (limited to 'tvix/eval')
-rw-r--r--tvix/eval/src/errors.rs4
-rw-r--r--tvix/eval/src/value/thunk.rs6
2 files changed, 7 insertions, 3 deletions
diff --git a/tvix/eval/src/errors.rs b/tvix/eval/src/errors.rs
index 59142f2efe64..5f1a24b54b4b 100644
--- a/tvix/eval/src/errors.rs
+++ b/tvix/eval/src/errors.rs
@@ -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)]
diff --git a/tvix/eval/src/value/thunk.rs b/tvix/eval/src/value/thunk.rs
index c2552284fe20..4fd41689c70c 100644
--- a/tvix/eval/src/value/thunk.rs
+++ b/tvix/eval/src/value/thunk.rs
@@ -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)))?,
+                        );
                     }
                 }
             }