aboutsummaryrefslogtreecommitdiffstats
path: root/components
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2015-11-03 11:19:52 -0800
committerEli Friedman <eli.friedman@gmail.com>2015-11-07 21:17:24 -0800
commit1a50fce67c840123447c9949c9692f4bb5828e5d (patch)
tree43576152ca427142e751abb6de042690499ee638 /components
parentdb1163b1eceb5fef6463c4425e99d974a85a50a8 (diff)
downloadservo-1a50fce67c840123447c9949c9692f4bb5828e5d.tar.gz
servo-1a50fce67c840123447c9949c9692f4bb5828e5d.zip
Clean up some code related to #[no_move].
The patch makes RootCollection a bit safer by making the StackRootTLS hold it in place. The use of no_move in CodeGenRust was leftover from when roots couldn't be moved.
Diffstat (limited to 'components')
-rw-r--r--components/script/dom/bindings/codegen/CodegenRust.py1
-rw-r--r--components/script/dom/bindings/js.rs1
-rw-r--r--components/script/dom/bindings/mod.rs4
-rw-r--r--components/script/dom/bindings/trace.rs32
-rw-r--r--components/script/script_task.rs11
5 files changed, 25 insertions, 24 deletions
diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py
index 0aa15a8d5a6..b06192bb6c1 100644
--- a/components/script/dom/bindings/codegen/CodegenRust.py
+++ b/components/script/dom/bindings/codegen/CodegenRust.py
@@ -4927,7 +4927,6 @@ class CGDictionary(CGThing):
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 c78399189ab..f5d53423c6d 100644
--- a/components/script/dom/bindings/js.rs
+++ b/components/script/dom/bindings/js.rs
@@ -453,7 +453,6 @@ impl<T: Reflectable> OptionalRootedReference<T> for Option<Option<Root<T>>> {
///
/// 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<Vec<*const Reflector>>,
}
diff --git a/components/script/dom/bindings/mod.rs b/components/script/dom/bindings/mod.rs
index 394c7b722bf..2ccae259b7b 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 f18719073fc..410f88a5f99 100644
--- a/components/script/dom/bindings/trace.rs
+++ b/components/script/dom/bindings/trace.rs
@@ -403,7 +403,7 @@ impl RootedTraceableSet {
}
}
- fn remove<T: JSTraceable>(traceable: &T) {
+ unsafe fn remove<T: JSTraceable>(traceable: &T) {
ROOTED_TRACEABLES.with(|ref traceables| {
let mut traceables = traceables.borrow_mut();
let idx =
@@ -416,7 +416,7 @@ impl RootedTraceableSet {
});
}
- fn add<T: JSTraceable>(traceable: &T) {
+ unsafe fn add<T: JSTraceable>(traceable: &T) {
ROOTED_TRACEABLES.with(|ref traceables| {
fn trace<T: JSTraceable>(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<T: JSTraceable> RootedVec<T> {
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<T> {
- unsafe {
- RootedTraceableSet::add::<RootedVec<T>>(&*(addr as *const _));
- }
+ pub unsafe fn new_with_destination_address(addr: *const libc::c_void) -> RootedVec<T> {
+ RootedTraceableSet::add::<RootedVec<T>>(&*(addr as *const _));
RootedVec::<T> { v: vec!() }
}
}
@@ -498,13 +500,15 @@ impl<T: JSTraceable> RootedVec<T> {
impl<T: JSTraceable + Reflectable> RootedVec<JS<T>> {
/// 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<T: JSTraceable> Drop for RootedVec<T> {
fn drop(&mut self) {
- RootedTraceableSet::remove(self);
+ unsafe {
+ RootedTraceableSet::remove(self);
+ }
}
}
@@ -524,9 +528,9 @@ impl<T: JSTraceable> DerefMut for RootedVec<T> {
impl<A: JSTraceable + Reflectable> FromIterator<Root<A>> for RootedVec<JS<A>> {
#[allow(moved_no_move)]
fn from_iter<T>(iterable: T) -> RootedVec<JS<A>> where T: IntoIterator<Item=Root<A>> {
- 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 4939a58e086..dc3c97fbe30 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));
}