Auto merge of #19455 - emilio:color-does-stupid-things-too, r=upsuper

style: Don't waste an allocation when failing to parse a CSSParserColor.

I see that allocation show up in the profiles, and it makes sense, because
system colors and such are common in Firefox, and they're just wasting it.

Note that the clone() added is refcounted.

<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/19455)
<!-- Reviewable:end -->
This commit is contained in:
bors-servo 2017-12-01 18:03:11 -06:00 committed by GitHub
commit 49e6594bc9

View file

@ -213,7 +213,7 @@ impl Color {
// specified value.
let start = input.state();
let authored = match input.next() {
Ok(&Token::Ident(ref s)) => Some(s.to_lowercase().into_boxed_str()),
Ok(&Token::Ident(ref s)) => Some(s.clone()),
_ => None,
};
input.reset(&start);
@ -221,19 +221,25 @@ impl Color {
Ok(value) =>
Ok(match value {
CSSParserColor::CurrentColor => Color::CurrentColor,
CSSParserColor::RGBA(rgba) => Color::Numeric {
parsed: rgba,
authored: authored,
},
CSSParserColor::RGBA(rgba) => {
Color::Numeric {
parsed: rgba,
authored: authored.map(|s| s.to_lowercase().into_boxed_str()),
}
}
}),
Err(e) => {
#[cfg(feature = "gecko")] {
#[cfg(feature = "gecko")]
{
if let Ok(system) = input.try(SystemColor::parse) {
return Ok(Color::System(system));
} else if let Ok(c) = gecko::SpecialColorKeyword::parse(input) {
}
if let Ok(c) = gecko::SpecialColorKeyword::parse(input) {
return Ok(Color::Special(c));
}
}
match e {
BasicParseError { kind: BasicParseErrorKind::UnexpectedToken(t), location } => {
Err(location.new_custom_error(