diff options
author | bors-servo <metajack+bors@gmail.com> | 2015-03-23 13:39:53 -0600 |
---|---|---|
committer | bors-servo <metajack+bors@gmail.com> | 2015-03-23 13:39:53 -0600 |
commit | 5ce7d8accfc52dd37b19b4400a643a980412bb2f (patch) | |
tree | e882f7262dbfe614db4b1cb0dbd9b3a9e17247f2 | |
parent | b1a35f549baad871a3691ae485af2efecd2d73f7 (diff) | |
parent | 48b151948f9eaa1ad732363bf46bb0c4b9719832 (diff) | |
download | servo-5ce7d8accfc52dd37b19b4400a643a980412bb2f.tar.gz servo-5ce7d8accfc52dd37b19b4400a643a980412bb2f.zip |
auto merge of #5327 : Ms2ger/servo/memory-explosion, r=Ms2ger
-rw-r--r-- | components/script/dom/bindings/js.rs | 6 | ||||
-rw-r--r-- | components/script/dom/window.rs | 17 | ||||
-rw-r--r-- | components/script/script_task.rs | 7 |
3 files changed, 18 insertions, 12 deletions
diff --git a/components/script/dom/bindings/js.rs b/components/script/dom/bindings/js.rs index 72f4c16e832..f390a6444ee 100644 --- a/components/script/dom/bindings/js.rs +++ b/components/script/dom/bindings/js.rs @@ -91,6 +91,12 @@ impl<T: Reflectable> Unrooted<T> { } } + /// Create a new unrooted value from a `Temporary<T>`. + #[allow(unrooted_must_root)] + pub fn from_temporary(ptr: Temporary<T>) -> Unrooted<T> { + Unrooted::from_js(ptr.inner) + } + /// Get the `Reflector` for this pointer. pub fn reflector<'a>(&'a self) -> &'a Reflector { unsafe { diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs index 038ec358f73..88178374a45 100644 --- a/components/script/dom/window.rs +++ b/components/script/dom/window.rs @@ -155,6 +155,14 @@ pub struct Window { } impl Window { + #[allow(unsafe_code)] + pub fn clear_js_context_for_script_deallocation(&self) { + unsafe { + *self.js_context.borrow_for_script_deallocation() = None; + *self.browser_context.borrow_for_script_deallocation() = None; + } + } + pub fn get_cx(&self) -> *mut JSContext { self.js_context.borrow().as_ref().unwrap().ptr } @@ -425,7 +433,6 @@ impl<'a> WindowMethods for JSRef<'a, Window> { pub trait WindowHelpers { fn clear_js_context(self); - fn clear_js_context_for_script_deallocation(self); fn init_browser_context(self, doc: JSRef<Document>, frame_element: Option<JSRef<Element>>); fn load_url(self, href: DOMString); fn handle_fire_timer(self, timer_id: TimerId); @@ -499,14 +506,6 @@ impl<'a> WindowHelpers for JSRef<'a, Window> { *self.browser_context.borrow_mut() = None; } - #[allow(unsafe_code)] - fn clear_js_context_for_script_deallocation(self) { - unsafe { - *self.js_context.borrow_for_script_deallocation() = None; - *self.browser_context.borrow_for_script_deallocation() = None; - } - } - /// Reflows the page if it's possible to do so and the page is dirty. This method will wait /// for the layout thread to complete (but see the `TODO` below). If there is no window size /// yet, the page is presumed invisible and no reflow is performed. diff --git a/components/script/script_task.rs b/components/script/script_task.rs index b66de84bc5c..c66a0a424a3 100644 --- a/components/script/script_task.rs +++ b/components/script/script_task.rs @@ -25,7 +25,7 @@ use dom::bindings::codegen::InheritTypes::{ElementCast, EventTargetCast, HTMLIFr use dom::bindings::conversions::FromJSValConvertible; use dom::bindings::conversions::StringificationBehavior; use dom::bindings::js::{JS, JSRef, Temporary, OptionalRootable, RootedReference}; -use dom::bindings::js::{RootCollection, RootCollectionPtr}; +use dom::bindings::js::{RootCollection, RootCollectionPtr, Unrooted}; use dom::bindings::refcounted::{LiveDOMReferences, Trusted, TrustedReference}; use dom::bindings::structuredclone::StructuredCloneData; use dom::bindings::trace::JSTraceable; @@ -303,14 +303,15 @@ impl<'a> ScriptMemoryFailsafe<'a> { #[unsafe_destructor] impl<'a> Drop for ScriptMemoryFailsafe<'a> { + #[allow(unrooted_must_root)] fn drop(&mut self) { match self.owner { Some(owner) => { unsafe { let page = owner.page.borrow_for_script_deallocation(); for page in page.iter() { - let window = page.window().root(); - window.r().clear_js_context_for_script_deallocation(); + let window = Unrooted::from_temporary(page.window()); + (*window.unsafe_get()).clear_js_context_for_script_deallocation(); } *owner.js_context.borrow_for_script_deallocation() = None; } |