summaryrefslogtreecommitdiff
path: root/library
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 /library
parent47dff3765de863554ca296448555599fc50d4a8a (diff)
More efficient introspection
Switches from a mutable locator to one based on tracked chains and optimizes query performance.
Diffstat (limited to 'library')
-rw-r--r--library/src/layout/mod.rs33
-rw-r--r--library/src/layout/par.rs14
-rw-r--r--library/src/meta/counter.rs7
-rw-r--r--library/src/meta/query.rs7
-rw-r--r--library/src/meta/reference.rs4
-rw-r--r--library/src/meta/state.rs7
-rw-r--r--library/src/prelude.rs6
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};