mirror of
https://github.com/servo/servo.git
synced 2025-08-03 20:50:07 +01:00
Replace NonZeroU32 and NonZeroUsize with a generic NonZero
The API is identical to core::nonzero::NonZero
This commit is contained in:
parent
4ee1b26b6c
commit
9e4865b6c8
7 changed files with 115 additions and 67 deletions
|
@ -3,7 +3,7 @@
|
||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
use euclid::Size2D;
|
use euclid::Size2D;
|
||||||
use nonzero::NonZeroU32;
|
use nonzero::NonZero;
|
||||||
use offscreen_gl_context::{GLContextAttributes, GLLimits};
|
use offscreen_gl_context::{GLContextAttributes, GLLimits};
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
use webrender_api;
|
use webrender_api;
|
||||||
|
@ -242,13 +242,13 @@ pub enum WebGLCommand {
|
||||||
macro_rules! define_resource_id_struct {
|
macro_rules! define_resource_id_struct {
|
||||||
($name:ident) => {
|
($name:ident) => {
|
||||||
#[derive(Clone, Copy, Eq, Hash, PartialEq)]
|
#[derive(Clone, Copy, Eq, Hash, PartialEq)]
|
||||||
pub struct $name(NonZeroU32);
|
pub struct $name(NonZero<u32>);
|
||||||
|
|
||||||
impl $name {
|
impl $name {
|
||||||
#[allow(unsafe_code)]
|
#[allow(unsafe_code)]
|
||||||
#[inline]
|
#[inline]
|
||||||
pub unsafe fn new(id: u32) -> Self {
|
pub unsafe fn new(id: u32) -> Self {
|
||||||
$name(NonZeroU32::new_unchecked(id))
|
$name(NonZero::new_unchecked(id))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
|
|
@ -13,7 +13,7 @@ use image::{DynamicImage, ImageFormat, RgbImage};
|
||||||
use ipc_channel::ipc::{self, IpcSharedMemory};
|
use ipc_channel::ipc::{self, IpcSharedMemory};
|
||||||
use msg::constellation_msg::{PipelineId, PipelineIndex, PipelineNamespaceId};
|
use msg::constellation_msg::{PipelineId, PipelineIndex, PipelineNamespaceId};
|
||||||
use net_traits::image::base::{Image, PixelFormat};
|
use net_traits::image::base::{Image, PixelFormat};
|
||||||
use nonzero::NonZeroU32;
|
use nonzero::NonZero;
|
||||||
use profile_traits::time::{self, ProfilerCategory, profile};
|
use profile_traits::time::{self, ProfilerCategory, profile};
|
||||||
use script_traits::{AnimationState, AnimationTickType, ConstellationControlMsg};
|
use script_traits::{AnimationState, AnimationTickType, ConstellationControlMsg};
|
||||||
use script_traits::{ConstellationMsg, LayoutControlMsg, MouseButton};
|
use script_traits::{ConstellationMsg, LayoutControlMsg, MouseButton};
|
||||||
|
@ -62,7 +62,7 @@ impl ConvertPipelineIdFromWebRender for webrender_api::PipelineId {
|
||||||
fn from_webrender(&self) -> PipelineId {
|
fn from_webrender(&self) -> PipelineId {
|
||||||
PipelineId {
|
PipelineId {
|
||||||
namespace_id: PipelineNamespaceId(self.0),
|
namespace_id: PipelineNamespaceId(self.0),
|
||||||
index: PipelineIndex(NonZeroU32::new(self.1).expect("Webrender pipeline zero?")),
|
index: PipelineIndex(NonZero::new(self.1).expect("Webrender pipeline zero?")),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,7 +36,7 @@ use html5ever::{LocalName, Namespace};
|
||||||
use layout::data::StyleAndLayoutData;
|
use layout::data::StyleAndLayoutData;
|
||||||
use layout::wrapper::GetRawData;
|
use layout::wrapper::GetRawData;
|
||||||
use msg::constellation_msg::{BrowsingContextId, PipelineId};
|
use msg::constellation_msg::{BrowsingContextId, PipelineId};
|
||||||
use nonzero::NonZeroUsize;
|
use nonzero::NonZero;
|
||||||
use range::Range;
|
use range::Range;
|
||||||
use script::layout_exports::{CAN_BE_FRAGMENTED, HAS_DIRTY_DESCENDANTS, IS_IN_DOC};
|
use script::layout_exports::{CAN_BE_FRAGMENTED, HAS_DIRTY_DESCENDANTS, IS_IN_DOC};
|
||||||
use script::layout_exports::{CharacterDataTypeId, ElementTypeId, HTMLElementTypeId, NodeTypeId};
|
use script::layout_exports::{CharacterDataTypeId, ElementTypeId, HTMLElementTypeId, NodeTypeId};
|
||||||
|
@ -235,8 +235,7 @@ impl<'ln> LayoutNode for ServoLayoutNode<'ln> {
|
||||||
let ptr: *mut StyleAndLayoutData =
|
let ptr: *mut StyleAndLayoutData =
|
||||||
Box::into_raw(Box::new(StyleAndLayoutData::new()));
|
Box::into_raw(Box::new(StyleAndLayoutData::new()));
|
||||||
let opaque = OpaqueStyleAndLayoutData {
|
let opaque = OpaqueStyleAndLayoutData {
|
||||||
ptr: NonZeroUsize::new_unchecked(ptr as usize),
|
ptr: NonZero::new_unchecked(ptr as *mut StyleData),
|
||||||
phantom: PhantomData,
|
|
||||||
};
|
};
|
||||||
self.init_style_and_layout_data(opaque);
|
self.init_style_and_layout_data(opaque);
|
||||||
};
|
};
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
//! The high-level interface from script to constellation. Using this abstract interface helps
|
//! The high-level interface from script to constellation. Using this abstract interface helps
|
||||||
//! reduce coupling between these two components.
|
//! reduce coupling between these two components.
|
||||||
|
|
||||||
use nonzero::NonZeroU32;
|
use nonzero::NonZero;
|
||||||
use std::cell::Cell;
|
use std::cell::Cell;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
use webrender_api;
|
use webrender_api;
|
||||||
|
@ -195,9 +195,9 @@ impl PipelineNamespace {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
fn next_index(&mut self) -> NonZeroU32 {
|
fn next_index(&mut self) -> NonZero<u32> {
|
||||||
self.index += 1;
|
self.index += 1;
|
||||||
NonZeroU32::new(self.index).expect("pipeline id index wrapped!")
|
NonZero::new(self.index).expect("pipeline id index wrapped!")
|
||||||
}
|
}
|
||||||
|
|
||||||
fn next_pipeline_id(&mut self) -> PipelineId {
|
fn next_pipeline_id(&mut self) -> PipelineId {
|
||||||
|
@ -221,7 +221,7 @@ thread_local!(pub static PIPELINE_NAMESPACE: Cell<Option<PipelineNamespace>> = C
|
||||||
pub struct PipelineNamespaceId(pub u32);
|
pub struct PipelineNamespaceId(pub u32);
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)]
|
#[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)]
|
||||||
pub struct PipelineIndex(pub NonZeroU32);
|
pub struct PipelineIndex(pub NonZero<u32>);
|
||||||
known_heap_size!(0, PipelineIndex);
|
known_heap_size!(0, PipelineIndex);
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, HeapSizeOf, Ord, PartialEq, PartialOrd, Serialize)]
|
#[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, HeapSizeOf, Ord, PartialEq, PartialOrd, Serialize)]
|
||||||
|
@ -264,7 +264,7 @@ impl fmt::Display for PipelineId {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)]
|
#[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)]
|
||||||
pub struct BrowsingContextIndex(pub NonZeroU32);
|
pub struct BrowsingContextIndex(pub NonZero<u32>);
|
||||||
known_heap_size!(0, BrowsingContextIndex);
|
known_heap_size!(0, BrowsingContextIndex);
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, HeapSizeOf, Ord, PartialEq, PartialOrd, Serialize)]
|
#[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, HeapSizeOf, Ord, PartialEq, PartialOrd, Serialize)]
|
||||||
|
@ -340,13 +340,13 @@ impl PartialEq<BrowsingContextId> for TopLevelBrowsingContextId {
|
||||||
pub const TEST_NAMESPACE: PipelineNamespaceId = PipelineNamespaceId(1234);
|
pub const TEST_NAMESPACE: PipelineNamespaceId = PipelineNamespaceId(1234);
|
||||||
#[allow(unsafe_code)]
|
#[allow(unsafe_code)]
|
||||||
#[cfg(feature = "unstable")]
|
#[cfg(feature = "unstable")]
|
||||||
pub const TEST_PIPELINE_INDEX: PipelineIndex = unsafe { PipelineIndex(NonZeroU32::new_unchecked(5678)) };
|
pub const TEST_PIPELINE_INDEX: PipelineIndex = unsafe { PipelineIndex(NonZero::new_unchecked(5678)) };
|
||||||
#[cfg(feature = "unstable")]
|
#[cfg(feature = "unstable")]
|
||||||
pub const TEST_PIPELINE_ID: PipelineId = PipelineId { namespace_id: TEST_NAMESPACE, index: TEST_PIPELINE_INDEX };
|
pub const TEST_PIPELINE_ID: PipelineId = PipelineId { namespace_id: TEST_NAMESPACE, index: TEST_PIPELINE_INDEX };
|
||||||
#[allow(unsafe_code)]
|
#[allow(unsafe_code)]
|
||||||
#[cfg(feature = "unstable")]
|
#[cfg(feature = "unstable")]
|
||||||
pub const TEST_BROWSING_CONTEXT_INDEX: BrowsingContextIndex =
|
pub const TEST_BROWSING_CONTEXT_INDEX: BrowsingContextIndex =
|
||||||
unsafe { BrowsingContextIndex(NonZeroU32::new_unchecked(8765)) };
|
unsafe { BrowsingContextIndex(NonZero::new_unchecked(8765)) };
|
||||||
#[cfg(feature = "unstable")]
|
#[cfg(feature = "unstable")]
|
||||||
pub const TEST_BROWSING_CONTEXT_ID: BrowsingContextId =
|
pub const TEST_BROWSING_CONTEXT_ID: BrowsingContextId =
|
||||||
BrowsingContextId { namespace_id: TEST_NAMESPACE, index: TEST_BROWSING_CONTEXT_INDEX };
|
BrowsingContextId { namespace_id: TEST_NAMESPACE, index: TEST_BROWSING_CONTEXT_INDEX };
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
#![cfg_attr(feature = "unstable", feature(const_fn))]
|
#![cfg_attr(feature = "unstable", feature(const_fn))]
|
||||||
#![cfg_attr(feature = "unstable", feature(const_nonzero_new))]
|
#![cfg_attr(feature = "unstable", feature(const_nonzero_new))]
|
||||||
|
|
||||||
#[macro_use]
|
#[cfg_attr(not(feature = "unstable"), macro_use)]
|
||||||
extern crate serde;
|
extern crate serde;
|
||||||
|
|
||||||
pub use imp::*;
|
pub use imp::*;
|
||||||
|
@ -17,74 +17,125 @@ pub use imp::*;
|
||||||
#[cfg(feature = "unstable")]
|
#[cfg(feature = "unstable")]
|
||||||
mod imp {
|
mod imp {
|
||||||
extern crate core;
|
extern crate core;
|
||||||
use self::core::nonzero::NonZero;
|
use self::core::nonzero::NonZero as CoreNonZero;
|
||||||
|
use serde::{Serialize, Serializer, Deserialize, Deserializer};
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)]
|
pub use self::core::nonzero::Zeroable;
|
||||||
pub struct NonZeroU32(NonZero<u32>);
|
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)]
|
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
|
||||||
pub struct NonZeroUsize(NonZero<usize>);
|
pub struct NonZero<T: Zeroable>(CoreNonZero<T>);
|
||||||
|
|
||||||
impl NonZeroU32 {
|
impl<T: Zeroable> NonZero<T> {
|
||||||
#[inline] pub const unsafe fn new_unchecked(x: u32) -> Self { NonZeroU32(NonZero::new_unchecked(x)) }
|
#[inline]
|
||||||
#[inline] pub fn new(x: u32) -> Option<Self> { NonZero::new(x).map(NonZeroU32) }
|
pub const unsafe fn new_unchecked(x: T) -> Self {
|
||||||
#[inline] pub fn get(self) -> u32 { self.0.get() }
|
NonZero(CoreNonZero::new_unchecked(x))
|
||||||
}
|
}
|
||||||
|
|
||||||
impl NonZeroUsize {
|
#[inline]
|
||||||
#[inline] pub const unsafe fn new_unchecked(x: usize) -> Self { NonZeroUsize(NonZero::new_unchecked(x)) }
|
pub fn new(x: T) -> Option<Self> {
|
||||||
#[inline] pub fn new(x: usize) -> Option<Self> { NonZero::new(x).map(NonZeroUsize) }
|
CoreNonZero::new(x).map(NonZero)
|
||||||
#[inline] pub fn get(self) -> usize { self.0.get() }
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn get(self) -> T {
|
||||||
|
self.0.get()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Not using derive because of the additional Clone bound required by the inner impl
|
||||||
|
|
||||||
|
impl<T> Serialize for NonZero<T>
|
||||||
|
where
|
||||||
|
T: Serialize + Zeroable + Clone,
|
||||||
|
{
|
||||||
|
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||||
|
where
|
||||||
|
S: Serializer,
|
||||||
|
{
|
||||||
|
self.0.serialize(serializer)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'de, T> Deserialize<'de> for NonZero<T>
|
||||||
|
where
|
||||||
|
T: Deserialize<'de> + Zeroable,
|
||||||
|
{
|
||||||
|
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||||
|
where
|
||||||
|
D: Deserializer<'de>,
|
||||||
|
{
|
||||||
|
CoreNonZero::deserialize(deserializer).map(NonZero)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(not(feature = "unstable"))]
|
#[cfg(not(feature = "unstable"))]
|
||||||
mod imp {
|
mod imp {
|
||||||
#[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)]
|
#[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)]
|
||||||
pub struct NonZeroU32(u32);
|
pub struct NonZero<T: Zeroable>(T);
|
||||||
|
|
||||||
impl NonZeroU32 {
|
impl<T: Zeroable> NonZero<T> {
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn new(x: u32) -> Option<Self> {
|
pub unsafe fn new_unchecked(x: T) -> Self {
|
||||||
if x != 0 {
|
NonZero(x)
|
||||||
Some(NonZeroU32(x))
|
}
|
||||||
} else {
|
|
||||||
|
#[inline]
|
||||||
|
pub fn new(x: T) -> Option<Self> {
|
||||||
|
if x.is_zero() {
|
||||||
None
|
None
|
||||||
|
} else {
|
||||||
|
Some(NonZero(x))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub unsafe fn new_unchecked(x: u32) -> Self {
|
pub fn get(self) -> T {
|
||||||
NonZeroU32(x)
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
pub fn get(self) -> u32 {
|
|
||||||
self.0
|
self.0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)]
|
/// Unsafe trait to indicate what types are usable with the NonZero struct
|
||||||
pub struct NonZeroUsize(usize);
|
pub unsafe trait Zeroable {
|
||||||
|
/// Whether this value is zero
|
||||||
|
fn is_zero(&self) -> bool;
|
||||||
|
}
|
||||||
|
|
||||||
impl NonZeroUsize {
|
macro_rules! impl_zeroable_for_pointer_types {
|
||||||
|
( $( $Ptr: ty )+ ) => {
|
||||||
|
$(
|
||||||
|
/// For fat pointers to be considered "zero", only the "data" part needs to be null.
|
||||||
|
unsafe impl<T: ?Sized> Zeroable for $Ptr {
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn new(x: usize) -> Option<Self> {
|
fn is_zero(&self) -> bool {
|
||||||
if x != 0 {
|
// Cast because `is_null` is only available on thin pointers
|
||||||
Some(NonZeroUsize(x))
|
(*self as *mut u8).is_null()
|
||||||
} else {
|
}
|
||||||
None
|
}
|
||||||
|
)+
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
macro_rules! impl_zeroable_for_integer_types {
|
||||||
|
( $( $Int: ty )+ ) => {
|
||||||
|
$(
|
||||||
|
unsafe impl Zeroable for $Int {
|
||||||
#[inline]
|
#[inline]
|
||||||
pub unsafe fn new_unchecked(x: usize) -> Self {
|
fn is_zero(&self) -> bool {
|
||||||
NonZeroUsize(x)
|
*self == 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)+
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
impl_zeroable_for_pointer_types! {
|
||||||
pub fn get(self) -> usize {
|
*const T
|
||||||
self.0
|
*mut T
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl_zeroable_for_integer_types! {
|
||||||
|
usize u8 u16 u32 u64
|
||||||
|
isize i8 i16 i32 i64
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,7 @@ extern crate nonzero;
|
||||||
#[macro_use] extern crate lazy_static;
|
#[macro_use] extern crate lazy_static;
|
||||||
#[macro_use] extern crate log;
|
#[macro_use] extern crate log;
|
||||||
|
|
||||||
use nonzero::NonZeroUsize;
|
use nonzero::NonZero;
|
||||||
use std::cell::{Cell, UnsafeCell};
|
use std::cell::{Cell, UnsafeCell};
|
||||||
use std::ops::Deref;
|
use std::ops::Deref;
|
||||||
use std::sync::{LockResult, Mutex, MutexGuard, PoisonError, TryLockError, TryLockResult};
|
use std::sync::{LockResult, Mutex, MutexGuard, PoisonError, TryLockError, TryLockResult};
|
||||||
|
@ -25,7 +25,7 @@ use std::sync::atomic::{AtomicUsize, Ordering};
|
||||||
// TODO: can we use the thread-id crate for this?
|
// TODO: can we use the thread-id crate for this?
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
|
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
|
||||||
pub struct ThreadId(NonZeroUsize);
|
pub struct ThreadId(NonZero<usize>);
|
||||||
|
|
||||||
lazy_static!{ static ref THREAD_COUNT: AtomicUsize = AtomicUsize::new(1); }
|
lazy_static!{ static ref THREAD_COUNT: AtomicUsize = AtomicUsize::new(1); }
|
||||||
|
|
||||||
|
@ -33,7 +33,7 @@ impl ThreadId {
|
||||||
#[allow(unsafe_code)]
|
#[allow(unsafe_code)]
|
||||||
fn new() -> ThreadId {
|
fn new() -> ThreadId {
|
||||||
let number = THREAD_COUNT.fetch_add(1, Ordering::SeqCst);
|
let number = THREAD_COUNT.fetch_add(1, Ordering::SeqCst);
|
||||||
ThreadId(NonZeroUsize::new(number).unwrap())
|
ThreadId(NonZero::new(number).unwrap())
|
||||||
}
|
}
|
||||||
pub fn current() -> ThreadId {
|
pub fn current() -> ThreadId {
|
||||||
THREAD_ID.with(|tls| tls.clone())
|
THREAD_ID.with(|tls| tls.clone())
|
||||||
|
@ -57,13 +57,13 @@ impl AtomicOptThreadId {
|
||||||
#[allow(unsafe_code)]
|
#[allow(unsafe_code)]
|
||||||
pub fn load(&self, ordering: Ordering) -> Option<ThreadId> {
|
pub fn load(&self, ordering: Ordering) -> Option<ThreadId> {
|
||||||
let number = self.0.load(ordering);
|
let number = self.0.load(ordering);
|
||||||
NonZeroUsize::new(number).map(ThreadId)
|
NonZero::new(number).map(ThreadId)
|
||||||
}
|
}
|
||||||
#[allow(unsafe_code)]
|
#[allow(unsafe_code)]
|
||||||
pub fn swap(&self, value: Option<ThreadId>, ordering: Ordering) -> Option<ThreadId> {
|
pub fn swap(&self, value: Option<ThreadId>, ordering: Ordering) -> Option<ThreadId> {
|
||||||
let number = value.map(|id| id.0.get()).unwrap_or(0);
|
let number = value.map(|id| id.0.get()).unwrap_or(0);
|
||||||
let number = self.0.swap(number, ordering);
|
let number = self.0.swap(number, ordering);
|
||||||
NonZeroUsize::new(number).map(ThreadId)
|
NonZero::new(number).map(ThreadId)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -45,10 +45,9 @@ use canvas_traits::canvas::CanvasMsg;
|
||||||
use ipc_channel::ipc::IpcSender;
|
use ipc_channel::ipc::IpcSender;
|
||||||
use libc::c_void;
|
use libc::c_void;
|
||||||
use net_traits::image_cache::PendingImageId;
|
use net_traits::image_cache::PendingImageId;
|
||||||
use nonzero::NonZeroUsize;
|
use nonzero::NonZero;
|
||||||
use script_traits::UntrustedNodeAddress;
|
use script_traits::UntrustedNodeAddress;
|
||||||
use servo_url::ServoUrl;
|
use servo_url::ServoUrl;
|
||||||
use std::marker::PhantomData;
|
|
||||||
use std::sync::atomic::AtomicIsize;
|
use std::sync::atomic::AtomicIsize;
|
||||||
use style::data::ElementData;
|
use style::data::ElementData;
|
||||||
|
|
||||||
|
@ -78,8 +77,7 @@ pub struct OpaqueStyleAndLayoutData {
|
||||||
// NB: We really store a `StyleAndLayoutData` here, so be careful!
|
// NB: We really store a `StyleAndLayoutData` here, so be careful!
|
||||||
#[ignore_heap_size_of = "TODO(#6910) Box value that should be counted but \
|
#[ignore_heap_size_of = "TODO(#6910) Box value that should be counted but \
|
||||||
the type lives in layout"]
|
the type lives in layout"]
|
||||||
pub ptr: NonZeroUsize,
|
pub ptr: NonZero<*mut StyleData>,
|
||||||
pub phantom: PhantomData<*mut StyleData>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(unsafe_code)]
|
#[allow(unsafe_code)]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue