mirror of
https://github.com/servo/servo.git
synced 2025-08-05 05:30:08 +01:00
Fix crashes from incorrect transmutation and traversal routines.
This commit is contained in:
parent
1b030480ab
commit
cf3917f5b1
1 changed files with 21 additions and 21 deletions
|
@ -212,7 +212,7 @@ impl AbstractNode {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
for self.each_child |kid| {
|
for self.each_child |kid| {
|
||||||
if !f(kid) {
|
if !kid.traverse_preorder(f) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -221,7 +221,7 @@ impl AbstractNode {
|
||||||
|
|
||||||
fn traverse_postorder(self, f: &fn(AbstractNode) -> bool) -> bool {
|
fn traverse_postorder(self, f: &fn(AbstractNode) -> bool) -> bool {
|
||||||
for self.each_child |kid| {
|
for self.each_child |kid| {
|
||||||
if !f(kid) {
|
if !kid.traverse_postorder(f) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -232,18 +232,28 @@ impl AbstractNode {
|
||||||
// Downcasting borrows
|
// Downcasting borrows
|
||||||
//
|
//
|
||||||
|
|
||||||
fn with_imm_node<R>(self, f: &fn(&Node) -> R) -> R {
|
fn transmute<T, R>(self, f: &fn(&T) -> R) -> R {
|
||||||
unsafe {
|
unsafe {
|
||||||
f(transmute(self.obj))
|
let box: *bindings::utils::rust_box<T> = transmute(self.obj);
|
||||||
|
f(&(*box).payload)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn with_mut_node<R>(self, f: &fn(&mut Node) -> R) -> R {
|
fn transmute_mut<T, R>(self, f: &fn(&mut T) -> R) -> R {
|
||||||
unsafe {
|
unsafe {
|
||||||
f(transmute(self.obj))
|
let box: *bindings::utils::rust_box<T> = transmute(self.obj);
|
||||||
|
f(cast::transmute(&(*box).payload))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn with_imm_node<R>(self, f: &fn(&Node) -> R) -> R {
|
||||||
|
self.transmute(f)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn with_mut_node<R>(self, f: &fn(&mut Node) -> R) -> R {
|
||||||
|
self.transmute_mut(f)
|
||||||
|
}
|
||||||
|
|
||||||
fn is_text(self) -> bool { self.type_id() == TextNodeTypeId }
|
fn is_text(self) -> bool { self.type_id() == TextNodeTypeId }
|
||||||
|
|
||||||
// FIXME: This should be doing dynamic borrow checking for safety.
|
// FIXME: This should be doing dynamic borrow checking for safety.
|
||||||
|
@ -251,9 +261,7 @@ impl AbstractNode {
|
||||||
if !self.is_text() {
|
if !self.is_text() {
|
||||||
fail!(~"node is not text");
|
fail!(~"node is not text");
|
||||||
}
|
}
|
||||||
unsafe {
|
self.transmute(f)
|
||||||
f(transmute(self.obj))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_element(self) -> bool {
|
fn is_element(self) -> bool {
|
||||||
|
@ -268,9 +276,7 @@ impl AbstractNode {
|
||||||
if !self.is_element() {
|
if !self.is_element() {
|
||||||
fail!(~"node is not an element");
|
fail!(~"node is not an element");
|
||||||
}
|
}
|
||||||
unsafe {
|
self.transmute(f)
|
||||||
f(transmute(self.obj))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: This should be doing dynamic borrow checking for safety.
|
// FIXME: This should be doing dynamic borrow checking for safety.
|
||||||
|
@ -278,9 +284,7 @@ impl AbstractNode {
|
||||||
if !self.is_element() {
|
if !self.is_element() {
|
||||||
fail!(~"node is not an element");
|
fail!(~"node is not an element");
|
||||||
}
|
}
|
||||||
unsafe {
|
self.transmute_mut(f)
|
||||||
f(transmute(self.obj))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_image_element(self) -> bool {
|
fn is_image_element(self) -> bool {
|
||||||
|
@ -291,18 +295,14 @@ impl AbstractNode {
|
||||||
if !self.is_image_element() {
|
if !self.is_image_element() {
|
||||||
fail!(~"node is not an image element");
|
fail!(~"node is not an image element");
|
||||||
}
|
}
|
||||||
unsafe {
|
self.transmute(f)
|
||||||
f(transmute(self.obj))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn with_mut_image_element<R>(self, f: &fn(&mut HTMLImageElement) -> R) -> R {
|
fn with_mut_image_element<R>(self, f: &fn(&mut HTMLImageElement) -> R) -> R {
|
||||||
if !self.is_image_element() {
|
if !self.is_image_element() {
|
||||||
fail!(~"node is not an image element");
|
fail!(~"node is not an image element");
|
||||||
}
|
}
|
||||||
unsafe {
|
self.transmute_mut(f)
|
||||||
f(transmute(self.obj))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_style_element(self) -> bool {
|
fn is_style_element(self) -> bool {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue