mirror of
https://github.com/servo/servo.git
synced 2025-07-24 15:50:21 +01:00
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:
commit
a7e29939a1
4 changed files with 17 additions and 10 deletions
|
@ -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.
|
||||||
|
|
|
@ -188,9 +188,3 @@ impl LiveDOMReferences {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Drop for LiveDOMReferences {
|
|
||||||
fn drop(&mut self) {
|
|
||||||
assert!(self.table.borrow().keys().count() == 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 => (),
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue