mirror of
https://github.com/servo/servo.git
synced 2025-06-21 15:49:04 +01:00
Auto merge of #18641 - servo:ROOT-ALL-THE-THINGS, r=SimonSapin
Improve DomRoot<T> <!-- Reviewable:start --> This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/18641) <!-- Reviewable:end -->
This commit is contained in:
commit
0160aaeeea
3 changed files with 11 additions and 8 deletions
|
@ -22,7 +22,6 @@
|
|||
//! its hash table during the next GC. During GC, the entries of the hash table are counted
|
||||
//! as JS roots.
|
||||
|
||||
use core::nonzero::NonZero;
|
||||
use dom::bindings::conversions::ToJSValConvertible;
|
||||
use dom::bindings::error::Error;
|
||||
use dom::bindings::reflector::{DomObject, Reflector};
|
||||
|
@ -185,7 +184,7 @@ impl<T: DomObject> Trusted<T> {
|
|||
self.owner_thread == (&*live_references) as *const _ as *const libc::c_void
|
||||
}));
|
||||
unsafe {
|
||||
DomRoot::new(NonZero::new_unchecked(self.refcount.0 as *const T))
|
||||
DomRoot::from_ref(&*(self.refcount.0 as *const T))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -558,10 +558,11 @@ pub unsafe fn trace_roots(tracer: *mut JSTracer) {
|
|||
/// are additive, so this object's destruction will not invalidate other roots
|
||||
/// for the same JS value. `Root`s cannot outlive the associated
|
||||
/// `RootCollection` object.
|
||||
#[allow(unrooted_must_root)]
|
||||
#[allow_unrooted_interior]
|
||||
pub struct DomRoot<T: DomObject> {
|
||||
/// Reference to rooted value that must not outlive this container
|
||||
ptr: NonZero<*const T>,
|
||||
ptr: Dom<T>,
|
||||
/// List that ensures correct dynamic root ordering
|
||||
root_list: *const RootCollection,
|
||||
}
|
||||
|
@ -591,11 +592,12 @@ impl<T: DomObject> DomRoot<T> {
|
|||
/// Create a new stack-bounded root for the provided JS-owned value.
|
||||
/// It cannot outlive its associated `RootCollection`, and it gives
|
||||
/// out references which cannot outlive this new `Root`.
|
||||
pub fn new(unrooted: NonZero<*const T>) -> DomRoot<T> {
|
||||
#[allow(unrooted_must_root)]
|
||||
unsafe fn new(unrooted: Dom<T>) -> DomRoot<T> {
|
||||
debug_assert!(thread_state::get().is_script());
|
||||
STACK_ROOTS.with(|ref collection| {
|
||||
let RootCollectionPtr(collection) = collection.get().unwrap();
|
||||
unsafe { (*collection).root(&*(*unrooted.get()).reflector()) }
|
||||
(*collection).root(unrooted.reflector());
|
||||
DomRoot {
|
||||
ptr: unrooted,
|
||||
root_list: collection,
|
||||
|
@ -605,7 +607,7 @@ impl<T: DomObject> DomRoot<T> {
|
|||
|
||||
/// Generate a new root from a reference
|
||||
pub fn from_ref(unrooted: &T) -> DomRoot<T> {
|
||||
DomRoot::new(unsafe { NonZero::new_unchecked(unrooted) })
|
||||
unsafe { DomRoot::new(Dom::from_ref(unrooted)) }
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -620,7 +622,7 @@ impl<T: DomObject> Deref for DomRoot<T> {
|
|||
type Target = T;
|
||||
fn deref(&self) -> &T {
|
||||
debug_assert!(thread_state::get().is_script());
|
||||
unsafe { &*self.ptr.get() }
|
||||
&self.ptr
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -86,7 +86,9 @@ impl<T: WeakReferenceable> WeakRef<T> {
|
|||
|
||||
/// DomRoot a weak reference. Returns `None` if the object was already collected.
|
||||
pub fn root(&self) -> Option<DomRoot<T>> {
|
||||
unsafe { &*self.ptr.get() }.value.get().map(DomRoot::new)
|
||||
unsafe { &*self.ptr.get() }.value.get().map(|ptr| unsafe {
|
||||
DomRoot::from_ref(&*ptr.get())
|
||||
})
|
||||
}
|
||||
|
||||
/// Return whether the weakly-referenced object is still alive.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue