From a6b93a1834d5c710621bc2f2486facda0b4a81ca Mon Sep 17 00:00:00 2001 From: Kornel Date: Wed, 4 Dec 2024 15:33:18 +0000 Subject: [PATCH] Upgrade/remove dependencies --- Cargo.toml | 15 ++++++--------- src/base/bytes.rs | 6 ++++++ src/rewritable_units/tokens/attributes.rs | 22 ++++++---------------- src/rewriter/mod.rs | 6 ++++-- src/selectors_vm/attribute_matcher.rs | 20 ++++++++------------ 5 files changed, 30 insertions(+), 39 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index e1fb64d5..0696df8d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -34,31 +34,28 @@ name = "bench" [dependencies] bitflags = "2.0.0" cfg-if = "1.0.0" -cssparser = "0.28.1" +cssparser = "0.29" encoding_rs = "0.8.13" -lazycell = "1.3.0" -lazy_static = "1.3.0" memchr = "2.1.2" -selectors = "0.23.0" -thiserror = "1.0.2" hashbrown = "0.15.0" mime = "0.3.16" +selectors = "0.24" +thiserror = "2.0" [dev-dependencies] criterion = "0.5.1" # Needed for criterion <= v0.5.1. See https://github.com/bheisler/criterion.rs/pull/703. clap = { version = "4.5.21", features = ["help"] } glob = "0.3.0" -html5ever = "0.26.0" -markup5ever_rcdom = "0.2.0" +html5ever = "0.29" +markup5ever_rcdom = "0.5.0-unofficial" hashbrown = { version = "0.15.0", features = ["serde"] } serde = "1.0.126" serde_derive = "1.0.19" serde_json = "1.0.65" -static_assertions = "1.1.0" rand = "0.8.5" rustc-test = "0.3.1" -itertools = "0.10.1" +itertools = "0.13" [lints.rust] keyword_idents = { level = "deny", priority = 1 } diff --git a/src/base/bytes.rs b/src/base/bytes.rs index b2591145..b46549a2 100644 --- a/src/base/bytes.rs +++ b/src/base/bytes.rs @@ -15,6 +15,12 @@ pub struct HasReplacementsError; #[allow(unnameable_types)] // accidentally exposed via `tag.set_name()` pub struct Bytes<'b>(Cow<'b, [u8]>); +impl Bytes<'static> { + pub const fn from_static(string: &'static str) -> Self { + Self(Cow::Borrowed(string.as_bytes())) + } +} + impl<'b> Bytes<'b> { #[inline] pub fn from_str(string: &'b str, encoding: &'static Encoding) -> Self { diff --git a/src/rewritable_units/tokens/attributes.rs b/src/rewritable_units/tokens/attributes.rs index afa09add..34b6dc96 100644 --- a/src/rewritable_units/tokens/attributes.rs +++ b/src/rewritable_units/tokens/attributes.rs @@ -4,7 +4,7 @@ use crate::html::escape_double_quotes_only; use crate::parser::AttributeBuffer; use crate::rewritable_units::Serialize; use encoding_rs::Encoding; -use lazycell::LazyCell; +use std::cell::OnceCell; use std::fmt::{self, Debug}; use std::ops::Deref; use thiserror::Error; @@ -154,7 +154,7 @@ impl Debug for Attribute<'_> { pub(crate) struct Attributes<'i> { input: &'i Bytes<'i>, attribute_buffer: &'i AttributeBuffer, - items: LazyCell>>, + items: OnceCell>>, encoding: &'static Encoding, } @@ -169,7 +169,7 @@ impl<'i> Attributes<'i> { Attributes { input, attribute_buffer, - items: LazyCell::default(), + items: OnceCell::default(), encoding, } } @@ -226,19 +226,9 @@ impl<'i> Attributes<'i> { #[inline] fn as_mut_vec(&mut self) -> &mut Vec> { - // NOTE: we can't use borrow_mut_with here as we'll need - // because `self` is a mutable reference and we'll have - // two mutable references by passing it to the initializer - // closure. - if !self.items.filled() { - self.items - .fill(self.init_items()) - .expect("Cell should be empty at this point"); - } + let _ = self.items.get_or_init(|| self.init_items()); - self.items - .borrow_mut() - .expect("Items should be initialized") + self.items.get_mut().expect("Items should be initialized") } #[cfg(test)] @@ -252,7 +242,7 @@ impl<'i> Deref for Attributes<'i> { #[inline] fn deref(&self) -> &[Attribute<'i>] { - self.items.borrow_with(|| self.init_items()) + self.items.get_or_init(|| self.init_items()) } } diff --git a/src/rewriter/mod.rs b/src/rewriter/mod.rs index 73511b61..2a13ddd5 100644 --- a/src/rewriter/mod.rs +++ b/src/rewriter/mod.rs @@ -354,13 +354,15 @@ mod tests { use crate::test_utils::{Output, ASCII_COMPATIBLE_ENCODINGS, NON_ASCII_COMPATIBLE_ENCODINGS}; use encoding_rs::Encoding; use itertools::Itertools; - use static_assertions::assert_impl_all; use std::convert::TryInto; use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::{Arc, Mutex}; // Assert that HtmlRewriter with `SendHandlerTypes` is `Send`. - assert_impl_all!(crate::send::HtmlRewriter<'_, Box>: Send); + const _: () = { + const fn is_send() {} + is_send::>>() + }; fn write_chunks( mut rewriter: HtmlRewriter<'_, O>, diff --git a/src/selectors_vm/attribute_matcher.rs b/src/selectors_vm/attribute_matcher.rs index 21b11944..b759c3e1 100644 --- a/src/selectors_vm/attribute_matcher.rs +++ b/src/selectors_vm/attribute_matcher.rs @@ -2,23 +2,19 @@ use super::compiler::AttrExprOperands; use crate::base::Bytes; use crate::html::Namespace; use crate::parser::{AttributeBuffer, AttributeOutline}; -use encoding_rs::UTF_8; -use lazy_static::lazy_static; -use lazycell::LazyCell; use memchr::{memchr, memchr2}; use selectors::attr::CaseSensitivity; +use std::cell::OnceCell; -lazy_static! { - static ref ID_ATTR: Bytes<'static> = Bytes::from_str("id", UTF_8); - static ref CLASS_ATTR: Bytes<'static> = Bytes::from_str("class", UTF_8); -} +static ID_ATTR: Bytes<'static> = Bytes::from_static("id"); +static CLASS_ATTR: Bytes<'static> = Bytes::from_static("class"); #[inline] const fn is_attr_whitespace(b: u8) -> bool { b == b' ' || b == b'\n' || b == b'\r' || b == b'\t' || b == b'\x0c' } -type MemoizedAttrValue<'i> = LazyCell>>; +type MemoizedAttrValue<'i> = OnceCell>>; pub(crate) struct AttributeMatcher<'i> { input: &'i Bytes<'i>, @@ -35,8 +31,8 @@ impl<'i> AttributeMatcher<'i> { AttributeMatcher { input, attributes, - id: LazyCell::default(), - class: LazyCell::default(), + id: OnceCell::new(), + class: OnceCell::new(), is_html_element: ns == Namespace::Html, } } @@ -78,7 +74,7 @@ impl<'i> AttributeMatcher<'i> { #[inline] #[must_use] pub fn has_id(&self, id: &Bytes<'_>) -> bool { - match self.id.borrow_with(|| self.get_value(&ID_ATTR)) { + match self.id.get_or_init(|| self.get_value(&ID_ATTR)) { Some(actual_id) => actual_id == id, None => false, } @@ -87,7 +83,7 @@ impl<'i> AttributeMatcher<'i> { #[inline] #[must_use] pub fn has_class(&self, class_name: &Bytes<'_>) -> bool { - match self.class.borrow_with(|| self.get_value(&CLASS_ATTR)) { + match self.class.get_or_init(|| self.get_value(&CLASS_ATTR)) { Some(class) => class .split(|&b| is_attr_whitespace(b)) .any(|actual_class_name| actual_class_name == &**class_name),