Auto merge of #13194 - servo:mutreflectable, r=Ms2ger

Extract mutability out of Reflectable trait.

<!-- 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/13194)
<!-- Reviewable:end -->
This commit is contained in:
bors-servo 2016-09-07 04:17:36 -05:00 committed by GitHub
commit dd33be4548
7 changed files with 34 additions and 14 deletions

View file

@ -24,12 +24,17 @@ pub fn expand_reflector(cx: &mut ExtCtxt, span: Span, _: &MetaItem, annotatable:
fn reflector<'a>(&'a self) -> &'a ::dom::bindings::reflector::Reflector { fn reflector<'a>(&'a self) -> &'a ::dom::bindings::reflector::Reflector {
&self.$field_name &self.$field_name
} }
}
);
let impl_item_mut = quote_item!(cx,
impl ::dom::bindings::reflector::MutReflectable for $struct_name {
fn init_reflector(&mut self, obj: *mut ::js::jsapi::JSObject) { fn init_reflector(&mut self, obj: *mut ::js::jsapi::JSObject) {
self.$field_name.set_jsobject(obj); self.$field_name.set_jsobject(obj);
} }
} }
); );
impl_item.map(|it| push(Annotatable::Item(it))) impl_item.map(|it| push(Annotatable::Item(it)));
impl_item_mut.map(|it| push(Annotatable::Item(it)))
}, },
// Or just call it on the first field (supertype). // Or just call it on the first field (supertype).
None => { None => {
@ -39,12 +44,17 @@ pub fn expand_reflector(cx: &mut ExtCtxt, span: Span, _: &MetaItem, annotatable:
fn reflector<'a>(&'a self) -> &'a ::dom::bindings::reflector::Reflector { fn reflector<'a>(&'a self) -> &'a ::dom::bindings::reflector::Reflector {
self.$field_name.reflector() self.$field_name.reflector()
} }
}
);
let impl_item_mut = quote_item!(cx,
impl ::dom::bindings::reflector::MutReflectable for $struct_name {
fn init_reflector(&mut self, obj: *mut ::js::jsapi::JSObject) { fn init_reflector(&mut self, obj: *mut ::js::jsapi::JSObject) {
self.$field_name.init_reflector(obj); self.$field_name.init_reflector(obj);
} }
} }
); );
impl_item.map(|it| push(Annotatable::Item(it))) impl_item.map(|it| push(Annotatable::Item(it)));
impl_item_mut.map(|it| push(Annotatable::Item(it)))
} }
}; };

View file

