aboutsummaryrefslogtreecommitdiffstats
path: root/components/util
diff options
context:
space:
mode:
Diffstat (limited to 'components/util')
-rw-r--r--components/util/Cargo.toml4
-rw-r--r--components/util/lib.rs2
-rw-r--r--components/util/mem.rs133
3 files changed, 130 insertions, 9 deletions
diff --git a/components/util/Cargo.toml b/components/util/Cargo.toml
index 2796a6e0f35..5a537c251c9 100644
--- a/components/util/Cargo.toml
+++ b/components/util/Cargo.toml
@@ -38,6 +38,9 @@ git = "https://github.com/pcwalton/ipc-channel"
version = "0.2"
features = [ "serde_serialization" ]
+[dependencies.selectors]
+git = "https://github.com/servo/rust-selectors"
+
[dependencies]
log = "0.3"
bitflags = "0.3"
@@ -54,3 +57,4 @@ serde_macros = "0.5"
string_cache = "0.1"
lazy_static = "0.1"
getopts = "0.2.11"
+hyper = "0.6"
diff --git a/components/util/lib.rs b/components/util/lib.rs
index c8cc8a9770c..4c2ef7f6746 100644
--- a/components/util/lib.rs
+++ b/components/util/lib.rs
@@ -31,6 +31,7 @@ extern crate alloc;
extern crate euclid;
extern crate getopts;
extern crate html5ever;
+extern crate hyper;
extern crate ipc_channel;
extern crate js;
extern crate layers;
@@ -39,6 +40,7 @@ extern crate num as num_lib;
extern crate num_cpus;
extern crate rand;
extern crate rustc_serialize;
+extern crate selectors;
extern crate serde;
extern crate smallvec;
extern crate string_cache;
diff --git a/components/util/mem.rs b/components/util/mem.rs
index eb5785a40df..8619cbf2d5e 100644
--- a/components/util/mem.rs
+++ b/components/util/mem.rs
@@ -11,7 +11,7 @@ use std::hash::Hash;
use std::mem::{size_of, transmute};
use std::sync::Arc;
use std::rc::Rc;
-
+use std::result::Result;
use azure::azure_hl::Color;
use cssparser::Color as CSSParserColor;
@@ -28,8 +28,16 @@ use js::rust::GCMethods;
use js::jsval::JSVal;
use logical_geometry::WritingMode;
use range::Range;
+use str::LengthOrPercentageOrAuto;
use string_cache::atom::Atom;
+use string_cache::namespace::Namespace;
use url;
+use hyper::method::Method;
+use hyper::http::RawStatus;
+use hyper::header::ContentType;
+use hyper::mime::{Mime, TopLevel, SubLevel, Attr, Value};
+use selectors::parser::{PseudoElement, Selector, CompoundSelector, SimpleSelector, Combinator};
+use rand::OsRng;
extern {
// Get the size of a heap block.
@@ -285,6 +293,118 @@ macro_rules! known_heap_size(
);
);
+// This is measured properly by the heap measurement implemented in SpiderMonkey.
+impl<T: Copy + GCMethods<T>> HeapSizeOf for Heap<T> {
+ fn heap_size_of_children(&self) -> usize {
+ 0
+ }
+}
+
+impl HeapSizeOf for Method {
+ fn heap_size_of_children(&self) -> usize {
+ match self {
+ &Method::Extension(ref str) => str.heap_size_of_children(),
+ _ => 0
+ }
+ }
+}
+
+impl<T: HeapSizeOf, U: HeapSizeOf> HeapSizeOf for Result<T, U> {
+ fn heap_size_of_children(&self) -> usize {
+ match self {
+ &Result::Ok(ref ok) => ok.heap_size_of_children(),
+ &Result::Err(ref err) => err.heap_size_of_children()
+ }
+ }
+}
+
+impl HeapSizeOf for () {
+ fn heap_size_of_children(&self) -> usize {
+ 0
+ }
+}
+
+impl HeapSizeOf for Selector {
+ fn heap_size_of_children(&self) -> usize {
+ let &Selector { ref compound_selectors, ref pseudo_element, ref specificity } = self;
+ compound_selectors.heap_size_of_children() + pseudo_element.heap_size_of_children() +
+ specificity.heap_size_of_children()
+ }
+}
+
+impl HeapSizeOf for CompoundSelector {
+ fn heap_size_of_children(&self) -> usize {
+ let &CompoundSelector { ref simple_selectors, ref next } = self;
+ simple_selectors.heap_size_of_children() + next.heap_size_of_children()
+ }
+}
+
+impl HeapSizeOf for SimpleSelector {
+ fn heap_size_of_children(&self) -> usize {
+ match self {
+ &SimpleSelector::Negation(ref vec) => vec.heap_size_of_children(),
+ &SimpleSelector::AttrIncludes(_, ref str) | &SimpleSelector::AttrPrefixMatch(_, ref str) |
+ &SimpleSelector::AttrSubstringMatch(_, ref str) | &SimpleSelector::AttrSuffixMatch(_, ref str)
+ => str.heap_size_of_children(),
+ &SimpleSelector::AttrEqual(_, ref str, _) => str.heap_size_of_children(),
+ &SimpleSelector::AttrDashMatch(_, ref first, ref second) => first.heap_size_of_children()
+ + second.heap_size_of_children(),
+ // All other types come down to Atom, enum or i32, all 0
+ _ => 0
+ }
+ }
+}
+
+impl HeapSizeOf for ContentType {
+ fn heap_size_of_children(&self) -> usize {
+ let &ContentType(ref mime) = self;
+ mime.heap_size_of_children()
+ }
+}
+
+impl HeapSizeOf for Mime {
+ fn heap_size_of_children(&self) -> usize {
+ let &Mime(ref top_level, ref sub_level, ref vec) = self;
+ top_level.heap_size_of_children() + sub_level.heap_size_of_children() +
+ vec.heap_size_of_children()
+ }
+}
+
+impl HeapSizeOf for TopLevel {
+ fn heap_size_of_children(&self) -> usize {
+ match self {
+ &TopLevel::Ext(ref str) => str.heap_size_of_children(),
+ _ => 0
+ }
+ }
+}
+
+impl HeapSizeOf for SubLevel {
+ fn heap_size_of_children(&self) -> usize {
+ match self {
+ &SubLevel::Ext(ref str) => str.heap_size_of_children(),
+ _ => 0
+ }
+ }
+}
+
+impl HeapSizeOf for Attr {
+ fn heap_size_of_children(&self) -> usize {
+ match self {
+ &Attr::Ext(ref str) => str.heap_size_of_children(),
+ _ => 0
+ }
+ }
+}
+
+impl HeapSizeOf for Value {
+ fn heap_size_of_children(&self) -> usize {
+ match self {
+ &Value::Ext(ref str) => str.heap_size_of_children(),
+ _ => 0
+ }
+ }
+}
known_heap_size!(0, u8, u16, u32, u64, usize);
known_heap_size!(0, i8, i16, i32, i64, isize);
@@ -293,12 +413,7 @@ known_heap_size!(0, bool, f32, f64);
known_heap_size!(0, Rect<T>, Point2D<T>, Size2D<T>, Matrix2D<T>, SideOffsets2D<T>, Range<T>);
known_heap_size!(0, Length<T, U>, ScaleFactor<T, U, V>);
-known_heap_size!(0, Au, WritingMode, CSSParserColor, Color, RGBA, Cursor, Matrix4, Atom);
-known_heap_size!(0, JSVal, PagePx, ViewportPx, DevicePixel, QuirksMode);
+known_heap_size!(0, Au, WritingMode, CSSParserColor, Color, RGBA, Cursor, Matrix4, Atom, Namespace);
+known_heap_size!(0, JSVal, PagePx, ViewportPx, DevicePixel, QuirksMode, OsRng, RawStatus, LengthOrPercentageOrAuto);
-// This is measured properly by the heap measurement implemented in SpiderMonkey.
-impl<T: Copy + GCMethods<T>> HeapSizeOf for Heap<T> {
- fn heap_size_of_children(&self) -> usize {
- 0
- }
-}
+known_heap_size!(0, PseudoElement, Combinator, str);