aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/bindings/root.rs
diff options
context:
space:
mode:
authorAnthony Ramine <nox@nox.paris>2020-03-27 17:37:56 +0100
committerAnthony Ramine <nox@nox.paris>2020-03-28 15:37:57 +0100
commitdba6a635e5df980b2837495aae59711739c23716 (patch)
tree9e91fe80e491a0a0cc29800b4dd71d23cc1abcb9 /components/script/dom/bindings/root.rs
parent60ca98b753570ce4ce56bc92ddbdd3c0c0e5800d (diff)
downloadservo-dba6a635e5df980b2837495aae59711739c23716.tar.gz
servo-dba6a635e5df980b2837495aae59711739c23716.zip
Give a lifetime parameter to LayoutDom
Diffstat (limited to 'components/script/dom/bindings/root.rs')
-rw-r--r--components/script/dom/bindings/root.rs49
1 files changed, 32 insertions, 17 deletions
diff --git a/components/script/dom/bindings/root.rs b/components/script/dom/bindings/root.rs
index 0ba69687dba..b1739ac27c3 100644
--- a/components/script/dom/bindings/root.rs
+++ b/components/script/dom/bindings/root.rs
@@ -331,6 +331,7 @@ impl<T> Dom<T> {
debug_assert!(thread_state::get().is_layout());
LayoutDom {
ptr: self.ptr.clone(),
+ marker: PhantomData,
}
}
}
@@ -413,13 +414,17 @@ where
/// An unrooted reference to a DOM object for use in layout. `Layout*Helpers`
/// traits must be implemented on this.
#[unrooted_must_root_lint::allow_unrooted_interior]
-pub struct LayoutDom<T> {
+pub struct LayoutDom<'dom, T> {
ptr: ptr::NonNull<T>,
+ marker: PhantomData<&'dom T>,
}
-impl<T: Castable> LayoutDom<T> {
+impl<'dom, T> LayoutDom<'dom, T>
+where
+ T: Castable,
+{
/// Cast a DOM object root upwards to one of the interfaces it derives from.
- pub fn upcast<U>(&self) -> LayoutDom<U>
+ pub fn upcast<U>(&self) -> LayoutDom<'dom, U>
where
U: Castable,
T: DerivedFrom<U>,
@@ -428,11 +433,12 @@ impl<T: Castable> LayoutDom<T> {
let ptr: *mut T = self.ptr.as_ptr();
LayoutDom {
ptr: unsafe { ptr::NonNull::new_unchecked(ptr as *mut U) },
+ marker: PhantomData,
}
}
/// Cast a DOM object downwards to one of the interfaces it might implement.
- pub fn downcast<U>(&self) -> Option<LayoutDom<U>>
+ pub fn downcast<U>(&self) -> Option<LayoutDom<'dom, U>>
where
U: DerivedFrom<T>,
{
@@ -442,6 +448,7 @@ impl<T: Castable> LayoutDom<T> {
let ptr: *mut T = self.ptr.as_ptr();
Some(LayoutDom {
ptr: ptr::NonNull::new_unchecked(ptr as *mut U),
+ marker: PhantomData,
})
} else {
None
@@ -450,7 +457,10 @@ impl<T: Castable> LayoutDom<T> {
}
}
-impl<T: DomObject> LayoutDom<T> {
+impl<T> LayoutDom<'_, T>
+where
+ T: DomObject,
+{
/// Get the reflector.
pub unsafe fn get_jsobject(&self) -> *mut JSObject {
debug_assert!(thread_state::get().is_layout());
@@ -458,7 +468,7 @@ impl<T: DomObject> LayoutDom<T> {
}
}
-impl<T> Copy for LayoutDom<T> {}
+impl<T> Copy for LayoutDom<'_, T> {}
impl<T> PartialEq for Dom<T> {
fn eq(&self, other: &Dom<T>) -> bool {
@@ -474,13 +484,13 @@ impl<'a, T: DomObject> PartialEq<&'a T> for Dom<T> {
impl<T> Eq for Dom<T> {}
-impl<T> PartialEq for LayoutDom<T> {
- fn eq(&self, other: &LayoutDom<T>) -> bool {
+impl<T> PartialEq for LayoutDom<'_, T> {
+ fn eq(&self, other: &Self) -> bool {
self.ptr.as_ptr() == other.ptr.as_ptr()
}
}
-impl<T> Eq for LayoutDom<T> {}
+impl<T> Eq for LayoutDom<'_, T> {}
impl<T> Hash for Dom<T> {
fn hash<H: Hasher>(&self, state: &mut H) {
@@ -488,7 +498,7 @@ impl<T> Hash for Dom<T> {
}
}
-impl<T> Hash for LayoutDom<T> {
+impl<T> Hash for LayoutDom<'_, T> {
fn hash<H: Hasher>(&self, state: &mut H) {
self.ptr.as_ptr().hash(state)
}
@@ -497,7 +507,7 @@ impl<T> Hash for LayoutDom<T> {
impl<T> Clone for Dom<T> {
#[inline]
#[allow(unrooted_must_root)]
- fn clone(&self) -> Dom<T> {
+ fn clone(&self) -> Self {
debug_assert!(thread_state::get().is_script());
Dom {
ptr: self.ptr.clone(),
@@ -505,24 +515,26 @@ impl<T> Clone for Dom<T> {
}
}
-impl<T> Clone for LayoutDom<T> {
+impl<T> Clone for LayoutDom<'_, T> {
#[inline]
- fn clone(&self) -> LayoutDom<T> {
+ fn clone(&self) -> Self {
debug_assert!(thread_state::get().is_layout());
LayoutDom {
ptr: self.ptr.clone(),
+ marker: PhantomData,
}
}
}
-impl LayoutDom<Node> {
+impl LayoutDom<'_, Node> {
/// Create a new JS-owned value wrapped from an address known to be a
/// `Node` pointer.
- pub unsafe fn from_trusted_node_address(inner: TrustedNodeAddress) -> LayoutDom<Node> {
+ pub unsafe fn from_trusted_node_address(inner: TrustedNodeAddress) -> Self {
debug_assert!(thread_state::get().is_layout());
let TrustedNodeAddress(addr) = inner;
LayoutDom {
ptr: ptr::NonNull::new_unchecked(addr as *const Node as *mut Node),
+ marker: PhantomData,
}
}
}
@@ -624,7 +636,7 @@ impl<T: DomObject> MutNullableDom<T> {
#[allow(unrooted_must_root)]
pub unsafe fn get_inner_as_layout(&self) -> Option<LayoutDom<T>> {
debug_assert!(thread_state::get().is_layout());
- ptr::read(self.ptr.get()).map(|js| js.to_layout())
+ (*self.ptr.get()).as_ref().map(|js| js.to_layout())
}
/// Get a rooted value out of this object
@@ -732,7 +744,10 @@ unsafe impl<T: DomObject> JSTraceable for DomOnceCell<T> {
}
}
-impl<T: DomObject> LayoutDom<T> {
+impl<'dom, T> LayoutDom<'dom, T>
+where
+ T: 'dom + DomObject,
+{
/// Returns an unsafe pointer to the interior of this JS object. This is
/// the only method that be safely accessed from layout. (The fact that
/// this is unsafe is what necessitates the layout wrappers.)