From 1f966535ac71bf64fe2d944edeeef854d72cda45 Mon Sep 17 00:00:00 2001 From: Cameron McCormack Date: Sat, 30 Mar 2019 00:16:21 +0000 Subject: [PATCH] style: Add ToShmem impl for UrlExtraData. Differential Revision: https://phabricator.services.mozilla.com/D17195 --- components/style/stylesheets/mod.rs | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/components/style/stylesheets/mod.rs b/components/style/stylesheets/mod.rs index 8e4ec499a05..3dfc4a02727 100644 --- a/components/style/stylesheets/mod.rs +++ b/components/style/stylesheets/mod.rs @@ -37,8 +37,9 @@ use malloc_size_of::{MallocSizeOfOps, MallocUnconditionalShallowSizeOf}; use servo_arc::Arc; use std::fmt; #[cfg(feature = "gecko")] -use std::mem; +use std::mem::{self, ManuallyDrop}; use style_traits::ParsingMode; +use to_shmem::{SharedMemoryBuilder, ToShmem}; pub use self::counter_style_rule::CounterStyleRule; pub use self::document_rule::DocumentRule; @@ -101,6 +102,26 @@ impl Drop for UrlExtraData { } } +#[cfg(feature = "gecko")] +impl ToShmem for UrlExtraData { + fn to_shmem(&self, _builder: &mut SharedMemoryBuilder) -> ManuallyDrop { + if self.0 & 1 == 0 { + let shared_extra_datas = unsafe { &structs::URLExtraData_sShared }; + let self_ptr = self.as_ref() as *const _ as *mut _; + let sheet_id = shared_extra_datas + .iter() + .position(|r| r.mRawPtr == self_ptr) + .expect( + "ToShmem failed for UrlExtraData: expected sheet's URLExtraData to be in \ + URLExtraData::sShared", + ); + ManuallyDrop::new(UrlExtraData((sheet_id << 1) | 1)) + } else { + ManuallyDrop::new(UrlExtraData(self.0)) + } + } +} + #[cfg(feature = "gecko")] impl UrlExtraData { /// Create a new UrlExtraData wrapping a pointer to the specified Gecko