From e5a708f7272bffa925ed1c352775e41cfe010ed1 Mon Sep 17 00:00:00 2001 From: Tetsuharu OHZEKI Date: Sat, 14 Jun 2014 00:30:55 +0900 Subject: [PATCH] Make the conservertive stack scanner calculates `Temporary` as root instead of calling root methods. See: https://github.com/mozilla/servo/issues/2650 --- src/components/script/dom/bindings/js.rs | 23 ++++++----------------- 1 file 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> /// - RootedReference: makes obtaining an Option> from an Option> 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::assign` method or `OptionalSettable::assign` (for Option> fields). pub struct Temporary { inner: JS, + /// On-stack JS pointer to assuage conservative stack scanner + js_ptr: *mut JSObject, } impl Eq for Temporary { @@ -64,25 +66,12 @@ impl Eq for Temporary { } } -#[unsafe_destructor] -impl Drop for Temporary { - fn drop(&mut self) { - let cx = cx_for_dom_object(&self.inner); - unsafe { - JS_RemoveObjectRoot(cx, self.inner.mut_reflector().rootable()); - } - } -} - impl Temporary { /// Create a new Temporary value from a JS-owned value. - pub fn new(mut inner: JS) -> Temporary { - let cx = cx_for_dom_object(&inner); - unsafe { - JS_AddObjectRoot(cx, inner.mut_reflector().rootable()); - } + pub fn new(inner: JS) -> Temporary { Temporary { inner: inner, + js_ptr: inner.reflector().get_jsobject(), } }