diff --git a/components/layout/flow.rs b/components/layout/flow.rs index 05512724843..fbcf7866931 100644 --- a/components/layout/flow.rs +++ b/components/layout/flow.rs @@ -44,7 +44,7 @@ use multicol::MulticolFlow; use parallel::FlowParallelInfo; use serde::ser::{Serialize, SerializeStruct, Serializer}; use servo_geometry::{au_rect_to_f32_rect, f32_rect_to_au_rect, max_rect}; -use std::{fmt, mem, raw}; +use std::{fmt, mem}; use std::iter::Zip; use std::slice::IterMut; use std::sync::Arc; @@ -453,7 +453,7 @@ pub trait Flow: fmt::Debug + Sync + Send + 'static { #[allow(unsafe_code)] pub fn base(this: &T) -> &BaseFlow { unsafe { - let obj = mem::transmute::<&&T, &raw::TraitObject>(&this); + let obj = mem::transmute::<&&T, &::TraitObject>(&this); mem::transmute::<*mut (), &BaseFlow>(obj.data) } } @@ -467,7 +467,7 @@ pub fn child_iter<'a>(flow: &'a Flow) -> FlowListIterator { #[allow(unsafe_code)] pub fn mut_base(this: &mut T) -> &mut BaseFlow { unsafe { - let obj = mem::transmute::<&&mut T, &raw::TraitObject>(&this); + let obj = mem::transmute::<&&mut T, &::TraitObject>(&this); mem::transmute::<*mut (), &mut BaseFlow>(obj.data) } } @@ -1422,7 +1422,7 @@ impl OpaqueFlow { #[allow(unsafe_code)] pub fn from_flow(flow: &Flow) -> OpaqueFlow { unsafe { - let object = mem::transmute::<&Flow, raw::TraitObject>(flow); + let object = mem::transmute::<&Flow, ::TraitObject>(flow); OpaqueFlow(object.data as usize) } } diff --git a/components/layout/lib.rs b/components/layout/lib.rs index eb337c4b015..ab8beba722a 100644 --- a/components/layout/lib.rs +++ b/components/layout/lib.rs @@ -4,7 +4,6 @@ #![deny(unsafe_code)] #![feature(box_patterns)] -#![feature(raw)] extern crate app_units; extern crate atomic_refcell; @@ -92,3 +91,12 @@ pub use self::data::LayoutData; // We can't use servo_arc for everything in layout, because the Flow stuff uses // weak references. use servo_arc::Arc as ServoArc; + +/// Stable copy of std::raw::TraitObject +/// test/unit/layout/lib.rs asserts that the memory layout matches. +#[repr(C)] +#[derive(Clone, Copy)] +pub struct TraitObject { + pub data: *mut (), + pub vtable: *mut (), +} diff --git a/components/servo/Cargo.toml b/components/servo/Cargo.toml index 27358a388b1..3f7f3c82598 100644 --- a/components/servo/Cargo.toml +++ b/components/servo/Cargo.toml @@ -20,8 +20,8 @@ googlevr = ["webvr/googlevr"] oculusvr = ["webvr/oculusvr"] unstable = [ "euclid/unstable", - "msg/unstable", "gfx/unstable", + "msg/unstable", "profile/unstable", ] diff --git a/tests/unit/layout/lib.rs b/tests/unit/layout/lib.rs index a763135260a..bc1d9dfd464 100644 --- a/tests/unit/layout/lib.rs +++ b/tests/unit/layout/lib.rs @@ -2,7 +2,36 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#![feature(raw)] + extern crate layout; #[macro_use] extern crate size_of_test; #[cfg(all(test, target_pointer_width = "64"))] mod size_of; + +use std::mem; +use std::ptr; +use std::raw; + +#[test] +fn test_trait_object_layout() { + assert_eq!(mem::size_of::(), mem::size_of::()); + let null: *mut () = ptr::null_mut(); + let a = raw::TraitObject { + data: null, + vtable: null, + }; + let b = layout::TraitObject { + data: null, + vtable: null, + }; + + fn offset(struct_: &T, field: &U) -> usize { + let addr_struct = struct_ as *const T as usize; + let addr_field = field as *const U as usize; + addr_field - addr_struct + } + + assert_eq!(offset(&a, &a.data), offset(&b, &b.data)); + assert_eq!(offset(&a, &a.vtable), offset(&b, &b.vtable)); +}