From 45c9aa7487cf2617126e4c667dbfb0ad3b244b4d Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Fri, 13 May 2016 14:23:09 +0200 Subject: [PATCH] Generalise RootedReference It now becomes RootedReference<'root> and includes an associated type for the return type of its 'r' method. This removes the need for OptionalRootedReference. --- .../dom/bindings/codegen/CodegenRust.py | 2 - components/script/dom/bindings/js.rs | 71 ++++++++----------- components/script/dom/bindings/trace.rs | 8 +-- 3 files changed, 32 insertions(+), 49 deletions(-) diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py index e66ff0ab8589..7fc824c27b8c 100644 --- a/components/script/dom/bindings/codegen/CodegenRust.py +++ b/components/script/dom/bindings/codegen/CodegenRust.py @@ -5505,9 +5505,7 @@ def generate_imports(config, cgthings, descriptors, callbacks=None, dictionaries 'dom::bindings::iterable::Iterable', 'dom::bindings::iterable::IteratorType', 'dom::bindings::js::JS', - 'dom::bindings::js::OptionalRootedReference', 'dom::bindings::js::Root', - 'dom::bindings::js::RootedRcReference', 'dom::bindings::js::RootedReference', 'dom::bindings::namespace::NamespaceObjectClass', 'dom::bindings::namespace::create_namespace_object', diff --git a/components/script/dom/bindings/js.rs b/components/script/dom/bindings/js.rs index 24e926bac3a7..6441bed67464 100644 --- a/components/script/dom/bindings/js.rs +++ b/components/script/dom/bindings/js.rs @@ -87,6 +87,13 @@ impl JS { } } +impl<'root, T: Reflectable + 'root> RootedReference<'root> for JS { + type Ref = &'root T; + fn r(&'root self) -> &'root T { + &self + } +} + impl Deref for JS { type Target = T; @@ -446,54 +453,25 @@ impl LayoutJS { } } -/// Get an `&T` out of a `Rc` -pub trait RootedRcReference { - /// Obtain a safe reference to the wrapped non-JS owned value. - fn r(&self) -> &T; -} - -impl RootedRcReference for Rc { - fn r(&self) -> &T { - &*self - } -} - -/// Get an `Option<&T>` out of an `Option>` -pub trait RootedReference { - /// Obtain a safe optional reference to the wrapped JS owned-value that - /// cannot outlive the lifetime of this root. - fn r(&self) -> Option<&T>; +/// Get a reference out of a rooted value. +pub trait RootedReference<'root> { + /// The type of the reference. + type Ref: 'root; + /// Obtain a reference out of the rooted value. + fn r(&'root self) -> Self::Ref; } -impl RootedReference for Option> { - fn r(&self) -> Option<&T> { - self.as_ref().map(|root| &**root) +impl<'root, T: Reflectable + 'root> RootedReference<'root> for Rc { + type Ref = &'root T; + fn r(&'root self) -> &'root T { + self } } -impl RootedReference for Option> { - fn r(&self) -> Option<&T> { - self.as_ref().map(|root| &**root) - } -} - -/// Get an `Option<&T> out of an `Option>` -impl RootedReference for Option> { - fn r(&self) -> Option<&T> { - self.as_ref().map(|inner| &**inner) - } -} - -/// Get an `Option>` out of an `Option>>` -pub trait OptionalRootedReference { - /// Obtain a safe optional optional reference to the wrapped JS owned-value - /// that cannot outlive the lifetime of this root. - fn r(&self) -> Option>; -} - -impl OptionalRootedReference for Option>> { - fn r(&self) -> Option> { - self.as_ref().map(|inner| inner.r()) +impl<'root, T: RootedReference<'root> + 'root> RootedReference<'root> for Option { + type Ref = Option; + fn r(&'root self) -> Option { + self.as_ref().map(RootedReference::r) } } @@ -617,6 +595,13 @@ impl Root { } } +impl<'root, T: Reflectable + 'root> RootedReference<'root> for Root { + type Ref = &'root T; + fn r(&'root self) -> &'root T { + self + } +} + impl Deref for Root { type Target = T; fn deref(&self) -> &T { diff --git a/components/script/dom/bindings/trace.rs b/components/script/dom/bindings/trace.rs index 6331a1c3bf3d..4e37dd45aa0a 100644 --- a/components/script/dom/bindings/trace.rs +++ b/components/script/dom/bindings/trace.rs @@ -36,7 +36,7 @@ use devtools_traits::CSSError; use devtools_traits::WorkerId; use dom::abstractworker::SharedRt; use dom::bindings::cell::DOMRefCell; -use dom::bindings::js::{JS, Root}; +use dom::bindings::js::{JS, Root, RootedReference}; use dom::bindings::refcounted::{Trusted, TrustedPromise}; use dom::bindings::reflector::{Reflectable, Reflector}; use dom::bindings::str::{DOMString, USVString}; @@ -553,9 +553,9 @@ impl<'a, T: JSTraceable + Reflectable> RootedVec<'a, JS> { } } -impl<'a, T: JSTraceable + Reflectable> RootedVec<'a, JS> { - /// Obtain a safe slice of references that can't outlive that RootedVec. - pub fn r(&self) -> &[&T] { +impl<'a, 'root, T: JSTraceable + Reflectable + 'root> RootedReference<'root> for RootedVec<'a, JS> { + type Ref = &'root [&'root T]; + fn r(&'root self) -> &'root [&'root T] { unsafe { mem::transmute(&self[..]) } } }