Work around a miscompilation bug in LineboxScanner::repair_elem_ranges

This commit is contained in:
Brian J. Burg 2012-10-22 12:27:21 -07:00
parent ee47778bd5
commit b0536d7898

View file

@ -267,7 +267,7 @@ impl LineboxScanner {
self.flush_current_line(); self.flush_current_line();
} }
//self.repair_elem_ranges(); self.repair_elem_ranges();
self.swap_out_results(); self.swap_out_results();
} }
@ -280,7 +280,6 @@ impl LineboxScanner {
let mut old_i = 0; let mut old_i = 0;
let old_boxes = &self.flow.inline().boxes; let old_boxes = &self.flow.inline().boxes;
// index into self.new_boxes // index into self.new_boxes
let mut new_j = 0; let mut new_j = 0;
@ -293,7 +292,7 @@ impl LineboxScanner {
do self.flow.inline().elems.borrow |elems: &[NodeRange]| { do self.flow.inline().elems.borrow |elems: &[NodeRange]| {
// index into elems // index into elems
let mut elems_k = 0; let mut elems_k = 0;
while old_i < old_boxes.len() { while old_i < old_boxes.len() {
debug!("Considering old box %u", old_i); debug!("Considering old box %u", old_i);
// possibly push several items // possibly push several items
@ -303,9 +302,12 @@ impl LineboxScanner {
repair_stack.push(item); repair_stack.push(item);
elems_k += 1; elems_k += 1;
} }
// XXX: the following loop form causes segfaults; assigning to locals doesn't.
// slide forward through any dups // while new_j < new_boxes.len() && old_boxes[old_i].d().node != new_boxes[new_j].d().node {
while new_j < self.new_boxes.len() && old_boxes[old_i].d().node == self.new_boxes[new_j].d().node { while new_j < self.new_boxes.len() {
let o = old_boxes[old_i];
let n = self.new_boxes[new_j];
if o.d().node != n.d().node { break }
debug!("Slide through new box %u", new_j); debug!("Slide through new box %u", new_j);
new_j += 1; new_j += 1;
} }
@ -318,7 +320,6 @@ impl LineboxScanner {
} }
old_i += 1; old_i += 1;
} }
// possibly pop several items // possibly pop several items
while repair_stack.len() > 0 && old_i == elems[repair_stack.last().elem_idx].range.end() { while repair_stack.len() > 0 && old_i == elems[repair_stack.last().elem_idx].range.end() {
let item = repair_stack.pop(); let item = repair_stack.pop();
@ -342,9 +343,9 @@ impl LineboxScanner {
}; };
debug!("--- Elem ranges after repair: ---"); debug!("--- Elem ranges after repair: ---");
// for self.flow.inline().elems.eachi |i: uint, nr: &NodeRange| { for self.flow.inline().elems.eachi |i: uint, nr: &NodeRange| {
// debug!("%u: %?", i, nr.range); debug!("%u: %?", i, nr.range);
// } }
debug!("----------------------------------"); debug!("----------------------------------");
} }