diff --git a/components/style/lib.rs b/components/style/lib.rs index bd33dbeafe4..cb73df55fcf 100644 --- a/components/style/lib.rs +++ b/components/style/lib.rs @@ -100,7 +100,6 @@ extern crate style_traits; extern crate thin_slice; extern crate time; extern crate to_shmem; -#[macro_use] extern crate to_shmem_derive; extern crate uluru; extern crate unicode_bidi; diff --git a/components/style/properties/longhands/color.mako.rs b/components/style/properties/longhands/color.mako.rs index 487814935aa..b367f2bbd86 100644 --- a/components/style/properties/longhands/color.mako.rs +++ b/components/style/properties/longhands/color.mako.rs @@ -67,6 +67,7 @@ pub mod system_colors { use crate::gecko_bindings::structs::root::mozilla::LookAndFeel_ColorID; use std::fmt::{self, Write}; use style_traits::{CssWriter, ToCss}; + use to_shmem::impl_trivial_to_shmem; use crate::values::computed::{Context, ToComputedValue}; pub type SystemColor = LookAndFeel_ColorID; @@ -75,6 +76,8 @@ pub mod system_colors { // is a bindgen type. So we implement it on the typedef instead. malloc_size_of_is_0!(SystemColor); + impl_trivial_to_shmem!(SystemColor); + impl ToCss for SystemColor { fn to_css(&self, dest: &mut CssWriter) -> fmt::Result where diff --git a/components/style/properties/properties.mako.rs b/components/style/properties/properties.mako.rs index c9bc2bd8e2f..2f1760ada9c 100644 --- a/components/style/properties/properties.mako.rs +++ b/components/style/properties/properties.mako.rs @@ -36,6 +36,7 @@ use selectors::parser::SelectorParseErrorKind; #[cfg(feature = "servo")] use servo_config::prefs; use style_traits::{CssWriter, KeywordsCollectFn, ParseError, ParsingMode}; use style_traits::{SpecifiedValueInfo, StyleParseErrorKind, ToCss}; +use to_shmem::impl_trivial_to_shmem; use crate::stylesheets::{CssRuleType, Origin, UrlExtraData}; use crate::values::generics::text::LineHeight; use crate::values::computed; @@ -741,11 +742,13 @@ static ${name}: LonghandIdSet = LonghandIdSet { /// A set of longhand properties -#[derive(Clone, Debug, Default, MallocSizeOf, PartialEq)] +#[derive(Clone, Copy, Debug, Default, MallocSizeOf, PartialEq)] pub struct LonghandIdSet { storage: [u32; (${len(data.longhands)} - 1 + 32) / 32] } +impl_trivial_to_shmem!(LonghandIdSet); + /// An iterator over a set of longhand ids. pub struct LonghandIdSetIterator<'a> { longhands: &'a LonghandIdSet, diff --git a/components/style/stylesheets/import_rule.rs b/components/style/stylesheets/import_rule.rs index 357f0476281..ca82dcb864b 100644 --- a/components/style/stylesheets/import_rule.rs +++ b/components/style/stylesheets/import_rule.rs @@ -15,7 +15,9 @@ use crate::stylesheets::{CssRule, Origin, StylesheetInDocument}; use crate::values::CssUrl; use cssparser::SourceLocation; use std::fmt::{self, Write}; +use std::mem::ManuallyDrop; use style_traits::{CssWriter, ToCss}; +use to_shmem::{SharedMemoryBuilder, ToShmem}; /// With asynchronous stylesheet parsing, we can't synchronously create a /// GeckoStyleSheet. So we use this placeholder instead. @@ -180,6 +182,12 @@ pub struct ImportRule { pub source_location: SourceLocation, } +impl ToShmem for ImportRule { + fn to_shmem(&self, _builder: &mut SharedMemoryBuilder) -> ManuallyDrop { + panic!("ToShmem failed for ImportRule: cannot handle imported style sheets") + } +} + impl DeepCloneWithLock for ImportRule { fn deep_clone_with_lock( &self, diff --git a/components/style/values/mod.rs b/components/style/values/mod.rs index e29b8923af7..b555598317b 100644 --- a/components/style/values/mod.rs +++ b/components/style/values/mod.rs @@ -17,6 +17,7 @@ use selectors::parser::SelectorParseErrorKind; use std::fmt::{self, Debug, Write}; use std::hash; use style_traits::{CssWriter, ParseError, StyleParseErrorKind, ToCss}; +use to_shmem::impl_trivial_to_shmem; #[cfg(feature = "gecko")] pub use crate::gecko::url::CssUrl; @@ -108,6 +109,8 @@ impl ComputeSquaredDistance for Impossible { } } +impl_trivial_to_shmem!(Impossible); + impl Parse for Impossible { fn parse<'i, 't>( _context: &ParserContext, diff --git a/components/to_shmem/Cargo.toml b/components/to_shmem/Cargo.toml index 666011d498f..84c28f46251 100644 --- a/components/to_shmem/Cargo.toml +++ b/components/to_shmem/Cargo.toml @@ -10,7 +10,9 @@ name = "to_shmem" path = "lib.rs" [features] -servo = [] +servo = ["serde", "cssparser/serde"] gecko = [] [dependencies] +cssparser = "0.25" +serde = {version = "1.0", optional = true} diff --git a/components/to_shmem/lib.rs b/components/to_shmem/lib.rs index 36b1353d08a..ceffc1c5b87 100644 --- a/components/to_shmem/lib.rs +++ b/components/to_shmem/lib.rs @@ -12,13 +12,18 @@ #![crate_name = "to_shmem"] #![crate_type = "rlib"] +extern crate cssparser; + use std::alloc::Layout; #[cfg(debug_assertions)] use std::any::TypeId; use std::isize; #[cfg(debug_assertions)] use std::collections::HashSet; +use std::marker::PhantomData; use std::mem::{self, ManuallyDrop}; +use std::num::Wrapping; +use std::ops::Range; #[cfg(debug_assertions)] use std::os::raw::c_void; use std::ptr::{self, NonNull}; @@ -173,3 +178,62 @@ pub trait ToShmem: Sized { /// accidentally invoke the destructor of the value that is produced. fn to_shmem(&self, builder: &mut SharedMemoryBuilder) -> ManuallyDrop; } + +#[macro_export] +macro_rules! impl_trivial_to_shmem { + ($($ty:ty),*) => {$( + impl $crate::ToShmem for $ty { + fn to_shmem( + &self, + _builder: &mut $crate::SharedMemoryBuilder, + ) -> ::std::mem::ManuallyDrop { + ::std::mem::ManuallyDrop::new(*self) + } + } + )*}; +} + +impl_trivial_to_shmem!((), bool, f32, f64, i8, i16, i32, i64, u8, u16, u32, u64, isize, usize); + +impl_trivial_to_shmem!(cssparser::RGBA); +impl_trivial_to_shmem!(cssparser::SourceLocation); +impl_trivial_to_shmem!(cssparser::TokenSerializationType); + +impl ToShmem for PhantomData { + fn to_shmem(&self, _builder: &mut SharedMemoryBuilder) -> ManuallyDrop { + ManuallyDrop::new(*self) + } +} + +impl ToShmem for Range { + fn to_shmem(&self, builder: &mut SharedMemoryBuilder) -> ManuallyDrop { + ManuallyDrop::new(Range { + start: ManuallyDrop::into_inner(self.start.to_shmem(builder)), + end: ManuallyDrop::into_inner(self.end.to_shmem(builder)), + }) + } +} + +impl ToShmem for cssparser::UnicodeRange { + fn to_shmem(&self, _builder: &mut SharedMemoryBuilder) -> ManuallyDrop { + ManuallyDrop::new(cssparser::UnicodeRange { + start: self.start, + end: self.end, + }) + } +} + +impl ToShmem for (T, U) { + fn to_shmem(&self, builder: &mut SharedMemoryBuilder) -> ManuallyDrop { + ManuallyDrop::new(( + ManuallyDrop::into_inner(self.0.to_shmem(builder)), + ManuallyDrop::into_inner(self.1.to_shmem(builder)), + )) + } +} + +impl ToShmem for Wrapping { + fn to_shmem(&self, builder: &mut SharedMemoryBuilder) -> ManuallyDrop { + ManuallyDrop::new(Wrapping(ManuallyDrop::into_inner(self.0.to_shmem(builder)))) + } +}