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 /library/src | |
| parent | 47dff3765de863554ca296448555599fc50d4a8a (diff) | |
More efficient introspection
Switches from a mutable locator to one based on tracked chains and optimizes query performance.
Diffstat (limited to 'library/src')
| -rw-r--r-- | library/src/layout/mod.rs | 33 | ||||
| -rw-r--r-- | library/src/layout/par.rs | 14 | ||||
| -rw-r--r-- | library/src/meta/counter.rs | 7 | ||||
| -rw-r--r-- | library/src/meta/query.rs | 7 | ||||
| -rw-r--r-- | library/src/meta/reference.rs | 4 | ||||
| -rw-r--r-- | library/src/meta/state.rs | 7 | ||||
| -rw-r--r-- | library/src/prelude.rs | 6 |
7 files changed, 49 insertions, 29 deletions
diff --git a/library/src/layout/mod.rs b/library/src/layout/mod.rs index adfc433a..16ac46bb 100644 --- a/library/src/layout/mod.rs +++ b/library/src/layout/mod.rs @@ -75,11 +75,12 @@ impl LayoutRoot for Content { content: &Content, world: Tracked<dyn World + '_>, tracer: TrackedMut<Tracer>, - provider: TrackedMut<StabilityProvider>, + locator: Tracked<Locator>, introspector: Tracked<Introspector>, styles: StyleChain, ) -> SourceResult<Document> { - let mut vt = Vt { world, tracer, provider, introspector }; + let mut locator = Locator::chained(locator); + let mut vt = Vt { world, tracer, locator: &mut locator, introspector }; let scratch = Scratch::default(); let (realized, styles) = realize_root(&mut vt, &scratch, content, styles)?; realized @@ -94,7 +95,7 @@ impl LayoutRoot for Content { self, vt.world, TrackedMut::reborrow_mut(&mut vt.tracer), - TrackedMut::reborrow_mut(&mut vt.provider), + vt.locator.track(), vt.introspector, styles, ) @@ -121,10 +122,14 @@ pub trait Layout { styles: StyleChain, regions: Regions, ) -> SourceResult<Fragment> { - vt.provider.save(); - let result = self.layout(vt, styles, regions); - vt.provider.restore(); - result + let mut locator = Locator::chained(vt.locator.track()); + let mut vt = Vt { + world: vt.world, + tracer: TrackedMut::reborrow_mut(&mut vt.tracer), + locator: &mut locator, + introspector: vt.introspector, + }; + self.layout(&mut vt, styles, regions) } } @@ -141,12 +146,13 @@ impl Layout for Content { content: &Content, world: Tracked<dyn World + '_>, tracer: TrackedMut<Tracer>, - provider: TrackedMut<StabilityProvider>, + locator: Tracked<Locator>, introspector: Tracked<Introspector>, styles: StyleChain, regions: Regions, ) -> SourceResult<Fragment> { - let mut vt = Vt { world, tracer, provider, introspector }; + let mut locator = Locator::chained(locator); + let mut vt = Vt { world, tracer, locator: &mut locator, introspector }; let scratch = Scratch::default(); let (realized, styles) = realize_block(&mut vt, &scratch, content, styles)?; realized @@ -157,15 +163,18 @@ impl Layout for Content { tracing::info!("Layouting `Content`"); - cached( + let fragment = cached( self, vt.world, TrackedMut::reborrow_mut(&mut vt.tracer), - TrackedMut::reborrow_mut(&mut vt.provider), + vt.locator.track(), vt.introspector, styles, regions, - ) + )?; + + vt.locator.visit_frames(&fragment); + Ok(fragment) } } diff --git a/library/src/layout/par.rs b/library/src/layout/par.rs index c7bc5359..2edbd93d 100644 --- a/library/src/layout/par.rs +++ b/library/src/layout/par.rs @@ -141,14 +141,15 @@ impl ParElem { par: &ParElem, world: Tracked<dyn World + '_>, tracer: TrackedMut<Tracer>, - provider: TrackedMut<StabilityProvider>, + locator: Tracked<Locator>, introspector: Tracked<Introspector>, styles: StyleChain, consecutive: bool, region: Size, expand: bool, ) -> SourceResult<Fragment> { - let mut vt = Vt { world, tracer, provider, introspector }; + let mut locator = Locator::chained(locator); + let mut vt = Vt { world, tracer, locator: &mut locator, introspector }; let children = par.children(); // Collect all text into one string for BiDi analysis. @@ -166,17 +167,20 @@ impl ParElem { finalize(&mut vt, &p, &lines, region, expand) } - cached( + let fragment = cached( self, vt.world, TrackedMut::reborrow_mut(&mut vt.tracer), - TrackedMut::reborrow_mut(&mut vt.provider), + vt.locator.track(), vt.introspector, styles, consecutive, region, expand, - ) + )?; + + vt.locator.visit_frames(&fragment); + Ok(fragment) } } diff --git a/library/src/meta/counter.rs b/library/src/meta/counter.rs index 50a097af..5c23c536 100644 --- a/library/src/meta/counter.rs +++ b/library/src/meta/counter.rs @@ -396,7 +396,7 @@ impl Counter { self.sequence_impl( vt.world, TrackedMut::reborrow_mut(&mut vt.tracer), - TrackedMut::reborrow_mut(&mut vt.provider), + vt.locator.track(), vt.introspector, ) } @@ -407,10 +407,11 @@ impl Counter { &self, world: Tracked<dyn World + '_>, tracer: TrackedMut<Tracer>, - provider: TrackedMut<StabilityProvider>, + locator: Tracked<Locator>, introspector: Tracked<Introspector>, ) -> SourceResult<EcoVec<(CounterState, NonZeroUsize)>> { - let mut vt = Vt { world, tracer, provider, introspector }; + let mut locator = Locator::chained(locator); + let mut vt = Vt { world, tracer, locator: &mut locator, introspector }; let mut state = CounterState(match &self.0 { // special case, because pages always start at one. CounterKey::Page => smallvec![1], diff --git a/library/src/meta/query.rs b/library/src/meta/query.rs index 9488a964..4db658d7 100644 --- a/library/src/meta/query.rs +++ b/library/src/meta/query.rs @@ -122,7 +122,12 @@ pub fn query( location: Location, ) -> Value { let _ = location; - vm.vt.introspector.query(&target.0).into() + let vec = vm.vt.introspector.query(&target.0); + Value::Array( + vec.into_iter() + .map(|elem| Value::Content(elem.into_inner())) + .collect(), + ) } /// Turns a value into a selector. The following values are accepted: diff --git a/library/src/meta/reference.rs b/library/src/meta/reference.rs index 68837b89..ceb1a3b2 100644 --- a/library/src/meta/reference.rs +++ b/library/src/meta/reference.rs @@ -130,7 +130,7 @@ impl Synthesize for RefElem { let target = self.target(); if vt.introspector.init() && !BibliographyElem::has(vt, &target.0) { if let Ok(elem) = vt.introspector.query_label(&target) { - self.push_element(Some(elem)); + self.push_element(Some(elem.into_inner())); return Ok(()); } } @@ -173,7 +173,7 @@ impl Show for RefElem { let supplement = match self.supplement(styles) { Smart::Auto | Smart::Custom(None) => None, Smart::Custom(Some(supplement)) => { - Some(supplement.resolve(vt, [elem.clone().into()])?) + Some(supplement.resolve(vt, [(*elem).clone().into()])?) } }; diff --git a/library/src/meta/state.rs b/library/src/meta/state.rs index b466bd66..33c3b595 100644 --- a/library/src/meta/state.rs +++ b/library/src/meta/state.rs @@ -311,7 +311,7 @@ impl State { self.sequence_impl( vt.world, TrackedMut::reborrow_mut(&mut vt.tracer), - TrackedMut::reborrow_mut(&mut vt.provider), + vt.locator.track(), vt.introspector, ) } @@ -322,10 +322,11 @@ impl State { &self, world: Tracked<dyn World + '_>, tracer: TrackedMut<Tracer>, - provider: TrackedMut<StabilityProvider>, + locator: Tracked<Locator>, introspector: Tracked<Introspector>, ) -> SourceResult<EcoVec<Value>> { - let mut vt = Vt { world, tracer, provider, introspector }; + let mut locator = Locator::chained(locator); + let mut vt = Vt { world, tracer, locator: &mut locator, introspector }; let mut state = self.init.clone(); let mut stops = eco_vec![state.clone()]; diff --git a/library/src/prelude.rs b/library/src/prelude.rs index cb21a732..a0cef491 100644 --- a/library/src/prelude.rs +++ b/library/src/prelude.rs @@ -23,9 +23,9 @@ pub use typst::geom::*; #[doc(no_inline)] pub use typst::model::{ element, Behave, Behaviour, Construct, Content, ElemFunc, Element, Finalize, Fold, - Introspector, Label, Locatable, LocatableSelector, Location, MetaElem, PlainText, - Resolve, Selector, Set, Show, StabilityProvider, StyleChain, StyleVec, Styles, - Synthesize, Unlabellable, Vt, + Introspector, Label, Locatable, LocatableSelector, Location, Locator, MetaElem, + PlainText, Resolve, Selector, Set, Show, StyleChain, StyleVec, Styles, Synthesize, + Unlabellable, Vt, }; #[doc(no_inline)] pub use typst::syntax::{Span, Spanned}; |
