Make the conservertive stack scanner calculates Temporary<T> as root instead of calling root methods.

See: https://github.com/mozilla/servo/issues/2650
This commit is contained in:
Tetsuharu OHZEKI 2014-06-14 00:30:55 +09:00
parent 58b776e0b5
commit e5a708f727

View file

@ -39,10 +39,10 @@
/// - OptionalSettable: allows assigning Option values of JSRef/Temporary to fields of Option<JS<T>> /// - OptionalSettable: allows assigning Option values of JSRef/Temporary to fields of Option<JS<T>>
/// - RootedReference: makes obtaining an Option<JSRef<T>> from an Option<Root<T>> easy /// - RootedReference: makes obtaining an Option<JSRef<T>> from an Option<Root<T>> easy
use dom::bindings::utils::{Reflector, Reflectable, cx_for_dom_object}; use dom::bindings::utils::{Reflector, Reflectable};
use dom::node::Node; use dom::node::Node;
use dom::xmlhttprequest::{XMLHttpRequest, TrustedXHRAddress}; use dom::xmlhttprequest::{XMLHttpRequest, TrustedXHRAddress};
use js::jsapi::{JSObject, JS_AddObjectRoot, JS_RemoveObjectRoot}; use js::jsapi::JSObject;
use layout_interface::TrustedNodeAddress; use layout_interface::TrustedNodeAddress;
use script_task::StackRoots; use script_task::StackRoots;
@ -56,6 +56,8 @@ use std::mem;
/// `JS<T>::assign` method or `OptionalSettable::assign` (for Option<JS<T>> fields). /// `JS<T>::assign` method or `OptionalSettable::assign` (for Option<JS<T>> fields).
pub struct Temporary<T> { pub struct Temporary<T> {
inner: JS<T>, inner: JS<T>,
/// On-stack JS pointer to assuage conservative stack scanner
js_ptr: *mut JSObject,
} }
impl<T> Eq for Temporary<T> { impl<T> Eq for Temporary<T> {
@ -64,25 +66,12 @@ impl<T> Eq for Temporary<T> {
} }
} }
#[unsafe_destructor]
impl<T: Reflectable> Drop for Temporary<T> {
fn drop(&mut self) {
let cx = cx_for_dom_object(&self.inner);
unsafe {
JS_RemoveObjectRoot(cx, self.inner.mut_reflector().rootable());
}
}
}
impl<T: Reflectable> Temporary<T> { impl<T: Reflectable> Temporary<T> {
/// Create a new Temporary value from a JS-owned value. /// Create a new Temporary value from a JS-owned value.
pub fn new(mut inner: JS<T>) -> Temporary<T> { pub fn new(inner: JS<T>) -> Temporary<T> {
let cx = cx_for_dom_object(&inner);
unsafe {
JS_AddObjectRoot(cx, inner.mut_reflector().rootable());
}
Temporary { Temporary {
inner: inner, inner: inner,
js_ptr: inner.reflector().get_jsobject(),
} }
} }