diff --git a/servo/components/style/lib.rs b/servo/components/style/lib.rs index b82d2fd3cc0a2698189efd9cb456de4d98cf9f2c..e1453706977d668e5ab0cd7883536f54fb31cbc1 100644 --- a/servo/components/style/lib.rs +++ b/servo/components/style/lib.rs @@ -171,7 +171,7 @@ pub mod gecko_properties { } macro_rules! reexport_computed_values { - ( $( $name: ident )+ ) => { + ( $( { $name: ident, $boxed: expr } )+ ) => { /// Types for [computed values][computed]. /// /// [computed]: https://drafts.csswg.org/css-cascade/#computed diff --git a/servo/components/style/properties/properties.mako.rs b/servo/components/style/properties/properties.mako.rs index a80fcfb8c1e140787becd97be7f5d93dbfb96f43..ab8fce24621c08c9263f14dd29f91acb8098de91 100644 --- a/servo/components/style/properties/properties.mako.rs +++ b/servo/components/style/properties/properties.mako.rs @@ -3442,49 +3442,13 @@ macro_rules! css_properties_accessors { } } - +#[macro_export] macro_rules! longhand_properties_idents { ($macro_name: ident) => { $macro_name! { % for property in data.longhands: - ${property.ident} + { ${property.ident}, ${"true" if property.boxed else "false"} } % endfor } } } - -/// Testing function to check the size of all SpecifiedValues. -#[cfg(feature = "testing")] -pub fn test_size_of_specified_values() { - use std::mem::size_of; - let threshold = 24; - - let mut longhands = vec![]; - % for property in data.longhands: - longhands.push(("${property.name}", - size_of::<longhands::${property.ident}::SpecifiedValue>(), - ${"true" if property.boxed else "false"})); - % endfor - - let mut failing_messages = vec![]; - - for specified_value in longhands { - if specified_value.1 > threshold && !specified_value.2 { - failing_messages.push( - format!("Your changes have increased the size of {} SpecifiedValue to {}. The threshold is \ - currently {}. SpecifiedValues affect size of PropertyDeclaration enum and \ - increasing the size may negative affect style system performance. Please consider \ - using `boxed=\"True\"` in this longhand.", - specified_value.0, specified_value.1, threshold)); - } else if specified_value.1 <= threshold && specified_value.2 { - failing_messages.push( - format!("Your changes have decreased the size of {} SpecifiedValue to {}. Good work! \ - The threshold is currently {}. Please consider removing `boxed=\"True\"` from this longhand.", - specified_value.0, specified_value.1, threshold)); - } - } - - if !failing_messages.is_empty() { - panic!("{}", failing_messages.join("\n\n")); - } -} diff --git a/servo/tests/unit/style/Cargo.toml b/servo/tests/unit/style/Cargo.toml index 51a0278c989b3c0ddf5e946d736e66d2b81b5f43..53585feb6677e65b8bc30c0dd2de7e8d593600e0 100644 --- a/servo/tests/unit/style/Cargo.toml +++ b/servo/tests/unit/style/Cargo.toml @@ -9,9 +9,6 @@ name = "style_tests" path = "lib.rs" doctest = false -[features] -testing = ["style/testing"] - [dependencies] byteorder = "1.0" app_units = "0.5" diff --git a/servo/tests/unit/style/lib.rs b/servo/tests/unit/style/lib.rs index 0647a59251fd1cb730d0168693f9d2616d649a2d..572a608d212d15965ae6e308cd560bbb5ef7e08b 100644 --- a/servo/tests/unit/style/lib.rs +++ b/servo/tests/unit/style/lib.rs @@ -19,7 +19,7 @@ extern crate servo_atoms; extern crate servo_config; extern crate servo_url; #[macro_use] extern crate size_of_test; -extern crate style; +#[macro_use] extern crate style; extern crate style_traits; extern crate test; @@ -32,6 +32,8 @@ mod parsing; mod properties; mod rule_tree; mod size_of; +#[path = "../stylo/specified_values.rs"] +mod specified_values; mod str; mod stylesheets; mod stylist; diff --git a/servo/tests/unit/style/size_of.rs b/servo/tests/unit/style/size_of.rs index 486fecf4e25fd9f08001ec9f01f480d6979f0ee5..3f15a8d24e44ba60b1b77b3eb450e229f75d8219 100644 --- a/servo/tests/unit/style/size_of.rs +++ b/servo/tests/unit/style/size_of.rs @@ -12,8 +12,3 @@ size_of_test!(test_size_of_property_declaration, properties::PropertyDeclaration // This is huge, but we allocate it on the stack and then never move it, // we only pass `&mut SourcePropertyDeclaration` references around. size_of_test!(test_size_of_parsed_declaration, properties::SourcePropertyDeclaration, 576); - -#[test] -fn size_of_specified_values() { - ::style::properties::test_size_of_specified_values(); -} diff --git a/servo/tests/unit/stylo/Cargo.toml b/servo/tests/unit/stylo/Cargo.toml index 21eab2958a18f2868c448d21a8f8639b6f1dc8ec..b3381276ff12d985a493432d6bd6692c52f7a084 100644 --- a/servo/tests/unit/stylo/Cargo.toml +++ b/servo/tests/unit/stylo/Cargo.toml @@ -11,9 +11,6 @@ name = "stylo_tests" path = "lib.rs" doctest = false -[features] -testing = ["style/testing"] - [dependencies] atomic_refcell = "0.1" cssparser = "0.18" diff --git a/servo/tests/unit/stylo/lib.rs b/servo/tests/unit/stylo/lib.rs index 05a32869c4eb5fcf5c858b71f45be9cc76a96b5a..45b9d63a9fdad6d27c11cd3092b32d10300f3fd9 100644 --- a/servo/tests/unit/stylo/lib.rs +++ b/servo/tests/unit/stylo/lib.rs @@ -14,6 +14,7 @@ extern crate style_traits; mod sanity_checks; mod size_of; +mod specified_values; mod servo_function_signatures; diff --git a/servo/tests/unit/stylo/size_of.rs b/servo/tests/unit/stylo/size_of.rs index 4f4521df9e28320f52bfb616b8c1cc817fa99dca..3a830e1c40a28c2f791d52433d715fe00665f30b 100644 --- a/servo/tests/unit/stylo/size_of.rs +++ b/servo/tests/unit/stylo/size_of.rs @@ -47,8 +47,3 @@ size_of_test!(test_size_of_rule_node, RuleNode, 80); // This is huge, but we allocate it on the stack and then never move it, // we only pass `&mut SourcePropertyDeclaration` references around. size_of_test!(test_size_of_parsed_declaration, style::properties::SourcePropertyDeclaration, 704); - -#[test] -fn size_of_specified_values() { - ::style::properties::test_size_of_specified_values(); -} diff --git a/servo/tests/unit/stylo/specified_values.rs b/servo/tests/unit/stylo/specified_values.rs new file mode 100644 index 0000000000000000000000000000000000000000..484f9534502bc56e24ba01e593bc72824577358f --- /dev/null +++ b/servo/tests/unit/stylo/specified_values.rs @@ -0,0 +1,49 @@ +/* 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 style; + +#[test] +fn size_of_specified_values() { + use std::mem::size_of; + let threshold = 24; + + let mut bad_properties = vec![]; + + macro_rules! check_property { + ( $( { $name: ident, $boxed: expr } )+ ) => { + $( + let size = size_of::<style::properties::longhands::$name::SpecifiedValue>(); + let is_boxed = $boxed; + if (!is_boxed && size > threshold) || (is_boxed && size <= threshold) { + bad_properties.push(("$name", size, is_boxed)); + } + )+ + } + } + + longhand_properties_idents!(check_property); + + let mut failing_messages = vec![]; + + for bad_prop in bad_properties { + if !bad_prop.2 { + failing_messages.push( + format!("Your changes have increased the size of {} SpecifiedValue to {}. The threshold is \ + currently {}. SpecifiedValues affect size of PropertyDeclaration enum and \ + increasing the size may negative affect style system performance. Please consider \ + using `boxed=\"True\"` in this longhand.", + bad_prop.0, bad_prop.1, threshold)); + } else if bad_prop.2 { + failing_messages.push( + format!("Your changes have decreased the size of {} SpecifiedValue to {}. Good work! \ + The threshold is currently {}. Please consider removing `boxed=\"True\"` from this longhand.", + bad_prop.0, bad_prop.1, threshold)); + } + } + + if !failing_messages.is_empty() { + panic!("{}", failing_messages.join("\n\n")); + } +}