diff options
| author | Laurenz <laurmaedje@gmail.com> | 2023-05-11 11:27:00 +0200 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2023-05-11 11:27:00 +0200 |
| commit | 2f0b5eeae09bd880e4552bb83e44d9cd32571c58 (patch) | |
| tree | 6989d423e6bb614b3224be53140e4d649033aeac /src/eval/mod.rs | |
| parent | 47dff3765de863554ca296448555599fc50d4a8a (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.rs | 36 |
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); |
