diff --git a/components/script/dom/bindings/trace.rs b/components/script/dom/bindings/trace.rs index d7d0cc51e9c..14d23920ab9 100644 --- a/components/script/dom/bindings/trace.rs +++ b/components/script/dom/bindings/trace.rs @@ -318,16 +318,20 @@ impl JSTraceable for () { /// Holds a set of vectors that need to be rooted pub struct RootedCollectionSet { - set: Vec>> + set: Vec>> } /// TLV Holds a set of vectors that need to be rooted thread_local!(pub static ROOTED_COLLECTIONS: Rc> = Rc::new(RefCell::new(RootedCollectionSet::new()))); -enum CollectionType { +/// Type of `RootedVec` +pub enum CollectionType { + /// DOM objects DOMObjects, + /// `JSVal`s JSVals, + /// `*mut JSObject`s JSObjects, } @@ -356,10 +360,12 @@ impl RootedCollectionSet { } unsafe fn trace(&self, tracer: *mut JSTracer) { - fn trace_collection_type(tracer: *mut JSTracer, - collections: &HashSet<*const RootedVec<()>>) { + fn trace_collection_type(tracer: *mut JSTracer, + collections: &HashSet<*const RootedVec>) + where T: JSTraceable + VecRootableType + { for collection in collections { - let collection: *const RootedVec<()> = *collection; + let collection: *const RootedVec = *collection; let collection = collection as *const RootedVec; unsafe { let _ = (*collection).trace(tracer); @@ -367,10 +373,10 @@ impl RootedCollectionSet { } } - let dom_collections = &self.set[CollectionType::DOMObjects as usize] as *const _ as *const HashSet<*const RootedVec<*const Reflector>>; + let dom_collections = &self.set[CollectionType::DOMObjects as usize] as *const _ as *const HashSet<*const RootedVec>>; for dom_collection in (*dom_collections).iter() { for reflector in (**dom_collection).iter() { - trace_reflector(tracer, "", &**reflector); + trace_reflector(tracer, "", reflector.reflector()); } } @@ -381,7 +387,7 @@ impl RootedCollectionSet { /// Trait implemented by all types that can be used with RootedVec -trait VecRootableType { +pub trait VecRootableType { /// Return the type tag used to determine how to trace RootedVec fn tag(_a: Option) -> CollectionType; } @@ -398,11 +404,21 @@ impl VecRootableType for *mut JSObject { fn tag(_a: Option<*mut JSObject>) -> CollectionType { CollectionType::JSObjects } } +enum Void {} + +impl VecRootableType for Void { + fn tag(_a: Option) -> CollectionType { unreachable!() } +} + +impl Reflectable for Void { + fn reflector<'a>(&'a self) -> &'a Reflector { unreachable!() } +} + /// A vector of items that are rooted for the lifetime /// of this struct #[allow(unrooted_must_root)] #[no_move] -pub struct RootedVec { +pub struct RootedVec { v: Vec } @@ -435,14 +451,14 @@ impl Drop for RootedVec { } } -impl Deref for RootedVec { +impl Deref for RootedVec { type Target = Vec; fn deref(&self) -> &Vec { &self.v } } -impl DerefMut for RootedVec { +impl DerefMut for RootedVec { fn deref_mut(&mut self) -> &mut Vec { &mut self.v }