aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbors-servo <metajack+bors@gmail.com>2015-03-23 13:39:53 -0600
committerbors-servo <metajack+bors@gmail.com>2015-03-23 13:39:53 -0600
commit5ce7d8accfc52dd37b19b4400a643a980412bb2f (patch)
treee882f7262dbfe614db4b1cb0dbd9b3a9e17247f2
parentb1a35f549baad871a3691ae485af2efecd2d73f7 (diff)
parent48b151948f9eaa1ad732363bf46bb0c4b9719832 (diff)
downloadservo-5ce7d8accfc52dd37b19b4400a643a980412bb2f.tar.gz
servo-5ce7d8accfc52dd37b19b4400a643a980412bb2f.zip
auto merge of #5327 : Ms2ger/servo/memory-explosion, r=Ms2ger
-rw-r--r--components/script/dom/bindings/js.rs6
-rw-r--r--components/script/dom/window.rs17
-rw-r--r--components/script/script_task.rs7
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;
}