diff --git a/components/layout_thread/Cargo.toml b/components/layout_thread/Cargo.toml index 73939ab4872..238029cf5ad 100644 --- a/components/layout_thread/Cargo.toml +++ b/components/layout_thread/Cargo.toml @@ -39,7 +39,7 @@ rayon = "1" script = { path = "../script" } script_layout_interface = { path = "../script_layout_interface" } script_traits = { path = "../script_traits" } -selectors = { path = "../selectors" } +selectors = { path = "../selectors", features = ["shmem"] } serde_json = "1.0" servo_allocator = { path = "../allocator" } servo_arc = { path = "../servo_arc" } diff --git a/components/layout_thread_2020/Cargo.toml b/components/layout_thread_2020/Cargo.toml index 0ed1585c0a0..c8fc87aceb6 100644 --- a/components/layout_thread_2020/Cargo.toml +++ b/components/layout_thread_2020/Cargo.toml @@ -37,7 +37,7 @@ range = { path = "../range" } script = { path = "../script" } script_layout_interface = { path = "../script_layout_interface" } script_traits = { path = "../script_traits" } -selectors = { path = "../selectors" } +selectors = { path = "../selectors", features = ["shmem"] } servo_allocator = { path = "../allocator" } servo_arc = { path = "../servo_arc" } servo_atoms = { path = "../atoms" } diff --git a/components/malloc_size_of/Cargo.toml b/components/malloc_size_of/Cargo.toml index d931d15a01c..cedfb2f5200 100644 --- a/components/malloc_size_of/Cargo.toml +++ b/components/malloc_size_of/Cargo.toml @@ -37,7 +37,7 @@ hashglobe = { path = "../hashglobe" } http = { version = "0.2", optional = true } hyper_serde = { version = "0.13", optional = true } keyboard-types = { version = "0.6", optional = true } -selectors = { path = "../selectors" } +selectors = { path = "../selectors", features = ["shmem"] } serde = { version = "1.0.27", optional = true } serde_bytes = { version = "0.11", optional = true } servo_arc = { path = "../servo_arc" } diff --git a/components/script/Cargo.toml b/components/script/Cargo.toml index 1b6eece505b..d85cbc32d16 100644 --- a/components/script/Cargo.toml +++ b/components/script/Cargo.toml @@ -88,7 +88,7 @@ regex = "1.1" script_layout_interface = { path = "../script_layout_interface" } script_plugins = { path = "../script_plugins" } script_traits = { path = "../script_traits" } -selectors = { path = "../selectors" } +selectors = { path = "../selectors", features = ["shmem"] } serde = { version = "1", features = ["derive"] } serde_bytes = "0.11" servo-media = { git = "https://github.com/servo/media" } diff --git a/components/script_layout_interface/Cargo.toml b/components/script_layout_interface/Cargo.toml index 815d79d652c..8ebf48b5d4c 100644 --- a/components/script_layout_interface/Cargo.toml +++ b/components/script_layout_interface/Cargo.toml @@ -30,7 +30,7 @@ parking_lot = "0.11" profile_traits = { path = "../profile_traits" } range = { path = "../range" } script_traits = { path = "../script_traits" } -selectors = { path = "../selectors" } +selectors = { path = "../selectors", features = ["shmem"] } servo_arc = { path = "../servo_arc" } servo_atoms = { path = "../atoms" } servo_url = { path = "../url" } diff --git a/components/selectors/Cargo.toml b/components/selectors/Cargo.toml index 3701b311d4b..08152f76ac9 100644 --- a/components/selectors/Cargo.toml +++ b/components/selectors/Cargo.toml @@ -16,6 +16,7 @@ path = "lib.rs" [features] bench = [] +shmem = [ "dep:to_shmem", "dep:to_shmem_derive" ] [dependencies] bitflags = "1.0" @@ -27,8 +28,8 @@ phf = "0.8" precomputed-hash = "0.1" servo_arc = { version = "0.1", path = "../servo_arc" } smallvec = "1.0" -to_shmem = { path = "../to_shmem" } -to_shmem_derive = { path = "../to_shmem_derive" } +to_shmem = { path = "../to_shmem", optional = true } +to_shmem_derive = { path = "../to_shmem_derive", optional = true } [build-dependencies] phf_codegen = "0.8" diff --git a/components/selectors/attr.rs b/components/selectors/attr.rs index 51173cee50e..4f790ff7d57 100644 --- a/components/selectors/attr.rs +++ b/components/selectors/attr.rs @@ -6,15 +6,16 @@ use crate::parser::SelectorImpl; use cssparser::ToCss; use std::fmt; -#[derive(Clone, Eq, PartialEq, ToShmem)] -#[shmem(no_bounds)] +#[derive(Clone, Eq, PartialEq)] +#[cfg_attr(feature = "shmem", derive(ToShmem))] +#[cfg_attr(feature = "shmem", shmem(no_bounds))] pub struct AttrSelectorWithOptionalNamespace { - #[shmem(field_bound)] + #[cfg_attr(feature = "shmem", shmem(field_bound))] pub namespace: Option>, - #[shmem(field_bound)] + #[cfg_attr(feature = "shmem", shmem(field_bound))] pub local_name: Impl::LocalName, pub local_name_lower: Impl::LocalName, - #[shmem(field_bound)] + #[cfg_attr(feature = "shmem", shmem(field_bound))] pub operation: ParsedAttrSelectorOperation, pub never_matches: bool, } @@ -28,7 +29,8 @@ impl AttrSelectorWithOptionalNamespace { } } -#[derive(Clone, Eq, PartialEq, ToShmem)] +#[derive(Clone, Eq, PartialEq)] +#[cfg_attr(feature = "shmem", derive(ToShmem))] pub enum NamespaceConstraint { Any, @@ -36,7 +38,8 @@ pub enum NamespaceConstraint { Specific(NamespaceUrl), } -#[derive(Clone, Eq, PartialEq, ToShmem)] +#[derive(Clone, Eq, PartialEq)] +#[cfg_attr(feature = "shmem", derive(ToShmem))] pub enum ParsedAttrSelectorOperation { Exists, WithValue { @@ -76,7 +79,8 @@ impl AttrSelectorOperation { } } -#[derive(Clone, Copy, Eq, PartialEq, ToShmem)] +#[derive(Clone, Copy, Eq, PartialEq)] +#[cfg_attr(feature = "shmem", derive(ToShmem))] pub enum AttrSelectorOperator { Equal, Includes, @@ -136,7 +140,8 @@ impl AttrSelectorOperator { /// The definition of whitespace per CSS Selectors Level 3 ยง 4. pub static SELECTOR_WHITESPACE: &[char] = &[' ', '\t', '\n', '\r', '\x0C']; -#[derive(Clone, Copy, Debug, Eq, PartialEq, ToShmem)] +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +#[cfg_attr(feature = "shmem", derive(ToShmem))] pub enum ParsedCaseSensitivity { // 's' was specified. ExplicitCaseSensitive, diff --git a/components/selectors/builder.rs b/components/selectors/builder.rs index eb1e6cc18b9..58e6cbafe93 100644 --- a/components/selectors/builder.rs +++ b/components/selectors/builder.rs @@ -193,7 +193,8 @@ fn split_from_end(s: &[T], at: usize) -> (&[T], &[T]) { bitflags! { /// Flags that indicate at which point of parsing a selector are we. - #[derive(Default, ToShmem)] + #[derive(Default)] + #[cfg_attr(feature = "shmem", derive(ToShmem))] pub (crate) struct SelectorFlags : u8 { const HAS_PSEUDO = 1 << 0; const HAS_SLOTTED = 1 << 1; @@ -201,7 +202,8 @@ bitflags! { } } -#[derive(Clone, Copy, Debug, Eq, PartialEq, ToShmem)] +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +#[cfg_attr(feature = "shmem", derive(ToShmem))] pub struct SpecificityAndFlags { /// There are two free bits here, since we use ten bits for each specificity /// kind (id, class, element). diff --git a/components/selectors/lib.rs b/components/selectors/lib.rs index a7bcb530487..896a1dfbf3f 100644 --- a/components/selectors/lib.rs +++ b/components/selectors/lib.rs @@ -18,7 +18,9 @@ extern crate phf; extern crate precomputed_hash; extern crate servo_arc; extern crate smallvec; +#[cfg(feature = "shmem")] extern crate to_shmem; +#[cfg(feature = "shmem")] #[macro_use] extern crate to_shmem_derive; diff --git a/components/selectors/parser.rs b/components/selectors/parser.rs index 24916db0e54..412658582b7 100644 --- a/components/selectors/parser.rs +++ b/components/selectors/parser.rs @@ -327,10 +327,11 @@ pub trait Parser<'i> { } } -#[derive(Clone, Debug, Eq, PartialEq, ToShmem)] -#[shmem(no_bounds)] +#[derive(Clone, Debug, Eq, PartialEq)] +#[cfg_attr(feature = "shmem", derive(ToShmem))] +#[cfg_attr(feature = "shmem", shmem(no_bounds))] pub struct SelectorList( - #[shmem(field_bound)] pub SmallVec<[Selector; 1]>, + #[cfg_attr(feature = "shmem", shmem(field_bound))] pub SmallVec<[Selector; 1]>, ); /// How to treat invalid selectors in a selector list. @@ -555,10 +556,12 @@ pub fn namespace_empty_string() -> Impl::NamespaceUrl { /// /// This reordering doesn't change the semantics of selector matching, and we /// handle it in to_css to make it invisible to serialization. -#[derive(Clone, Eq, PartialEq, ToShmem)] -#[shmem(no_bounds)] +#[derive(Clone, Eq, PartialEq)] +#[cfg_attr(feature = "shmem", derive(ToShmem))] +#[cfg_attr(feature = "shmem", shmem(no_bounds))] pub struct Selector( - #[shmem(field_bound)] ThinArc>, + #[cfg_attr(feature = "shmem", shmem(field_bound))] + ThinArc>, ); impl Selector { @@ -934,7 +937,8 @@ impl<'a, Impl: SelectorImpl> Iterator for AncestorIter<'a, Impl> { } } -#[derive(Clone, Copy, Debug, Eq, PartialEq, ToShmem)] +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +#[cfg_attr(feature = "shmem", derive(ToShmem))] pub enum Combinator { Child, // > Descendant, // space @@ -985,27 +989,28 @@ impl Combinator { /// optimal packing and cache performance, see [1]. /// /// [1] https://bugzilla.mozilla.org/show_bug.cgi?id=1357973 -#[derive(Clone, Eq, PartialEq, ToShmem)] -#[shmem(no_bounds)] +#[derive(Clone, Eq, PartialEq)] +#[cfg_attr(feature = "shmem", derive(ToShmem))] +#[cfg_attr(feature = "shmem", shmem(no_bounds))] pub enum Component { Combinator(Combinator), ExplicitAnyNamespace, ExplicitNoNamespace, - DefaultNamespace(#[shmem(field_bound)] Impl::NamespaceUrl), + DefaultNamespace(#[cfg_attr(feature = "shmem", shmem(field_bound))] Impl::NamespaceUrl), Namespace( - #[shmem(field_bound)] Impl::NamespacePrefix, - #[shmem(field_bound)] Impl::NamespaceUrl, + #[cfg_attr(feature = "shmem", shmem(field_bound))] Impl::NamespacePrefix, + #[cfg_attr(feature = "shmem", shmem(field_bound))] Impl::NamespaceUrl, ), ExplicitUniversalType, LocalName(LocalName), - ID(#[shmem(field_bound)] Impl::Identifier), - Class(#[shmem(field_bound)] Impl::Identifier), + ID(#[cfg_attr(feature = "shmem", shmem(field_bound))] Impl::Identifier), + Class(#[cfg_attr(feature = "shmem", shmem(field_bound))] Impl::Identifier), AttributeInNoNamespaceExists { - #[shmem(field_bound)] + #[cfg_attr(feature = "shmem", shmem(field_bound))] local_name: Impl::LocalName, local_name_lower: Impl::LocalName, }, @@ -1013,7 +1018,7 @@ pub enum Component { AttributeInNoNamespace { local_name: Impl::LocalName, operator: AttrSelectorOperator, - #[shmem(field_bound)] + #[cfg_attr(feature = "shmem", shmem(field_bound))] value: Impl::AttrValue, case_sensitivity: ParsedCaseSensitivity, never_matches: bool, @@ -1036,7 +1041,7 @@ pub enum Component { FirstOfType, LastOfType, OnlyOfType, - NonTSPseudoClass(#[shmem(field_bound)] Impl::NonTSPseudoClass), + NonTSPseudoClass(#[cfg_attr(feature = "shmem", shmem(field_bound))] Impl::NonTSPseudoClass), /// The ::slotted() pseudo-element: /// /// https://drafts.csswg.org/css-scoping/#slotted-pseudo @@ -1051,7 +1056,7 @@ pub enum Component { Slotted(Selector), /// The `::part` pseudo-element. /// https://drafts.csswg.org/css-shadow-parts/#part - Part(#[shmem(field_bound)] Box<[Impl::Identifier]>), + Part(#[cfg_attr(feature = "shmem", shmem(field_bound))] Box<[Impl::Identifier]>), /// The `:host` pseudo-class: /// /// https://drafts.csswg.org/css-scoping/#host-selector @@ -1076,7 +1081,7 @@ pub enum Component { /// Same comment as above re. the argument. Is(Box<[Selector]>), /// An implementation-dependent pseudo-element selector. - PseudoElement(#[shmem(field_bound)] Impl::PseudoElement), + PseudoElement(#[cfg_attr(feature = "shmem", shmem(field_bound))] Impl::PseudoElement), } impl Component { @@ -1219,10 +1224,11 @@ impl Component { } } -#[derive(Clone, Eq, PartialEq, ToShmem)] -#[shmem(no_bounds)] +#[derive(Clone, Eq, PartialEq)] +#[cfg_attr(feature = "shmem", derive(ToShmem))] +#[cfg_attr(feature = "shmem", shmem(no_bounds))] pub struct LocalName { - #[shmem(field_bound)] + #[cfg_attr(feature = "shmem", shmem(field_bound))] pub name: Impl::LocalName, pub lower_name: Impl::LocalName, } diff --git a/components/style/Cargo.toml b/components/style/Cargo.toml index 1997f37efa3..a88ccf0fd88 100644 --- a/components/style/Cargo.toml +++ b/components/style/Cargo.toml @@ -59,7 +59,7 @@ owning_ref = "0.4" parking_lot = "0.11" precomputed-hash = "0.1.1" rayon = "1" -selectors = { path = "../selectors" } +selectors = { path = "../selectors", features = ["shmem"] } serde = { version = "1.0", optional = true, features = ["derive"] } servo_arc = { path = "../servo_arc" } servo_atoms = { path = "../atoms", optional = true } diff --git a/components/style_traits/Cargo.toml b/components/style_traits/Cargo.toml index 88c0aab1757..041c4305f77 100644 --- a/components/style_traits/Cargo.toml +++ b/components/style_traits/Cargo.toml @@ -21,7 +21,7 @@ euclid = "0.22" lazy_static = "1" malloc_size_of = { path = "../malloc_size_of" } malloc_size_of_derive = "0.1" -selectors = { path = "../selectors" } +selectors = { path = "../selectors", features = ["shmem"] } serde = "1.0" servo_arc = { path = "../servo_arc" } servo_atoms = { path = "../atoms", optional = true } diff --git a/tests/unit/style/Cargo.toml b/tests/unit/style/Cargo.toml index 826aa46a355..2fa49b6691b 100644 --- a/tests/unit/style/Cargo.toml +++ b/tests/unit/style/Cargo.toml @@ -16,7 +16,7 @@ euclid = "0.22" html5ever = "0.26" rayon = "1" serde_json = "1.0" -selectors = {path = "../../../components/selectors"} +selectors = {path = "../../../components/selectors", features = ["shmem"] } servo_arc = {path = "../../../components/servo_arc"} servo_atoms = {path = "../../../components/atoms"} servo_config = {path = "../../../components/config"}