Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Extract mutability out of Reflectable trait.
  • Loading branch information
jdm authored and Ms2ger committed Sep 7, 2016
1 parent bba3eef commit 8653450
Show file tree
Hide file tree
Showing 5 changed files with 24 additions and 6 deletions.
14 changes: 12 additions & 2 deletions components/plugins/reflector.rs
Expand Up @@ -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 {
&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) {
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).
None => {
Expand All @@ -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 {
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) {
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)))
}
};

Expand Down
1 change: 1 addition & 0 deletions components/script/dom/bindings/codegen/CodegenRust.py
Expand Up @@ -5452,6 +5452,7 @@ def generate_imports(config, cgthings, descriptors, callbacks=None, dictionaries
'dom::bindings::js::OptionalRootedReference',
'dom::bindings::js::Root',
'dom::bindings::js::RootedReference',
'dom::bindings::reflector::MutReflectable',
'dom::bindings::reflector::Reflectable',
'dom::bindings::utils::DOMClass',
'dom::bindings::utils::DOMJSClass',
Expand Down
5 changes: 4 additions & 1 deletion components/script/dom/bindings/iterable.rs
Expand Up @@ -12,7 +12,7 @@ use dom::bindings::codegen::Bindings::IterableIteratorBinding::IterableKeyOrValu
use dom::bindings::error::Fallible;
use dom::bindings::global::GlobalRef;
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 js::conversions::ToJSValConvertible;
use js::jsapi::{JSContext, JSObject, MutableHandleValue, MutableHandleObject, HandleValue};
Expand Down Expand Up @@ -63,6 +63,9 @@ impl<T: Reflectable + JSTraceable + Iterable> Reflectable for IterableIterator<T
fn reflector<'a>(&'a self) -> &'a Reflector {
&self.reflector
}
}

impl<T: Reflectable + JSTraceable + Iterable> MutReflectable for IterableIterator<T> {
fn init_reflector(&mut self, obj: *mut JSObject) {
self.reflector.set_jsobject(obj);
}
Expand Down
8 changes: 6 additions & 2 deletions components/script/dom/bindings/reflector.rs
Expand Up @@ -73,11 +73,15 @@ impl Reflector {
pub trait Reflectable {
/// Returns the receiver's 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.
fn global(&self) -> GlobalRoot where Self: Sized {
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);
}
2 changes: 1 addition & 1 deletion components/script/dom/browsingcontext.rs
Expand Up @@ -7,7 +7,7 @@ use dom::bindings::codegen::Bindings::DocumentBinding::DocumentMethods;
use dom::bindings::conversions::{ToJSValConvertible, root_from_handleobject};
use dom::bindings::js::{JS, Root, RootedReference};
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::trace::JSTraceable;
use dom::bindings::utils::WindowProxyHandler;
Expand Down

0 comments on commit 8653450

Please sign in to comment.