aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbors-servo <metajack+bors@gmail.com>2014-12-08 23:01:05 -0700
committerbors-servo <metajack+bors@gmail.com>2014-12-08 23:01:05 -0700
commit2f80a3bac66ae3d0a84b5f4317ebfb537c5c6e2c (patch)
tree2a86d17f8cd6d50c41b5a465ca240390779d0ffc
parent2741fd2e139b9cb8e9f14857877f567ecae3bced (diff)
parentf221cb5178f2f4d837d22ea7f168768622c3268d (diff)
downloadservo-2f80a3bac66ae3d0a84b5f4317ebfb537c5c6e2c.tar.gz
servo-2f80a3bac66ae3d0a84b5f4317ebfb537c5c6e2c.zip
auto merge of #4160 : Manishearth/servo/a-test-size-dom, r=cgaebel
-rw-r--r--components/script/lib.rs3
-rw-r--r--components/script/tests.rs48
2 files changed, 51 insertions, 0 deletions
diff --git a/components/script/lib.rs b/components/script/lib.rs
index de1ddbe5987..2cf8f99d4f3 100644
--- a/components/script/lib.rs
+++ b/components/script/lib.rs
@@ -226,3 +226,6 @@ pub mod script_task;
mod timers;
pub mod textinput;
mod devtools;
+
+#[cfg(all(test, target_word_size = "64"))]
+mod tests;
diff --git a/components/script/tests.rs b/components/script/tests.rs
new file mode 100644
index 00000000000..6675fefd07b
--- /dev/null
+++ b/components/script/tests.rs
@@ -0,0 +1,48 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+use dom::characterdata::CharacterData;
+use dom::element::Element;
+use dom::eventtarget::EventTarget;
+use dom::htmldivelement::HTMLDivElement;
+use dom::htmlelement::HTMLElement;
+use dom::htmlspanelement::HTMLSpanElement;
+use dom::node::Node;
+use dom::text::Text;
+
+use std::mem::size_of;
+
+// Macro so that we can stringify type names
+// I'd really prefer the tests themselves to be run at plugin time,
+// however rustc::middle doesn't have access to the full type data
+macro_rules! sizeof_checker (
+ ($testname: ident, $t:ty, $known_size:expr) => (
+ #[test]
+ fn $testname() {
+ let new = size_of::<$t>();
+ let old = $known_size;
+ if new < old {
+ panic!("Your changes have decreased the stack size of commonly used DOM struct {} from {} to {}. \
+ Good work! Please update the size in script/tests.rs",
+ stringify!($t), old, new)
+ } else if new > old {
+ panic!("Your changes have increased the stack size of commonly used DOM struct {} from {} to {}. \
+ These structs are present in large quantities in the DOM, and increasing the size \
+ may dramatically affect our memory footprint. Please consider choosing a design which \
+ avoids this increase. If you feel that the increase is necessary, \
+ update to the new size in script/tests.rs.",
+ stringify!($t), old, new)
+ }
+ });
+)
+
+// Update the sizes here
+sizeof_checker!(size_event_target, EventTarget, 56)
+sizeof_checker!(size_node, Node, 304)
+sizeof_checker!(size_element, Element, 448)
+sizeof_checker!(size_htmlelement, HTMLElement, 448)
+sizeof_checker!(size_div, HTMLDivElement, 448)
+sizeof_checker!(size_span, HTMLSpanElement, 448)
+sizeof_checker!(size_text, Text, 336)
+sizeof_checker!(size_characterdata, CharacterData, 336)