Skip to content

Commit

Permalink
Run size_of tests with test-stylo.
Browse files Browse the repository at this point in the history
MozReview-Commit-ID: KapDMqX6OjH
  • Loading branch information
bholley committed Mar 15, 2017
1 parent 9f44fd2 commit 6744ed1
Show file tree
Hide file tree
Showing 8 changed files with 77 additions and 51 deletions.
6 changes: 4 additions & 2 deletions components/style/properties/data.py
Expand Up @@ -211,11 +211,13 @@ class PropertiesData(object):
In this situation, the `product` value is ignored while choosing
which shorthands and longhands to generate; and instead all properties for
which code exists for either servo or stylo are generated.
which code exists for either servo or stylo are generated. Note that we skip
this behavior when the style crate is being built in gecko mode, because we
need manual glue for such properties and we don't have it.
"""
def __init__(self, product, testing):
self.product = product
self.testing = testing
self.testing = testing and product != "gecko"
self.style_structs = []
self.current_style_struct = None
self.longhands = []
Expand Down
59 changes: 52 additions & 7 deletions components/style/properties/properties.mako.rs
Expand Up @@ -2387,17 +2387,62 @@ macro_rules! longhand_properties_idents {
}
}

/// Retuns all longhands SpecifiedValue sizes. This is used in unit tests.
/// Testing function to check the size of a PropertyDeclaration. We implement
/// this here so that the code can be used by both servo and stylo unit tests.
/// This is important because structs can have different sizes in stylo and
/// servo.
#[cfg(feature = "testing")]
pub fn specified_value_sizes() -> Vec<(&'static str, usize, bool)> {
pub fn test_size_of_property_declaration() {
use std::mem::size_of;
let mut sizes = vec![];

let old = 48;
let new = size_of::<PropertyDeclaration>();
if new < old {
panic!("Your changes have decreased the stack size of PropertyDeclaration enum from {} to {}. \
Good work! Please update the size in components/style/properties/properties.mako.rs.",
old, new)
} else if new > old {
panic!("Your changes have increased the stack size of PropertyDeclaration enum from {} to {}. \
These enum is present in large quantities in the style, and increasing the size \
may negatively affect style system performance. Please consider using `boxed=\"True\"` in \
the longhand If you feel that the increase is necessary, update to the new size in \
components/style/properties/properties.mako.rs.",
old, new)
}
}

/// 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 = 32;

let mut longhands = vec![];
% for property in data.longhands:
sizes.push(("${property.name}",
size_of::<longhands::${property.ident}::SpecifiedValue>(),
${"true" if property.boxed else "false"}));
longhands.push(("${property.name}",
size_of::<longhands::${property.ident}::SpecifiedValue>(),
${"true" if property.boxed else "false"}));
% endfor

sizes
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"));
}
}
1 change: 1 addition & 0 deletions ports/geckolib/Cargo.toml
Expand Up @@ -11,6 +11,7 @@ crate-type = ["staticlib", "rlib"]

[features]
bindgen = ["style/use_bindgen"]
testing = ["style/testing"]

[dependencies]
atomic_refcell = "0.1"
Expand Down
2 changes: 1 addition & 1 deletion python/servo/testing_commands.py
Expand Up @@ -300,7 +300,7 @@ def test_stylo(self, release=False):
release = ["--release"] if release else []
ret = 0
with cd(path.join("ports", "geckolib")):
ret = call(["cargo", "test", "-p", "stylo_tests"] + release, env=env)
ret = call(["cargo", "test", "-p", "stylo_tests", "--features", "testing"] + release, env=env)
if ret != 0:
return ret
with cd(path.join("ports", "geckolib")):
Expand Down
43 changes: 2 additions & 41 deletions tests/unit/style/size_of.rs
Expand Up @@ -2,51 +2,12 @@
* 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 std::mem::size_of;
use style::properties::{PropertyDeclaration, specified_value_sizes};

#[test]
fn size_of_property_declaration() {
let old = 48;
let new = size_of::<PropertyDeclaration>();
if new < old {
panic!("Your changes have decreased the stack size of PropertyDeclaration enum from {} to {}. \
Good work! Please update the size in tests/unit/style/size_of.rs.",
old, new)
} else if new > old {
panic!("Your changes have increased the stack size of PropertyDeclaration enum from {} to {}. \
These enum is present in large quantities in the style, and increasing the size \
may negatively affect style system performance. Please consider using `boxed=\"True\"` in \
the longhand If you feel that the increase is necessary, update to the new size in \
tests/unit/style/size_of.rs.",
old, new)
}
::style::properties::test_size_of_property_declaration();
}

#[test]
fn size_of_specified_values() {
let threshold = 32;
let longhands = specified_value_sizes();

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"));
}
::style::properties::test_size_of_specified_values();
}
3 changes: 3 additions & 0 deletions tests/unit/stylo/Cargo.toml
Expand Up @@ -11,6 +11,9 @@ name = "stylo_tests"
path = "lib.rs"
doctest = false

[features]
testing = ["style/testing"]

[dependencies]
app_units = "0.4"
atomic_refcell = "0.1"
Expand Down
1 change: 1 addition & 0 deletions tests/unit/stylo/lib.rs
Expand Up @@ -19,6 +19,7 @@ extern crate style;
extern crate style_traits;

mod sanity_checks;
mod size_of;

#[path = "../../../ports/geckolib/stylesheet_loader.rs"]
mod stylesheet_loader;
Expand Down
13 changes: 13 additions & 0 deletions tests/unit/stylo/size_of.rs
@@ -0,0 +1,13 @@
/* 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/. */

#[test]
fn size_of_property_declaration() {
::style::properties::test_size_of_property_declaration();
}

#[test]
fn size_of_specified_values() {
::style::properties::test_size_of_specified_values();
}

0 comments on commit 6744ed1

Please sign in to comment.