summaryrefslogtreecommitdiff
path: root/src/eval/mod.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/mod.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/mod.rs')
-rw-r--r--src/eval/mod.rs36
1 files changed, 21 insertions, 15 deletions
diff --git a/src/eval/mod.rs b/src/eval/mod.rs
index 95822530..ba9628c4 100644
--- a/src/eval/mod.rs
+++ b/src/eval/mod.rs
@@ -48,9 +48,8 @@ use unicode_segmentation::UnicodeSegmentation;
use crate::diag::{
bail, error, At, SourceError, SourceResult, StrResult, Trace, Tracepoint,
};
-use crate::model::ShowableSelector;
use crate::model::{
- Content, Introspector, Label, Recipe, StabilityProvider, Styles, Transform,
+ Content, Introspector, Label, Locator, Recipe, ShowableSelector, Styles, Transform,
Unlabellable, Vt,
};
use crate::syntax::ast::AstNode;
@@ -83,23 +82,26 @@ pub fn eval(
let library = world.library();
set_lang_items(library.items.clone());
- // Evaluate the module.
- let route = Route::insert(route, id);
- let scopes = Scopes::new(Some(library));
- let mut provider = StabilityProvider::new();
- let introspector = Introspector::new(&[]);
+ // Prepare VT.
+ let mut locator = Locator::default();
+ let introspector = Introspector::default();
let vt = Vt {
world,
tracer,
- provider: provider.track_mut(),
+ locator: &mut locator,
introspector: introspector.track(),
};
+
+ // Prepare VM.
+ let route = Route::insert(route, id);
+ let scopes = Scopes::new(Some(library));
let mut vm = Vm::new(vt, route.track(), id, scopes);
let root = match source.root().cast::<ast::Markup>() {
Some(markup) if vm.traced.is_some() => markup,
_ => source.ast()?,
};
+ // Evaluate the module.
let result = root.eval(&mut vm);
// Handle control flow.
@@ -129,20 +131,24 @@ pub fn eval_string(
return Err(Box::new(errors));
}
- let id = SourceId::detached();
- let library = world.library();
- let scopes = Scopes::new(Some(library));
- let route = Route::default();
+ // Prepare VT.
let mut tracer = Tracer::default();
- let mut provider = StabilityProvider::new();
- let introspector = Introspector::new(&[]);
+ let mut locator = Locator::default();
+ let introspector = Introspector::default();
let vt = Vt {
world,
tracer: tracer.track_mut(),
- provider: provider.track_mut(),
+ locator: &mut locator,
introspector: introspector.track(),
};
+
+ // Prepare VM.
+ let route = Route::default();
+ let id = SourceId::detached();
+ let scopes = Scopes::new(Some(world.library()));
let mut vm = Vm::new(vt, route.track(), id, scopes);
+
+ // Evaluate the code.
let code = root.cast::<ast::Code>().unwrap();
let result = code.eval(&mut vm);