From 848a8581ac4fb16980d4cc6c990a91e3c61a60ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Fri, 1 Dec 2017 20:53:52 +0100 Subject: [PATCH] style: Don't waste an allocation when failing to parse a color. 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. --- components/style/values/specified/color.rs | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/components/style/values/specified/color.rs b/components/style/values/specified/color.rs index a9f83e0d471..2c961dea86a 100644 --- a/components/style/values/specified/color.rs +++ b/components/style/values/specified/color.rs @@ -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(