Replace the unsound impl DerefMut for FlowRef with an unsafe function.

See #6503.
This commit is contained in:
Simon Sapin 2015-08-14 14:33:58 +02:00
parent a5fbb2f2a6
commit 2d22aa8e7e
10 changed files with 112 additions and 81 deletions

View file

@ -14,7 +14,7 @@ use cssparser::ToCss;
use data::LayoutDataWrapper;
use display_list_builder::ToGfxColor;
use flow::{self, Flow, ImmutableFlowUtils, MutableFlowUtils, MutableOwnedFlowUtils};
use flow_ref::FlowRef;
use flow_ref::{self, FlowRef};
use fragment::{Fragment, FragmentBorderBoxIterator, SpecificFragmentInfo};
use incremental::{LayoutDamageComputation, REFLOW, REFLOW_ENTIRE_DOCUMENT, REPAINT};
use layout_debug;
@ -781,7 +781,7 @@ impl LayoutTask {
_ => return None,
};
flow.mark_as_root();
unsafe { flow_ref::deref_mut(&mut flow) }.mark_as_root();
Some(flow)
}
@ -999,11 +999,11 @@ impl LayoutTask {
self.profiler_metadata(),
self.time_profiler_chan.clone(),
|| {
flow::mut_base(&mut **layout_root).stacking_relative_position =
flow::mut_base(unsafe { flow_ref::deref_mut(layout_root) }).stacking_relative_position =
LogicalPoint::zero(writing_mode).to_physical(writing_mode,
rw_data.screen_size);
flow::mut_base(&mut **layout_root).clip =
flow::mut_base(unsafe { flow_ref::deref_mut(layout_root) }).clip =
ClippingRegion::from_rect(&data.page_clip_rect);
match (&mut rw_data.parallel_traversal, opts::get().parallel_display_list_building) {
@ -1023,14 +1023,16 @@ impl LayoutTask {
if data.goal == ReflowGoal::ForDisplay {
debug!("Done building display list.");
let root_background_color = get_root_flow_background_color(&mut **layout_root);
let root_background_color = get_root_flow_background_color(
unsafe { flow_ref::deref_mut(layout_root) });
let root_size = {
let root_flow = flow::base(&**layout_root);
root_flow.position.size.to_physical(root_flow.writing_mode)
};
let mut display_list = box DisplayList::new();
flow::mut_base(&mut **layout_root).display_list_building_result
.add_to(&mut *display_list);
flow::mut_base(unsafe { flow_ref::deref_mut(layout_root) })
.display_list_building_result
.add_to(&mut *display_list);
let paint_layer = PaintLayer::new(layout_root.layer_id(0),
root_background_color,
ScrollPolicy::Scrollable);
@ -1128,7 +1130,7 @@ impl LayoutTask {
}
if needs_reflow {
if let Some(mut flow) = self.try_get_layout_root(*node) {
LayoutTask::reflow_all_nodes(&mut *flow);
LayoutTask::reflow_all_nodes(unsafe { flow_ref::deref_mut(&mut flow) });
}
}
@ -1289,7 +1291,7 @@ impl LayoutTask {
self.profiler_metadata(),
self.time_profiler_chan.clone(),
|| {
animation::recalc_style_for_animations(root_flow.deref_mut(),
animation::recalc_style_for_animations(unsafe { flow_ref::deref_mut(&mut root_flow) },
animations)
});
}
@ -1309,10 +1311,10 @@ impl LayoutTask {
self.profiler_metadata(),
self.time_profiler_chan.clone(),
|| {
if opts::get().nonincremental_layout || root_flow.deref_mut()
if opts::get().nonincremental_layout || unsafe { flow_ref::deref_mut(&mut root_flow) }
.compute_layout_damage()
.contains(REFLOW_ENTIRE_DOCUMENT) {
root_flow.deref_mut().reflow_entire_document()
unsafe { flow_ref::deref_mut(&mut root_flow) }.reflow_entire_document()
}
});