auto merge of #4777 : dmarcos/servo/issue4692, r=jdm

...id 'DOMRefCell already mutably borrowed' messages. This is just a temporary fix until the Rust standard library allows borrowing already-borrowed RefCell values during unwinding.

It also removes LiveDOMReferences destructor that it's a no-op but it contains an assert that was being violated causing an endless cycle of destructor calls ending up in a stack overflow.
This commit is contained in:
bors-servo 2015-01-30 16:06:52 -07:00
commit a7e29939a1
4 changed files with 17 additions and 10 deletions

View file

@ -41,6 +41,13 @@ impl<T> DOMRefCell<T> {
&*self.value.as_unsafe_cell().get() &*self.value.as_unsafe_cell().get()
} }
/// Borrow the contents for the purpose of script deallocation.
///
pub unsafe fn borrow_for_script_deallocation<'a>(&'a self) -> &'a mut T {
debug_assert!(task_state::get().contains(SCRIPT));
&mut *self.value.as_unsafe_cell().get()
}
/// Is the cell mutably borrowed? /// Is the cell mutably borrowed?
/// ///
/// For safety checks in debug builds only. /// For safety checks in debug builds only.

View file

@ -188,9 +188,3 @@ impl LiveDOMReferences {
}) })
} }
} }
impl Drop for LiveDOMReferences {
fn drop(&mut self) {
assert!(self.table.borrow().keys().count() == 0);
}
}

View file

@ -273,6 +273,10 @@ impl Page {
self.js_info.borrow_mut() self.js_info.borrow_mut()
} }
pub unsafe fn unsafe_mut_js_info<'a>(&'a self) -> &'a mut Option<JSPageInfo> {
self.js_info.borrow_for_script_deallocation()
}
pub fn js_info<'a>(&'a self) -> Ref<'a, Option<JSPageInfo>> { pub fn js_info<'a>(&'a self) -> Ref<'a, Option<JSPageInfo>> {
self.js_info.borrow() self.js_info.borrow()
} }

View file

@ -248,11 +248,13 @@ impl<'a> Drop for ScriptMemoryFailsafe<'a> {
fn drop(&mut self) { fn drop(&mut self) {
match self.owner { match self.owner {
Some(owner) => { Some(owner) => {
let page = owner.page.borrow_mut(); unsafe {
for page in page.iter() { let page = owner.page.borrow_for_script_deallocation();
*page.mut_js_info() = None; for page in page.iter() {
*page.unsafe_mut_js_info() = None;
}
*owner.js_context.borrow_for_script_deallocation() = None;
} }
*owner.js_context.borrow_mut() = None;
} }
None => (), None => (),
} }