aboutsummaryrefslogtreecommitdiffstats
path: root/src/components/script/dom/bindings/js.rs
diff options
context:
space:
mode:
authorTetsuharu OHZEKI <saneyuki.snyk@gmail.com>2014-06-14 00:30:55 +0900
committerTetsuharu OHZEKI <saneyuki.snyk@gmail.com>2014-06-14 01:32:18 +0900
commite5a708f7272bffa925ed1c352775e41cfe010ed1 (patch)
treeb4bf037fbe99a46d7bb98a6f3e7941fb0d873dc2 /src/components/script/dom/bindings/js.rs
parent58b776e0b559cd08db9ecb44dd0b1bbea731af57 (diff)
downloadservo-e5a708f7272bffa925ed1c352775e41cfe010ed1.tar.gz
servo-e5a708f7272bffa925ed1c352775e41cfe010ed1.zip
Make the conservertive stack scanner calculates `Temporary<T>` as root instead of calling root methods.
See: https://github.com/mozilla/servo/issues/2650
Diffstat (limited to 'src/components/script/dom/bindings/js.rs')
-rw-r--r--src/components/script/dom/bindings/js.rs23
1 files changed, 6 insertions, 17 deletions
diff --git a/src/components/script/dom/bindings/js.rs b/src/components/script/dom/bindings/js.rs
index 0f96f3e33e6..e2b2665c415 100644
--- a/src/components/script/dom/bindings/js.rs
+++ b/src/components/script/dom/bindings/js.rs
@@ -39,10 +39,10 @@
/// - 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
-use dom::bindings::utils::{Reflector, Reflectable, cx_for_dom_object};
+use dom::bindings::utils::{Reflector, Reflectable};
use dom::node::Node;
use dom::xmlhttprequest::{XMLHttpRequest, TrustedXHRAddress};
-use js::jsapi::{JSObject, JS_AddObjectRoot, JS_RemoveObjectRoot};
+use js::jsapi::JSObject;
use layout_interface::TrustedNodeAddress;
use script_task::StackRoots;
@@ -56,6 +56,8 @@ use std::mem;
/// `JS<T>::assign` method or `OptionalSettable::assign` (for Option<JS<T>> fields).
pub struct Temporary<T> {
inner: JS<T>,
+ /// On-stack JS pointer to assuage conservative stack scanner
+ js_ptr: *mut JSObject,
}
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> {
/// Create a new Temporary value from a JS-owned value.
- pub fn new(mut inner: JS<T>) -> Temporary<T> {
- let cx = cx_for_dom_object(&inner);
- unsafe {
- JS_AddObjectRoot(cx, inner.mut_reflector().rootable());
- }
+ pub fn new(inner: JS<T>) -> Temporary<T> {
Temporary {
inner: inner,
+ js_ptr: inner.reflector().get_jsobject(),
}
}