From 61d1e1a6831113143c5d1e9f8ccf2a86f90f359a Mon Sep 17 00:00:00 2001 From: Laurenz Date: Fri, 18 Feb 2022 17:33:13 +0100 Subject: [PATCH] Remove layout-cache feature --- Cargo.lock | 47 --------------------------------------- Cargo.toml | 6 +---- src/eval/show.rs | 25 ++------------------- src/layout/incremental.rs | 15 ------------- src/layout/mod.rs | 30 +------------------------ src/lib.rs | 12 ---------- src/util/prehashed.rs | 19 ++++------------ tests/typ/code/ops.typ | 3 ++- tests/typeset.rs | 17 ++++---------- 9 files changed, 14 insertions(+), 160 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c7e8b0099..365af0ed8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -581,12 +581,6 @@ dependencies = [ "miniz_oxide 0.4.4", ] -[[package]] -name = "ppv-lite86" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" - [[package]] name = "proc-macro2" version = "1.0.36" @@ -605,46 +599,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "rand" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", - "rand_hc", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" -dependencies = [ - "getrandom", -] - -[[package]] -name = "rand_hc" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" -dependencies = [ - "rand_core", -] - [[package]] name = "rctree" version = "0.4.0" @@ -958,7 +912,6 @@ dependencies = [ "pdf-writer", "pico-args", "pixglyph", - "rand", "resvg", "roxmltree", "rustybuzz", diff --git a/Cargo.toml b/Cargo.toml index fdf0680ce..d96bd98e4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,10 +5,9 @@ authors = ["The Typst Project Developers"] edition = "2021" [features] -default = ["fs", "layout-cache"] +default = ["fs"] cli = ["fs", "pico-args", "codespan-reporting", "same-file"] fs = ["dirs", "memmap2", "same-file", "walkdir"] -layout-cache = [] # Dependency updates: # - Bump ttf-parser when rustybuzz is updated @@ -64,9 +63,6 @@ dirs = { version = "4", optional = true } memmap2 = { version = "0.5", optional = true } walkdir = { version = "2", optional = true } -# Still here for layout cache evaluation, but must be activated manually. -rand = { version = "0.8", optional = true } - [dev-dependencies] filedescriptor = "0.8" iai = { git = "https://github.com/reknih/iai" } diff --git a/src/eval/show.rs b/src/eval/show.rs index a6a48e6fc..ac0e23784 100644 --- a/src/eval/show.rs +++ b/src/eval/show.rs @@ -1,6 +1,6 @@ use std::any::{Any, TypeId}; use std::fmt::{self, Debug, Formatter}; -use std::hash::{Hash, Hasher}; +use std::hash::Hash; use std::sync::Arc; use super::{StyleChain, Template}; @@ -59,18 +59,12 @@ impl Debug for ShowNode { impl PartialEq for ShowNode { fn eq(&self, other: &Self) -> bool { - // We cast to thin pointers for comparison because we don't want to - // compare vtables (which can be different across codegen units). - std::ptr::eq( - Arc::as_ptr(&self.0) as *const (), - Arc::as_ptr(&other.0) as *const (), - ) + self.0.eq(&other.0) } } trait Bounds: Show + Debug + Sync + Send + 'static { fn as_any(&self) -> &dyn Any; - fn hash64(&self) -> u64; } impl Bounds for T @@ -80,19 +74,4 @@ where fn as_any(&self) -> &dyn Any { self } - - fn hash64(&self) -> u64 { - // Also hash the TypeId since nodes with different types but - // equal data should be different. - let mut state = fxhash::FxHasher64::default(); - self.type_id().hash(&mut state); - self.hash(&mut state); - state.finish() - } -} - -impl Hash for dyn Bounds { - fn hash(&self, state: &mut H) { - state.write_u64(self.hash64()); - } } diff --git a/src/layout/incremental.rs b/src/layout/incremental.rs index 2112fef1b..b68ddcdc8 100644 --- a/src/layout/incremental.rs +++ b/src/layout/incremental.rs @@ -11,8 +11,6 @@ use crate::geom::Scalar; const TEMP_LEN: usize = 4; /// Caches layouting artifacts. -/// -/// _This is only available when the `layout-cache` feature is enabled._ #[derive(Default, Clone)] pub struct LayoutCache { /// Maps from node hashes to the resulting frames and regions in which the @@ -150,14 +148,6 @@ impl LayoutCache { entries.retain(|f| f.hits() as f64 / f.age() as f64 > threshold); } } - #[cfg(feature = "rand")] - EvictionPolicy::Random => { - // Fraction of items that should be kept. - let threshold = self.max_size as f64 / len as f64; - for entries in self.frames.values_mut() { - entries.retain(|_| rand::random::() > threshold); - } - } EvictionPolicy::Patterns => { let kept = self.entries().filter(|f| f.properties().must_keep()).count(); @@ -188,8 +178,6 @@ impl LayoutCache { } /// Cached frames from past layouting. -/// -/// _This is only available when the `layout-cache` feature is enabled._ #[derive(Debug, Clone)] pub struct FramesEntry { /// The cached frames for a node. @@ -340,9 +328,6 @@ pub enum EvictionPolicy { LeastRecentlyUsed, /// Evict the least frequently used item. LeastFrequentlyUsed, - /// Evict randomly. - #[cfg(feature = "rand")] - Random, /// Use the pattern verdicts. Patterns, /// Do not evict. diff --git a/src/layout/mod.rs b/src/layout/mod.rs index 0d1836fd2..afb2621b6 100644 --- a/src/layout/mod.rs +++ b/src/layout/mod.rs @@ -1,12 +1,10 @@ //! Layouting infrastructure. mod constraints; -#[cfg(feature = "layout-cache")] mod incremental; mod regions; pub use constraints::*; -#[cfg(feature = "layout-cache")] pub use incremental::*; pub use regions::*; @@ -141,10 +139,6 @@ impl Layout for LayoutNode { ) -> TypResult>>> { let styles = styles.barred(self.id()); - #[cfg(not(feature = "layout-cache"))] - return self.0.layout(ctx, regions, styles); - - #[cfg(feature = "layout-cache")] let hash = { let mut state = fxhash::FxHasher64::default(); self.hash(&mut state); @@ -154,7 +148,6 @@ impl Layout for LayoutNode { // This is not written with `unwrap_or_else`, because then the // #[track_caller] annotation doesn't work. - #[cfg(feature = "layout-cache")] if let Some(frames) = vm.layout_cache.get(hash, regions) { Ok(frames) } else { @@ -199,18 +192,12 @@ impl Debug for LayoutNode { impl PartialEq for LayoutNode { fn eq(&self, other: &Self) -> bool { - // We cast to thin pointers for comparison because we don't want to - // compare vtables (which can be different across codegen units). - std::ptr::eq( - Arc::as_ptr(&self.0) as *const (), - Arc::as_ptr(&other.0) as *const (), - ) + self.0.eq(&other.0) } } trait Bounds: Layout + Debug + Sync + Send + 'static { fn as_any(&self) -> &dyn Any; - fn hash64(&self) -> u64; } impl Bounds for T @@ -220,21 +207,6 @@ where fn as_any(&self) -> &dyn Any { self } - - fn hash64(&self) -> u64 { - // Also hash the TypeId since nodes with different types but - // equal data should be different. - let mut state = fxhash::FxHasher64::default(); - self.type_id().hash(&mut state); - self.hash(&mut state); - state.finish() - } -} - -impl Hash for dyn Bounds { - fn hash(&self, state: &mut H) { - state.write_u64(self.hash64()); - } } /// A layout node that produces an empty frame. diff --git a/src/lib.rs b/src/lib.rs index be1bab0d6..13c63885d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -62,7 +62,6 @@ use crate::export::RenderCache; use crate::font::FontStore; use crate::frame::Frame; use crate::image::ImageStore; -#[cfg(feature = "layout-cache")] use crate::layout::{EvictionPolicy, LayoutCache}; use crate::loading::Loader; use crate::source::{SourceId, SourceStore}; @@ -78,7 +77,6 @@ pub struct Context { /// Stores decoded images. pub images: ImageStore, /// Caches layouting artifacts. - #[cfg(feature = "layout-cache")] pub layout_cache: LayoutCache, /// Caches rendering artifacts. pub render_cache: RenderCache, @@ -120,7 +118,6 @@ impl Context { /// Garbage-collect caches. pub fn turnaround(&mut self) { - #[cfg(feature = "layout-cache")] self.layout_cache.turnaround(); } } @@ -131,9 +128,7 @@ impl Context { pub struct ContextBuilder { std: Option, styles: Option, - #[cfg(feature = "layout-cache")] policy: EvictionPolicy, - #[cfg(feature = "layout-cache")] max_size: usize, } @@ -152,7 +147,6 @@ impl ContextBuilder { } /// The policy for eviction of the layout cache. - #[cfg(feature = "layout-cache")] pub fn cache_policy(mut self, policy: EvictionPolicy) -> Self { self.policy = policy; self @@ -162,7 +156,6 @@ impl ContextBuilder { /// /// Note that this can be exceeded if more entries are categorized as [must /// keep][crate::layout::PatternProperties::must_keep]. - #[cfg(feature = "layout-cache")] pub fn cache_max_size(mut self, max_size: usize) -> Self { self.max_size = max_size; self @@ -176,7 +169,6 @@ impl ContextBuilder { fonts: FontStore::new(Arc::clone(&loader)), images: ImageStore::new(Arc::clone(&loader)), loader, - #[cfg(feature = "layout-cache")] layout_cache: LayoutCache::new(self.policy, self.max_size), render_cache: RenderCache::new(), std: self.std.unwrap_or_else(library::new), @@ -190,9 +182,7 @@ impl Default for ContextBuilder { Self { std: None, styles: None, - #[cfg(feature = "layout-cache")] policy: EvictionPolicy::default(), - #[cfg(feature = "layout-cache")] max_size: 2000, } } @@ -209,7 +199,6 @@ pub struct Vm<'a> { /// Stores decoded images. pub images: &'a mut ImageStore, /// Caches layouting artifacts. - #[cfg(feature = "layout-cache")] pub layout_cache: &'a mut LayoutCache, /// The default styles. pub styles: &'a StyleMap, @@ -223,7 +212,6 @@ pub struct Vm<'a> { /// rules. pub rules: Vec, /// How deeply nested the current layout tree position is. - #[cfg(feature = "layout-cache")] pub level: usize, } diff --git a/src/util/prehashed.rs b/src/util/prehashed.rs index 866bda5bf..79455918d 100644 --- a/src/util/prehashed.rs +++ b/src/util/prehashed.rs @@ -1,15 +1,12 @@ +use std::any::Any; use std::fmt::{self, Debug, Formatter}; use std::hash::{Hash, Hasher}; use std::ops::Deref; -#[cfg(feature = "layout-cache")] -use std::any::Any; - /// A wrapper around a type that precomputes its hash. #[derive(Copy, Clone)] pub struct Prehashed { /// The precomputed hash. - #[cfg(feature = "layout-cache")] hash: u64, /// The wrapped item. item: T, @@ -19,7 +16,6 @@ impl Prehashed { /// Compute an item's hash and wrap it. pub fn new(item: T) -> Self { Self { - #[cfg(feature = "layout-cache")] hash: { // Also hash the TypeId because the type might be converted // through an unsized coercion. @@ -52,23 +48,16 @@ impl Debug for Prehashed { } } -impl Hash for Prehashed { +impl Hash for Prehashed { fn hash(&self, state: &mut H) { - // Hash the node. - #[cfg(feature = "layout-cache")] state.write_u64(self.hash); - #[cfg(not(feature = "layout-cache"))] - self.item.hash(state); } } impl Eq for Prehashed {} -impl PartialEq for Prehashed { +impl PartialEq for Prehashed { fn eq(&self, other: &Self) -> bool { - #[cfg(feature = "layout-cache")] - return self.hash == other.hash; - #[cfg(not(feature = "layout-cache"))] - self.item.eq(&other.item) + self.hash == other.hash } } diff --git a/tests/typ/code/ops.typ b/tests/typ/code/ops.typ index 0ad35a277..53d00132e 100644 --- a/tests/typ/code/ops.typ +++ b/tests/typ/code/ops.typ @@ -137,7 +137,8 @@ #test([a] == [a], true) #test([[a]] == [a], true) #test([] == [a], false) -#test(box[] == box[], false) +#test(box[] == box[], true) +#test(box[a] == box[], false) --- // Test comparison operators. diff --git a/tests/typeset.rs b/tests/typeset.rs index 98c85df93..00075166c 100644 --- a/tests/typeset.rs +++ b/tests/typeset.rs @@ -1,10 +1,11 @@ use std::env; use std::ffi::OsStr; -use std::fs; +use std::fs::{self, File}; use std::ops::Range; use std::path::Path; use std::sync::Arc; +use filedescriptor::{FileDescriptor, StdioDescriptor::*}; use tiny_skia as sk; use walkdir::WalkDir; @@ -15,17 +16,10 @@ use typst::geom::{Length, RgbaColor}; use typst::library::{PageNode, TextNode}; use typst::loading::FsLoader; use typst::parse::Scanner; -use typst::source::SourceFile; +use typst::source::{SourceFile, SourceId}; use typst::syntax::Span; use typst::{Context, Vm}; -#[cfg(feature = "layout-cache")] -use { - filedescriptor::{FileDescriptor, StdioDescriptor::*}, - std::fs::File, - typst::source::SourceId, -}; - const TYP_DIR: &str = "./typ"; const REF_DIR: &str = "./ref"; const PNG_DIR: &str = "./png"; @@ -277,8 +271,7 @@ fn test_part( let mut vm = Vm::new(ctx); let (frames, mut errors) = match vm.typeset(id) { Ok(mut frames) => { - #[cfg(feature = "layout-cache")] - (ok &= test_incremental(ctx, i, id, &frames)); + ok &= test_incremental(ctx, i, id, &frames); if !compare_ref { frames.clear(); @@ -474,7 +467,6 @@ fn test_reparse(src: &str, i: usize, rng: &mut LinearShift) -> bool { ok } -#[cfg(feature = "layout-cache")] fn test_incremental( ctx: &mut Context, i: usize, @@ -591,7 +583,6 @@ fn render_links( } /// Disable stdout and stderr during execution of `f`. -#[cfg(feature = "layout-cache")] fn silenced(f: F) -> T where F: FnOnce() -> T,