@ -16,6 +16,7 @@ use dom::bindings::conversions::{ConversionResult, FromJSValConvertible, jsstrin
use dom::bindings::global::GlobalRef; use dom::bindings::global::GlobalRef;
use dom::bindings::inheritance::Castable; use dom::bindings::inheritance::Castable;
use dom::bindings::js::Root; use dom::bindings::js::Root;
use dom::bindings::reflector::Reflectable;
use dom::bindings::str::DOMString; use dom::bindings::str::DOMString;
use dom::browsingcontext::BrowsingContext; use dom::browsingcontext::BrowsingContext;
use dom::element::Element; use dom::element::Element;

View file

@ -5452,6 +5452,7 @@ def generate_imports(config, cgthings, descriptors, callbacks=None, dictionaries
'dom::bindings::js::OptionalRootedReference', 'dom::bindings::js::OptionalRootedReference',
'dom::bindings::js::Root', 'dom::bindings::js::Root',
'dom::bindings::js::RootedReference', 'dom::bindings::js::RootedReference',
'dom::bindings::reflector::MutReflectable',
'dom::bindings::reflector::Reflectable', 'dom::bindings::reflector::Reflectable',
'dom::bindings::utils::DOMClass', 'dom::bindings::utils::DOMClass',
'dom::bindings::utils::DOMJSClass', 'dom::bindings::utils::DOMJSClass',

View file

@ -271,14 +271,6 @@ impl<'a> GlobalRef<'a> {
} }
} }
/// Returns the receiver's reflector.
pub fn reflector(&self) -> &Reflector {
match *self {
GlobalRef::Window(ref window) => window.reflector(),
GlobalRef::Worker(ref worker) => worker.reflector(),
}
}
/// Returns a wrapper for runnables to ensure they are cancelled if the global /// Returns a wrapper for runnables to ensure they are cancelled if the global
/// is being destroyed. /// is being destroyed.
pub fn get_runnable_wrapper(&self) -> RunnableWrapper { pub fn get_runnable_wrapper(&self) -> RunnableWrapper {
@ -297,6 +289,15 @@ impl<'a> GlobalRef<'a> {
} }
} }
impl<'a> Reflectable for GlobalRef<'a> {
fn reflector(&self) -> &Reflector {
match *self {
GlobalRef::Window(ref window) => window.reflector(),
GlobalRef::Worker(ref worker) => worker.reflector(),
}
}
}
impl GlobalRoot { impl GlobalRoot {
/// Obtain a safe reference to the global object that cannot outlive the /// Obtain a safe reference to the global object that cannot outlive the
/// lifetime of this root. /// lifetime of this root.

View file

@ -12,7 +12,7 @@ use dom::bindings::codegen::Bindings::IterableIteratorBinding::IterableKeyOrValu
use dom::bindings::error::Fallible; use dom::bindings::error::Fallible;
use dom::bindings::global::GlobalRef; use dom::bindings::global::GlobalRef;
use dom::bindings::js::{JS, Root}; use dom::bindings::js::{JS, Root};
use dom::bindings::reflector::{Reflector, Reflectable, reflect_dom_object}; use dom::bindings::reflector::{Reflector, Reflectable, MutReflectable, reflect_dom_object};
use dom::bindings::trace::JSTraceable; use dom::bindings::trace::JSTraceable;
use js::conversions::ToJSValConvertible; use js::conversions::ToJSValConvertible;
use js::jsapi::{JSContext, JSObject, MutableHandleValue, MutableHandleObject, HandleValue}; use js::jsapi::{JSContext, JSObject, MutableHandleValue, MutableHandleObject, HandleValue};
@ -63,6 +63,9 @@ impl<T: Reflectable + JSTraceable + Iterable> Reflectable for IterableIterator<T
fn reflector<'a>(&'a self) -> &'a Reflector { fn reflector<'a>(&'a self) -> &'a Reflector {
&self.reflector &self.reflector
} }
}
impl<T: Reflectable + JSTraceable + Iterable> MutReflectable for IterableIterator<T> {
fn init_reflector(&mut self, obj: *mut JSObject) { fn init_reflector(&mut self, obj: *mut JSObject) {
self.reflector.set_jsobject(obj); self.reflector.set_jsobject(obj);
} }

View file

@ -73,11 +73,15 @@ impl Reflector {
pub trait Reflectable { pub trait Reflectable {
/// Returns the receiver's reflector. /// Returns the receiver's reflector.
fn reflector(&self) -> &Reflector; fn reflector(&self) -> &Reflector;
/// Initializes the Reflector
fn init_reflector(&mut self, obj: *mut JSObject);
/// Returns the global object of the realm that the Reflectable was created in. /// Returns the global object of the realm that the Reflectable was created in.
fn global(&self) -> GlobalRoot where Self: Sized { fn global(&self) -> GlobalRoot where Self: Sized {
global_root_from_reflector(self) global_root_from_reflector(self)
} }
} }
/// A trait to initialize the `Reflector` for a DOM object.
pub trait MutReflectable: Reflectable {
/// Initializes the Reflector
fn init_reflector(&mut self, obj: *mut JSObject);
}

View file

@ -7,7 +7,7 @@ use dom::bindings::codegen::Bindings::DocumentBinding::DocumentMethods;
use dom::bindings::conversions::{ToJSValConvertible, root_from_handleobject}; use dom::bindings::conversions::{ToJSValConvertible, root_from_handleobject};
use dom::bindings::js::{JS, Root, RootedReference}; use dom::bindings::js::{JS, Root, RootedReference};
use dom::bindings::proxyhandler::{fill_property_descriptor, get_property_descriptor}; use dom::bindings::proxyhandler::{fill_property_descriptor, get_property_descriptor};
use dom::bindings::reflector::{Reflectable, Reflector}; use dom::bindings::reflector::{Reflectable, MutReflectable, Reflector};
use dom::bindings::str::DOMString; use dom::bindings::str::DOMString;
use dom::bindings::trace::JSTraceable; use dom::bindings::trace::JSTraceable;
use dom::bindings::utils::WindowProxyHandler; use dom::bindings::utils::WindowProxyHandler;