mirror of
https://github.com/servo/servo.git
synced 2025-08-06 06:00:15 +01:00
style: Try to collect some more crash information so that we can diagnose this better.
Differential Revision: https://phabricator.services.mozilla.com/D59704
This commit is contained in:
parent
df01cec675
commit
b038924d44
1 changed files with 38 additions and 1 deletions
|
@ -136,6 +136,27 @@ impl StyleSource {
|
||||||
let _ = write!(writer, " -> {:?}", self.read(guard).declarations());
|
let _ = write!(writer, " -> {:?}", self.read(guard).declarations());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This is totally unsafe, should be removed when we figure out the cause of
|
||||||
|
// bug 1607553.
|
||||||
|
unsafe fn dump_unchecked<W: Write>(&self, writer: &mut W) {
|
||||||
|
if let Some(ref rule) = self.0.as_first() {
|
||||||
|
let rule = rule.read_unchecked();
|
||||||
|
let _ = write!(writer, "{:?}", rule.selectors);
|
||||||
|
}
|
||||||
|
let _ = write!(writer, " -> {:?}", self.read_unchecked().declarations());
|
||||||
|
}
|
||||||
|
|
||||||
|
// This is totally unsafe, should be removed when we figure out the cause of
|
||||||
|
// bug 1607553.
|
||||||
|
#[inline]
|
||||||
|
unsafe fn read_unchecked(&self) -> &PropertyDeclarationBlock {
|
||||||
|
let block: &Locked<PropertyDeclarationBlock> = match self.0.borrow() {
|
||||||
|
ArcUnionBorrow::First(ref rule) => &rule.get().read_unchecked().block,
|
||||||
|
ArcUnionBorrow::Second(ref block) => block.get(),
|
||||||
|
};
|
||||||
|
block.read_unchecked()
|
||||||
|
}
|
||||||
|
|
||||||
/// Read the style source guard, and obtain thus read access to the
|
/// Read the style source guard, and obtain thus read access to the
|
||||||
/// underlying property declaration block.
|
/// underlying property declaration block.
|
||||||
#[inline]
|
#[inline]
|
||||||
|
@ -1720,7 +1741,23 @@ impl Drop for StrongRuleNode {
|
||||||
}
|
}
|
||||||
|
|
||||||
if cfg!(debug_assertions) || crate::gecko_bindings::structs::GECKO_IS_NIGHTLY {
|
if cfg!(debug_assertions) || crate::gecko_bindings::structs::GECKO_IS_NIGHTLY {
|
||||||
assert!(node.children.read().is_empty());
|
let children = node.children.read();
|
||||||
|
if !children.is_empty() {
|
||||||
|
let mut crash_str = vec![];
|
||||||
|
unsafe {
|
||||||
|
// Try to unsafely collect some information of this before
|
||||||
|
// crashing the process.
|
||||||
|
if let Some(ref s) = node.source {
|
||||||
|
s.dump_unchecked(&mut crash_str);
|
||||||
|
crash_str.push(b'\n');
|
||||||
|
}
|
||||||
|
children.each(|child| {
|
||||||
|
(*child.ptr()).source.as_ref().unwrap().dump_unchecked(&mut crash_str);
|
||||||
|
crash_str.push(b'\n');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
panic!("Children left in the rule tree on drop: {}", String::from_utf8_lossy(&crash_str).trim());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if node.parent.is_none() {
|
if node.parent.is_none() {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue