aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMs2ger <ms2ger@gmail.com>2014-06-12 14:19:29 +0200
committerMs2ger <ms2ger@gmail.com>2014-06-13 19:19:56 +0200
commitc331b200b18728c32ad924c5bb6fc0444b077d3c (patch)
tree1388199f8de37a5bbea928c08ab60689cf592d0d
parent4c5437c58b278a4a29ac520e9866217496029d79 (diff)
downloadservo-c331b200b18728c32ad924c5bb6fc0444b077d3c.tar.gz
servo-c331b200b18728c32ad924c5bb6fc0444b077d3c.zip
Use Cell for Reflector::object.
-rw-r--r--src/components/script/dom/bindings/codegen/CodegenRust.py4
-rw-r--r--src/components/script/dom/bindings/utils.rs21
-rw-r--r--src/components/script/dom/xmlhttprequest.rs4
3 files changed, 16 insertions, 13 deletions
diff --git a/src/components/script/dom/bindings/codegen/CodegenRust.py b/src/components/script/dom/bindings/codegen/CodegenRust.py
index 3a0f5cddb00..f546f4cdd33 100644
--- a/src/components/script/dom/bindings/codegen/CodegenRust.py
+++ b/src/components/script/dom/bindings/codegen/CodegenRust.py
@@ -1838,7 +1838,7 @@ class CGWrapMethod(CGAbstractMethod):
%s
- raw.mut_reflector().set_jsobject(obj);
+ raw.reflector().set_jsobject(obj);
return raw;""" % CreateBindingJSObject(self.descriptor, "scope")
else:
@@ -1848,7 +1848,7 @@ class CGWrapMethod(CGAbstractMethod):
let proto = GetProtoObject(aCx, obj, obj);
JS_SetPrototype(aCx, obj, proto);
});
- raw.mut_reflector().set_jsobject(obj);
+ raw.reflector().set_jsobject(obj);
return raw;""" % CreateBindingJSObject(self.descriptor)
diff --git a/src/components/script/dom/bindings/utils.rs b/src/components/script/dom/bindings/utils.rs
index 5eb3486c20c..db104c13666 100644
--- a/src/components/script/dom/bindings/utils.rs
+++ b/src/components/script/dom/bindings/utils.rs
@@ -14,8 +14,9 @@ use servo_util::str::DOMString;
use collections::hashmap::HashMap;
use libc;
use libc::c_uint;
-use std::mem;
+use std::cell::Cell;
use std::cmp::Eq;
+use std::mem;
use std::ptr;
use std::ptr::null;
use std::slice;
@@ -415,31 +416,33 @@ pub fn reflect_dom_object<T: Reflectable>
#[allow(raw_pointer_deriving)]
#[deriving(Eq)]
pub struct Reflector {
- object: *mut JSObject,
+ object: Cell<*mut JSObject>,
}
impl Reflector {
#[inline]
pub fn get_jsobject(&self) -> *mut JSObject {
- self.object
+ self.object.get()
}
- pub fn set_jsobject(&mut self, object: *mut JSObject) {
- assert!(self.object.is_null());
+ pub fn set_jsobject(&self, object: *mut JSObject) {
+ assert!(self.object.get().is_null());
assert!(object.is_not_null());
- self.object = object;
+ self.object.set(object);
}
/// Return a pointer to the memory location at which the JS reflector object is stored.
/// Used by Temporary values to root the reflector, as required by the JSAPI rooting
/// APIs.
- pub fn rootable<'a>(&'a mut self) -> &'a mut *mut JSObject {
- &mut self.object
+ pub fn rootable(&self) -> *mut *mut JSObject {
+ &self.object as *Cell<*mut JSObject>
+ as *mut Cell<*mut JSObject>
+ as *mut *mut JSObject
}
pub fn new() -> Reflector {
Reflector {
- object: ptr::mut_null(),
+ object: Cell::new(ptr::mut_null()),
}
}
}
diff --git a/src/components/script/dom/xmlhttprequest.rs b/src/components/script/dom/xmlhttprequest.rs
index f3d76acca39..b087e22e0d7 100644
--- a/src/components/script/dom/xmlhttprequest.rs
+++ b/src/components/script/dom/xmlhttprequest.rs
@@ -622,14 +622,14 @@ impl<'a> PrivateXMLHttpRequestHelpers for JSRef<'a, XMLHttpRequest> {
unsafe fn to_trusted(&mut self) -> TrustedXHRAddress {
assert!(self.pinned == false);
self.pinned = true;
- JS_AddObjectRoot(self.global.root().get_cx(), self.mut_reflector().rootable());
+ JS_AddObjectRoot(self.global.root().get_cx(), self.reflector().rootable());
TrustedXHRAddress(self.deref() as *XMLHttpRequest as *libc::c_void)
}
fn release(&mut self) {
assert!(self.pinned);
unsafe {
- JS_RemoveObjectRoot(self.global.root().get_cx(), self.mut_reflector().rootable());
+ JS_RemoveObjectRoot(self.global.root().get_cx(), self.reflector().rootable());
}
self.pinned = false;
}