mirror of
https://github.com/servo/servo.git
synced 2025-08-03 20:50:07 +01:00
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:
parent
58b776e0b5
commit
e5a708f727
1 changed files with 6 additions and 17 deletions
|
@ -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(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue