summaryrefslogtreecommitdiff
path: root/src/eval/func.rs
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2023-05-11 11:27:00 +0200
committerLaurenz <laurmaedje@gmail.com>2023-05-11 11:27:00 +0200
commit2f0b5eeae09bd880e4552bb83e44d9cd32571c58 (patch)
tree6989d423e6bb614b3224be53140e4d649033aeac /src/eval/func.rs
parent47dff3765de863554ca296448555599fc50d4a8a (diff)
More efficient introspection
Switches from a mutable locator to one based on tracked chains and optimizes query performance.
Diffstat (limited to 'src/eval/func.rs')
-rw-r--r--src/eval/func.rs22
1 files changed, 16 insertions, 6 deletions
diff --git a/src/eval/func.rs b/src/eval/func.rs
index 060e72cf..a8afa36d 100644
--- a/src/eval/func.rs
+++ b/src/eval/func.rs
@@ -12,7 +12,7 @@ use super::{
cast_to_value, Args, CastInfo, Eval, Flow, Route, Scope, Scopes, Tracer, Value, Vm,
};
use crate::diag::{bail, SourceResult, StrResult};
-use crate::model::{ElemFunc, Introspector, StabilityProvider, Vt};
+use crate::model::{ElemFunc, Introspector, Locator, Vt};
use crate::syntax::ast::{self, AstNode, Expr, Ident};
use crate::syntax::{SourceId, Span, SyntaxNode};
use crate::World;
@@ -104,7 +104,7 @@ impl Func {
vm.world(),
route,
TrackedMut::reborrow_mut(&mut vm.vt.tracer),
- TrackedMut::reborrow_mut(&mut vm.vt.provider),
+ vm.vt.locator.track(),
vm.vt.introspector,
vm.depth + 1,
args,
@@ -127,7 +127,14 @@ impl Func {
let route = Route::default();
let id = SourceId::detached();
let scopes = Scopes::new(None);
- let mut vm = Vm::new(vt.reborrow_mut(), route.track(), id, scopes);
+ 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,
+ };
+ let mut vm = Vm::new(vt, route.track(), id, scopes);
let args = Args::new(self.span(), args);
self.call_vm(&mut vm, args)
}
@@ -320,7 +327,7 @@ impl Closure {
world: Tracked<dyn World + '_>,
route: Tracked<Route>,
tracer: TrackedMut<Tracer>,
- provider: TrackedMut<StabilityProvider>,
+ locator: Tracked<Locator>,
introspector: Tracked<Introspector>,
depth: usize,
mut args: Args,
@@ -335,8 +342,11 @@ impl Closure {
let mut scopes = Scopes::new(None);
scopes.top = closure.captured.clone();
- // Evaluate the body.
- let vt = Vt { world, tracer, provider, introspector };
+ // Prepare VT.
+ let mut locator = Locator::chained(locator);
+ let vt = Vt { world, tracer, locator: &mut locator, introspector };
+
+ // Prepare VM.
let mut vm = Vm::new(vt, route, closure.location, scopes);
vm.depth = depth;