aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/components/gfx/display_list.rs5
-rw-r--r--src/components/main/layout/block.rs7
-rw-r--r--src/components/main/layout/construct.rs3
-rw-r--r--src/components/main/layout/flow.rs9
-rw-r--r--src/components/main/layout/inline.rs33
-rw-r--r--src/components/main/layout/text.rs5
-rw-r--r--src/components/util/smallvec.rs150
7 files changed, 85 insertions, 127 deletions
diff --git a/src/components/gfx/display_list.rs b/src/components/gfx/display_list.rs
index d31ab3d6c8e..89d847938eb 100644
--- a/src/components/gfx/display_list.rs
+++ b/src/components/gfx/display_list.rs
@@ -26,7 +26,6 @@ use libc::uintptr_t;
use servo_net::image::base::Image;
use servo_util::geometry::Au;
use servo_util::range::Range;
-use servo_util::smallvec::{SmallVec, SmallVec0};
use std::mem;
use std::slice::Items;
use style::computed_values::border_style;
@@ -90,7 +89,7 @@ struct StackingContext {
///
/// TODO(pcwalton): `z-index` should be the actual CSS property value in order to handle
/// `auto`, not just an integer.
- pub positioned_descendants: SmallVec0<(i32, DisplayList)>,
+ pub positioned_descendants: Vec<(i32, DisplayList)>,
}
impl StackingContext {
@@ -105,7 +104,7 @@ impl StackingContext {
block_backgrounds_and_borders: DisplayList::new(),
floats: DisplayList::new(),
content: DisplayList::new(),
- positioned_descendants: SmallVec0::new(),
+ positioned_descendants: Vec::new(),
};
for item in list.move_iter() {
diff --git a/src/components/main/layout/block.rs b/src/components/main/layout/block.rs
index 5e80bbcb04d..0b8a097a949 100644
--- a/src/components/main/layout/block.rs
+++ b/src/components/main/layout/block.rs
@@ -38,7 +38,6 @@ use gfx::render_task::RenderLayer;
use servo_msg::compositor_msg::{FixedPosition, LayerId, Scrollable};
use servo_util::geometry::Au;
use servo_util::geometry;
-use servo_util::smallvec::{SmallVec, SmallVec0};
use std::mem;
use std::num::Zero;
use style::computed_values::{LPA_Auto, LPA_Length, LPA_Percentage, LPN_Length, LPN_None};
@@ -733,7 +732,7 @@ impl BlockFlow {
/// In the case of absolute flow kids, they have their hypothetical box
/// position already set.
fn collect_static_y_offsets_from_kids(&mut self) {
- let mut abs_descendant_y_offsets = SmallVec0::new();
+ let mut abs_descendant_y_offsets = Vec::new();
for kid in self.base.child_iter() {
let mut gives_abs_offsets = true;
if kid.is_block_like() {
@@ -753,8 +752,10 @@ impl BlockFlow {
if gives_abs_offsets {
let kid_base = flow::mut_base(kid);
+ // Avoid copying the offset vector.
+ let offsets = mem::replace(&mut kid_base.abs_descendants.static_y_offsets, Vec::new());
// Consume all the static y-offsets bubbled up by kid.
- for y_offset in kid_base.abs_descendants.static_y_offsets.move_iter() {
+ for y_offset in offsets.move_iter() {
// The offsets are wrt the kid flow box. Translate them to current flow.
abs_descendant_y_offsets.push(y_offset + kid_base.position.origin.y);
}
diff --git a/src/components/main/layout/construct.rs b/src/components/main/layout/construct.rs
index b5aeaa65d2b..e7523039551 100644
--- a/src/components/main/layout/construct.rs
+++ b/src/components/main/layout/construct.rs
@@ -57,7 +57,6 @@ use script::dom::node::{TextNodeTypeId};
use script::dom::text::Text;
use servo_util::namespace;
use servo_util::range::Range;
-use servo_util::smallvec::{SmallVec, SmallVec0};
use servo_util::str::is_whitespace;
use servo_util::url::{is_image_data, parse_url};
use std::mem;
@@ -1163,7 +1162,7 @@ fn strip_ignorable_whitespace_from_start(boxes: &mut InlineBoxes) {
// FIXME(#2264, pcwalton): This is slow because vector shift is broken. :(
let mut found_nonwhitespace = false;
- let mut new_boxes = SmallVec0::new();
+ let mut new_boxes = Vec::new();
for fragment in old_boxes.iter() {
if !found_nonwhitespace && fragment.is_whitespace_only() {
debug!("stripping ignorable whitespace from start");
diff --git a/src/components/main/layout/flow.rs b/src/components/main/layout/flow.rs
index f599e5f7225..6be1e43adc6 100644
--- a/src/components/main/layout/flow.rs
+++ b/src/components/main/layout/flow.rs
@@ -54,7 +54,6 @@ use gfx::display_list::DisplayList;
use gfx::render_task::RenderLayer;
use servo_msg::compositor_msg::LayerId;
use servo_util::geometry::Au;
-use servo_util::smallvec::{SmallVec, SmallVec0};
use std::cast;
use std::iter::Zip;
use std::num::Zero;
@@ -558,16 +557,16 @@ impl FlowFlags {
/// FIXME: This should use @pcwalton's reference counting scheme (Coming Soon).
pub struct Descendants {
/// Links to every Descendant.
- pub descendant_links: SmallVec0<Rawlink>,
+ pub descendant_links: Vec<Rawlink>,
/// Static y offsets of all descendants from the start of this flow box.
- pub static_y_offsets: SmallVec0<Au>,
+ pub static_y_offsets: Vec<Au>,
}
impl Descendants {
pub fn new() -> Descendants {
Descendants {
- descendant_links: SmallVec0::new(),
- static_y_offsets: SmallVec0::new(),
+ descendant_links: Vec::new(),
+ static_y_offsets: Vec::new(),
}
}
diff --git a/src/components/main/layout/inline.rs b/src/components/main/layout/inline.rs
index f61debb7cf1..293a2bdb8fa 100644
--- a/src/components/main/layout/inline.rs
+++ b/src/components/main/layout/inline.rs
@@ -21,7 +21,6 @@ use gfx::font_context::FontContext;
use servo_util::geometry::Au;
use servo_util::geometry;
use servo_util::range::Range;
-use servo_util::smallvec::{SmallVec, SmallVec0};
use std::iter::Enumerate;
use std::mem;
use std::slice::{Items, MutItems};
@@ -63,10 +62,10 @@ pub struct LineBox {
struct LineboxScanner {
pub floats: Floats,
- pub new_boxes: SmallVec0<Box>,
+ pub new_boxes: Vec<Box>,
pub work_list: RingBuf<Box>,
pub pending_line: LineBox,
- pub lines: SmallVec0<LineBox>,
+ pub lines: Vec<LineBox>,
pub cur_y: Au,
}
@@ -74,14 +73,14 @@ impl LineboxScanner {
pub fn new(float_ctx: Floats) -> LineboxScanner {
LineboxScanner {
floats: float_ctx,
- new_boxes: SmallVec0::new(),
+ new_boxes: Vec::new(),
work_list: RingBuf::new(),
pending_line: LineBox {
range: Range::empty(),
bounds: Rect(Point2D(Au::new(0), Au::new(0)), Size2D(Au::new(0), Au::new(0))),
green_zone: Size2D(Au::new(0), Au::new(0))
},
- lines: SmallVec0::new(),
+ lines: Vec::new(),
cur_y: Au::new(0)
}
}
@@ -92,8 +91,8 @@ impl LineboxScanner {
fn reset_scanner(&mut self) {
debug!("Resetting line box scanner's state for flow.");
- self.lines = SmallVec0::new();
- self.new_boxes = SmallVec0::new();
+ self.lines = Vec::new();
+ self.new_boxes = Vec::new();
self.cur_y = Au(0);
self.reset_linebox();
}
@@ -154,11 +153,11 @@ impl LineboxScanner {
map.fixup(old_boxes.as_slice(), self.new_boxes.as_slice());
flow.boxes = InlineBoxes {
- boxes: mem::replace(&mut self.new_boxes, SmallVec0::new()),
+ boxes: mem::replace(&mut self.new_boxes, Vec::new()),
map: map,
};
- flow.lines = mem::replace(&mut self.lines, SmallVec0::new());
+ flow.lines = mem::replace(&mut self.lines, Vec::new());
}
fn flush_current_line(&mut self) {
@@ -492,7 +491,7 @@ impl<'a> Iterator<(&'a mut Box, InlineFragmentContext<'a>)> for MutBoxIterator<'
/// Represents a list of inline boxes, including element ranges.
pub struct InlineBoxes {
/// The boxes themselves.
- pub boxes: SmallVec0<Box>,
+ pub boxes: Vec<Box>,
/// Tracks the elements that made up the boxes above.
pub map: FragmentMap,
}
@@ -501,7 +500,7 @@ impl InlineBoxes {
/// Creates an empty set of inline boxes.
pub fn new() -> InlineBoxes {
InlineBoxes {
- boxes: SmallVec0::new(),
+ boxes: Vec::new(),
map: FragmentMap::new(),
}
}
@@ -572,7 +571,7 @@ pub struct InlineFlow {
/// A vector of ranges into boxes that represents line positions. These ranges are disjoint and
/// are the result of inline layout. This also includes some metadata used for positioning
/// lines.
- pub lines: SmallVec0<LineBox>,
+ pub lines: Vec<LineBox>,
/// The minimum height above the baseline for each line, as specified by the line height and
/// font style.
@@ -588,7 +587,7 @@ impl InlineFlow {
InlineFlow {
base: BaseFlow::new(node),
boxes: boxes,
- lines: SmallVec0::new(),
+ lines: Vec::new(),
minimum_height_above_baseline: Au(0),
minimum_depth_below_baseline: Au(0),
}
@@ -1045,14 +1044,14 @@ impl<'a> Iterator<&'a FragmentRange> for RangeIterator<'a> {
/// Information that inline flows keep about nested elements. This is used to recover the DOM
/// structure from the flat box list when it's needed.
pub struct FragmentMap {
- list: SmallVec0<FragmentRange>,
+ list: Vec<FragmentRange>,
}
impl FragmentMap {
/// Creates a new fragment map.
pub fn new() -> FragmentMap {
FragmentMap {
- list: SmallVec0::new(),
+ list: Vec::new(),
}
}
@@ -1105,8 +1104,8 @@ impl FragmentMap {
/// needlessly has to clone boxes.
pub fn fixup(&mut self, old_fragments: &[Box], new_fragments: &[Box]) {
// TODO(pcwalton): Post Rust upgrade, use `with_capacity` here.
- let mut old_list = mem::replace(&mut self.list, SmallVec0::new());
- let mut worklist = SmallVec0::new(); // FIXME(#2269, pcwalton): was smallvec4
+ let mut old_list = mem::replace(&mut self.list, Vec::new());
+ let mut worklist = Vec::new(); // FIXME(#2269, pcwalton): was smallvec4
let mut old_list_iter = old_list.move_iter().peekable();
let mut new_fragments_iter = new_fragments.iter().enumerate().peekable();
diff --git a/src/components/main/layout/text.rs b/src/components/main/layout/text.rs
index 2b048bf60c8..3757bef9d80 100644
--- a/src/components/main/layout/text.rs
+++ b/src/components/main/layout/text.rs
@@ -14,7 +14,6 @@ use gfx::text::text_run::TextRun;
use gfx::text::util::{CompressWhitespaceNewline, transform_text, CompressNone};
use servo_util::geometry::Au;
use servo_util::range::Range;
-use servo_util::smallvec::{SmallVec, SmallVec0};
use std::mem;
use style::ComputedValues;
use style::computed_values::{font_family, line_height, white_space};
@@ -54,7 +53,7 @@ impl TextRunScanner {
} = mem::replace(&mut flow.as_inline().boxes, InlineBoxes::new());
let mut last_whitespace = true;
- let mut new_boxes = SmallVec0::new();
+ let mut new_boxes = Vec::new();
for box_i in range(0, old_boxes.len()) {
debug!("TextRunScanner: considering box: {:u}", box_i);
if box_i > 0 && !can_coalesce_text_nodes(old_boxes.as_slice(), box_i - 1, box_i) {
@@ -97,7 +96,7 @@ impl TextRunScanner {
pub fn flush_clump_to_list(&mut self,
font_context: &mut FontContext,
in_boxes: &[Box],
- out_boxes: &mut SmallVec0<Box>,
+ out_boxes: &mut Vec<Box>,
last_whitespace: bool)
-> bool {
assert!(self.clump.length() > 0);
diff --git a/src/components/util/smallvec.rs b/src/components/util/smallvec.rs
index 4262419b8c1..655f20a685c 100644
--- a/src/components/util/smallvec.rs
+++ b/src/components/util/smallvec.rs
@@ -312,11 +312,7 @@ macro_rules! def_small_vector(
ptr: *T,
data: [T, ..$size],
}
- )
-)
-macro_rules! def_small_vector_private_trait_impl(
- ($name:ident, $size:expr) => (
impl<T> SmallVecPrivate<T> for $name<T> {
unsafe fn set_len(&mut self, new_len: uint) {
self.len = new_len
@@ -342,11 +338,7 @@ macro_rules! def_small_vector_private_trait_impl(
self.ptr = cast::transmute(new_ptr)
}
}
- )
-)
-macro_rules! def_small_vector_trait_impl(
- ($name:ident, $size:expr) => (
impl<T> SmallVec<T> for $name<T> {
fn inline_size(&self) -> uint {
$size
@@ -358,51 +350,7 @@ macro_rules! def_small_vector_trait_impl(
self.cap
}
}
- )
-)
-
-macro_rules! def_small_vector_drop_impl(
- ($name:ident, $size:expr) => (
- #[unsafe_destructor]
- impl<T> Drop for $name<T> {
- fn drop(&mut self) {
- if !self.spilled() {
- return
- }
-
- unsafe {
- let ptr = self.mut_ptr();
- for i in range(0, self.len()) {
- *ptr.offset(i as int) = mem::uninit();
- }
- if intrinsics::owns_managed::<T>() {
- local_heap::local_free(self.ptr() as *u8)
- } else {
- global_heap::exchange_free(self.ptr() as *u8)
- }
- }
- }
- }
- )
-)
-
-macro_rules! def_small_vector_clone_impl(
- ($name:ident) => (
- impl<T:Clone> Clone for $name<T> {
- fn clone(&self) -> $name<T> {
- let mut new_vector = $name::new();
- for element in self.iter() {
- new_vector.push((*element).clone())
- }
- new_vector
- }
- }
- )
-)
-
-macro_rules! def_small_vector_impl(
- ($name:ident, $size:expr) => (
impl<T> $name<T> {
#[inline]
pub fn new() -> $name<T> {
@@ -419,6 +367,14 @@ macro_rules! def_small_vector_impl(
)
)
+def_small_vector!(SmallVec1, 1)
+def_small_vector!(SmallVec2, 2)
+def_small_vector!(SmallVec4, 4)
+def_small_vector!(SmallVec8, 8)
+def_small_vector!(SmallVec16, 16)
+def_small_vector!(SmallVec24, 24)
+def_small_vector!(SmallVec32, 32)
+
/// TODO(pcwalton): Remove in favor of `vec_ng` after a Rust upgrade.
pub struct SmallVec0<T> {
len: uint,
@@ -472,57 +428,63 @@ impl<T> SmallVec0<T> {
}
}
-def_small_vector_drop_impl!(SmallVec0, 0)
-def_small_vector_clone_impl!(SmallVec0)
+macro_rules! def_small_vector_drop_impl(
+ ($name:ident, $size:expr) => (
+ #[unsafe_destructor]
+ impl<T> Drop for $name<T> {
+ fn drop(&mut self) {
+ if !self.spilled() {
+ return
+ }
-def_small_vector!(SmallVec1, 1)
-def_small_vector_private_trait_impl!(SmallVec1, 1)
-def_small_vector_trait_impl!(SmallVec1, 1)
-def_small_vector_drop_impl!(SmallVec1, 1)
-def_small_vector_clone_impl!(SmallVec1)
-def_small_vector_impl!(SmallVec1, 1)
+ unsafe {
+ let ptr = self.mut_ptr();
+ for i in range(0, self.len()) {
+ *ptr.offset(i as int) = mem::uninit();
+ }
-def_small_vector!(SmallVec2, 2)
-def_small_vector_private_trait_impl!(SmallVec2, 2)
-def_small_vector_trait_impl!(SmallVec2, 2)
-def_small_vector_drop_impl!(SmallVec2, 2)
-def_small_vector_clone_impl!(SmallVec2)
-def_small_vector_impl!(SmallVec2, 2)
+ if intrinsics::owns_managed::<T>() {
+ local_heap::local_free(self.ptr() as *u8)
+ } else {
+ global_heap::exchange_free(self.ptr() as *u8)
+ }
+ }
+ }
+ }
+ )
+)
-def_small_vector!(SmallVec4, 4)
-def_small_vector_private_trait_impl!(SmallVec4, 4)
-def_small_vector_trait_impl!(SmallVec4, 4)
+def_small_vector_drop_impl!(SmallVec0, 0)
+def_small_vector_drop_impl!(SmallVec1, 1)
+def_small_vector_drop_impl!(SmallVec2, 2)
def_small_vector_drop_impl!(SmallVec4, 4)
-def_small_vector_clone_impl!(SmallVec4)
-def_small_vector_impl!(SmallVec4, 4)
-
-def_small_vector!(SmallVec8, 8)
-def_small_vector_private_trait_impl!(SmallVec8, 8)
-def_small_vector_trait_impl!(SmallVec8, 8)
def_small_vector_drop_impl!(SmallVec8, 8)
-def_small_vector_clone_impl!(SmallVec8)
-def_small_vector_impl!(SmallVec8, 8)
-
-def_small_vector!(SmallVec16, 16)
-def_small_vector_private_trait_impl!(SmallVec16, 16)
-def_small_vector_trait_impl!(SmallVec16, 16)
def_small_vector_drop_impl!(SmallVec16, 16)
-def_small_vector_clone_impl!(SmallVec16)
-def_small_vector_impl!(SmallVec16, 16)
-
-def_small_vector!(SmallVec24, 24)
-def_small_vector_private_trait_impl!(SmallVec24, 24)
-def_small_vector_trait_impl!(SmallVec24, 24)
def_small_vector_drop_impl!(SmallVec24, 24)
-def_small_vector_clone_impl!(SmallVec24)
-def_small_vector_impl!(SmallVec24, 24)
-
-def_small_vector!(SmallVec32, 32)
-def_small_vector_private_trait_impl!(SmallVec32, 32)
-def_small_vector_trait_impl!(SmallVec32, 32)
def_small_vector_drop_impl!(SmallVec32, 32)
+
+macro_rules! def_small_vector_clone_impl(
+ ($name:ident) => (
+ impl<T:Clone> Clone for $name<T> {
+ fn clone(&self) -> $name<T> {
+ let mut new_vector = $name::new();
+ for element in self.iter() {
+ new_vector.push((*element).clone())
+ }
+ new_vector
+ }
+ }
+ )
+)
+
+def_small_vector_clone_impl!(SmallVec0)
+def_small_vector_clone_impl!(SmallVec1)
+def_small_vector_clone_impl!(SmallVec2)
+def_small_vector_clone_impl!(SmallVec4)
+def_small_vector_clone_impl!(SmallVec8)
+def_small_vector_clone_impl!(SmallVec16)
+def_small_vector_clone_impl!(SmallVec24)
def_small_vector_clone_impl!(SmallVec32)
-def_small_vector_impl!(SmallVec32, 32)
#[cfg(test)]
pub mod tests {