summaryrefslogtreecommitdiff
path: root/src/eval/func.rs
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2023-06-12 15:40:43 +0200
committerLaurenz <laurmaedje@gmail.com>2023-06-12 15:42:01 +0200
commit378ebe5f5601f11c3f428c17bed492012feb251e (patch)
tree4530bf009844faca40ca4fd6d0b9251fd51ef587 /src/eval/func.rs
parent19bf1f58944a42f17903869c162a33aba22b80b0 (diff)
Delayed errors
Fixes #785. Thanks to @Dherse for the idea!
Diffstat (limited to 'src/eval/func.rs')
-rw-r--r--src/eval/func.rs25
1 files changed, 17 insertions, 8 deletions
diff --git a/src/eval/func.rs b/src/eval/func.rs
index 1745dfb1..28d4a40d 100644
--- a/src/eval/func.rs
+++ b/src/eval/func.rs
@@ -11,7 +11,7 @@ use super::{
Value, Vm,
};
use crate::diag::{bail, SourceResult, StrResult};
-use crate::model::{ElemFunc, Introspector, Locator, Vt};
+use crate::model::{DelayedErrors, ElemFunc, Introspector, Locator, Vt};
use crate::syntax::ast::{self, AstNode, Expr, Ident};
use crate::syntax::{SourceId, Span, SyntaxNode};
use crate::World;
@@ -102,9 +102,10 @@ impl Func {
self,
vm.world(),
route,
- TrackedMut::reborrow_mut(&mut vm.vt.tracer),
- vm.vt.locator.track(),
vm.vt.introspector,
+ vm.vt.locator.track(),
+ TrackedMut::reborrow_mut(&mut vm.vt.delayed),
+ TrackedMut::reborrow_mut(&mut vm.vt.tracer),
vm.depth + 1,
args,
)
@@ -129,9 +130,10 @@ impl Func {
let mut locator = Locator::chained(vt.locator.track());
let vt = Vt {
world: vt.world,
- tracer: TrackedMut::reborrow_mut(&mut vt.tracer),
- locator: &mut locator,
introspector: vt.introspector,
+ locator: &mut locator,
+ delayed: TrackedMut::reborrow_mut(&mut vt.delayed),
+ tracer: TrackedMut::reborrow_mut(&mut vt.tracer),
};
let mut vm = Vm::new(vt, route.track(), id, scopes);
let args = Args::new(self.span(), args);
@@ -326,9 +328,10 @@ impl Closure {
this: &Func,
world: Tracked<dyn World + '_>,
route: Tracked<Route>,
- tracer: TrackedMut<Tracer>,
- locator: Tracked<Locator>,
introspector: Tracked<Introspector>,
+ locator: Tracked<Locator>,
+ delayed: TrackedMut<DelayedErrors>,
+ tracer: TrackedMut<Tracer>,
depth: usize,
mut args: Args,
) -> SourceResult<Value> {
@@ -344,7 +347,13 @@ impl Closure {
// Prepare VT.
let mut locator = Locator::chained(locator);
- let vt = Vt { world, tracer, locator: &mut locator, introspector };
+ let vt = Vt {
+ world,
+ introspector,
+ locator: &mut locator,
+ delayed,
+ tracer,
+ };
// Prepare VM.
let mut vm = Vm::new(vt, route, closure.location, scopes);