diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py index 0aa15a8d5a6c..b06192bb6c1b 100644 --- a/components/script/dom/bindings/codegen/CodegenRust.py +++ b/components/script/dom/bindings/codegen/CodegenRust.py @@ -4927,7 +4927,6 @@ def struct(self): for m in self.memberInfo] return (string.Template( - "#[no_move]\n" + "pub struct ${selfName} {\n" + "${inheritance}" + "\n".join(memberDecls) + "\n" + diff --git a/components/script/dom/bindings/js.rs b/components/script/dom/bindings/js.rs index c78399189abb..f5d53423c6d4 100644 --- a/components/script/dom/bindings/js.rs +++ b/components/script/dom/bindings/js.rs @@ -453,7 +453,6 @@ impl OptionalRootedReference for Option>> { /// /// See also [*Exact Stack Rooting - Storing a GCPointer on the CStack*] /// (https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/Internals/GC/Exact_Stack_Rooting). -#[no_move] pub struct RootCollection { roots: UnsafeCell>, } diff --git a/components/script/dom/bindings/mod.rs b/components/script/dom/bindings/mod.rs index 394c7b722bfa..2ccae259b7bc 100644 --- a/components/script/dom/bindings/mod.rs +++ b/components/script/dom/bindings/mod.rs @@ -149,9 +149,7 @@ pub mod utils; /// Generated JS-Rust bindings. #[allow(missing_docs, non_snake_case)] pub mod codegen { - // FIXME(#5853) we shouldn't need to - // allow moved_no_move here - #[allow(unrooted_must_root, moved_no_move)] + #[allow(unrooted_must_root)] pub mod Bindings { include!(concat!(env!("OUT_DIR"), "/Bindings/mod.rs")); } diff --git a/components/script/dom/bindings/trace.rs b/components/script/dom/bindings/trace.rs index f18719073fc1..410f88a5f996 100644 --- a/components/script/dom/bindings/trace.rs +++ b/components/script/dom/bindings/trace.rs @@ -403,7 +403,7 @@ impl RootedTraceableSet { } } - fn remove(traceable: &T) { + unsafe fn remove(traceable: &T) { ROOTED_TRACEABLES.with(|ref traceables| { let mut traceables = traceables.borrow_mut(); let idx = @@ -416,7 +416,7 @@ impl RootedTraceableSet { }); } - fn add(traceable: &T) { + unsafe fn add(traceable: &T) { ROOTED_TRACEABLES.with(|ref traceables| { fn trace(obj: *const libc::c_void, tracer: *mut JSTracer) { let obj: &T = unsafe { &*(obj as *const T) }; @@ -453,14 +453,18 @@ pub struct RootedTraceable<'a, T: 'a + JSTraceable> { impl<'a, T: JSTraceable> RootedTraceable<'a, T> { /// Root a JSTraceable thing for the life of this RootedTraceable pub fn new(traceable: &'a T) -> RootedTraceable<'a, T> { - RootedTraceableSet::add(traceable); + unsafe { + RootedTraceableSet::add(traceable); + } RootedTraceable { ptr: traceable } } } impl<'a, T: JSTraceable> Drop for RootedTraceable<'a, T> { fn drop(&mut self) { - RootedTraceableSet::remove(self.ptr); + unsafe { + RootedTraceableSet::remove(self.ptr); + } } } @@ -482,15 +486,13 @@ impl RootedVec { return_address() as *const libc::c_void }; - RootedVec::new_with_destination_address(addr) + unsafe { RootedVec::new_with_destination_address(addr) } } /// Create a vector of items of type T. This constructor is specific /// for RootTraceableSet. - pub fn new_with_destination_address(addr: *const libc::c_void) -> RootedVec { - unsafe { - RootedTraceableSet::add::>(&*(addr as *const _)); - } + pub unsafe fn new_with_destination_address(addr: *const libc::c_void) -> RootedVec { + RootedTraceableSet::add::>(&*(addr as *const _)); RootedVec:: { v: vec!() } } } @@ -498,13 +500,15 @@ impl RootedVec { impl RootedVec> { /// Obtain a safe slice of references that can't outlive that RootedVec. pub fn r(&self) -> &[&T] { - unsafe { mem::transmute(&*self.v) } + unsafe { mem::transmute(&self.v[..]) } } } impl Drop for RootedVec { fn drop(&mut self) { - RootedTraceableSet::remove(self); + unsafe { + RootedTraceableSet::remove(self); + } } } @@ -524,9 +528,9 @@ impl DerefMut for RootedVec { impl FromIterator> for RootedVec> { #[allow(moved_no_move)] fn from_iter(iterable: T) -> RootedVec> where T: IntoIterator> { - let mut vec = RootedVec::new_with_destination_address(unsafe { - return_address() as *const libc::c_void - }); + let mut vec = unsafe { + RootedVec::new_with_destination_address(return_address() as *const libc::c_void) + }; vec.extend(iterable.into_iter().map(|item| JS::from_rooted(&item))); vec } diff --git a/components/script/script_task.rs b/components/script/script_task.rs index 4939a58e086f..dc3c97fbe307 100644 --- a/components/script/script_task.rs +++ b/components/script/script_task.rs @@ -89,6 +89,7 @@ use std::borrow::ToOwned; use std::cell::{Cell, RefCell}; use std::collections::HashSet; use std::io::{Write, stdout}; +use std::marker::PhantomData; use std::mem as std_mem; use std::option::Option; use std::ptr; @@ -334,18 +335,18 @@ impl TimerEventChan for MainThreadTimerEventChan { } } -pub struct StackRootTLS; +pub struct StackRootTLS<'a>(PhantomData<&'a u32>); -impl StackRootTLS { - pub fn new(roots: &RootCollection) -> StackRootTLS { +impl<'a> StackRootTLS<'a> { + pub fn new(roots: &'a RootCollection) -> StackRootTLS<'a> { STACK_ROOTS.with(|ref r| { r.set(Some(RootCollectionPtr(roots as *const _))) }); - StackRootTLS + StackRootTLS(PhantomData) } } -impl Drop for StackRootTLS { +impl<'a> Drop for StackRootTLS<'a> { fn drop(&mut self) { STACK_ROOTS.with(|ref r| r.set(None)); }