From 22a94c2443b0afd156ac1288e14f61e91c728dba Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Tue, 10 Dec 2013 15:48:04 +0000 Subject: [PATCH 1/2] Add some keyword color lookup benchmarks. --- tests.rs | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/tests.rs b/tests.rs index 43664256..1ed582df 100644 --- a/tests.rs +++ b/tests.rs @@ -7,6 +7,7 @@ use std::rt::io; use std::rt::io::Writer; use extra::{tempfile, json}; use extra::json::ToJson; +use extra::test; use super::*; use ast::*; @@ -168,6 +169,27 @@ fn color3_keywords() { } +#[bench] +fn bench_color_lookup_red(b: &mut test::BenchHarness) { + let ident = parse_one_component_value(tokenize("red")).unwrap(); + b.iter(|| assert!(Color::parse(&ident).is_some())); +} + + +#[bench] +fn bench_color_lookup_lightgoldenrodyellow(b: &mut test::BenchHarness) { + let ident = parse_one_component_value(tokenize("lightgoldenrodyellow")).unwrap(); + b.iter(|| assert!(Color::parse(&ident).is_some())); +} + + +#[bench] +fn bench_color_lookup_fail(b: &mut test::BenchHarness) { + let ident = parse_one_component_value(tokenize("lightgoldenrodyellowbazinga")).unwrap(); + b.iter(|| assert!(Color::parse(&ident).is_none())); +} + + #[test] fn nth() { do run_json_tests(include_str!("css-parsing-tests/An+B.json")) |input| { From 1d36062851ef9778b5883d4588e9ec0b052bd353 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Tue, 10 Dec 2013 16:00:08 +0000 Subject: [PATCH 2/2] Remove Python-generated binary search and use match for color keywords. --- .gitignore | 1 - Makefile.in | 7 +- color.rs | 163 +++++++++++++++++++++++++++++++++++-- make_color_data.py | 196 --------------------------------------------- 4 files changed, 156 insertions(+), 211 deletions(-) delete mode 100644 make_color_data.py diff --git a/.gitignore b/.gitignore index 6cf2809d..f646df45 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,3 @@ *.dummy *-test Makefile -/color_data.rs diff --git a/Makefile.in b/Makefile.in index 5c67d252..1009d63c 100644 --- a/Makefile.in +++ b/Makefile.in @@ -7,8 +7,7 @@ AR ?= ar RUSTC ?= rustc RUSTFLAGS ?= -COLOR_DATA_RS=$(VPATH)/color_data.rs -RUST_SRC=$(shell find $(VPATH)/. -type f -name '*.rs') $(COLOR_DATA_RS) +RUST_SRC=$(shell find $(VPATH)/. -type f -name '*.rs') .PHONY: all all: libcssparser.dummy @@ -31,7 +30,3 @@ check-debug: cssparser-tests .PHONY: clean clean: rm -f *.o *.a *.so *.dylib *.dll *.dummy *-test - - -$(COLOR_DATA_RS): make_color_data.py - python $< > $@ diff --git a/color.rs b/color.rs index 11d0494f..f14efdf6 100644 --- a/color.rs +++ b/color.rs @@ -5,9 +5,6 @@ use std::ascii::StrAsciiExt; use ast::*; -use self::color_data::{COLOR_KEYWORDS, COLOR_VALUES}; - -mod color_data; #[deriving(Clone, Eq)] @@ -43,11 +40,161 @@ impl Color { #[inline] fn parse_color_keyword(value: &str) -> Option { let lower_value = value.to_ascii_lower(); - match COLOR_KEYWORDS.bsearch_elem(&lower_value.as_slice()) { - Some(index) => Some(RGBA(COLOR_VALUES[index])), - None => if "currentcolor" == lower_value { Some(CurrentColor) } - else { None } - } + let (r, g, b) = match lower_value.as_slice() { + "black" => (0., 0., 0.), + "silver" => (192., 192., 192.), + "gray" => (128., 128., 128.), + "white" => (255., 255., 255.), + "maroon" => (128., 0., 0.), + "red" => (255., 0., 0.), + "purple" => (128., 0., 128.), + "fuchsia" => (255., 0., 255.), + "green" => (0., 128., 0.), + "lime" => (0., 255., 0.), + "olive" => (128., 128., 0.), + "yellow" => (255., 255., 0.), + "navy" => (0., 0., 128.), + "blue" => (0., 0., 255.), + "teal" => (0., 128., 128.), + "aqua" => (0., 255., 255.), + + "aliceblue" => (240., 248., 255.), + "antiquewhite" => (250., 235., 215.), + "aquamarine" => (127., 255., 212.), + "azure" => (240., 255., 255.), + "beige" => (245., 245., 220.), + "bisque" => (255., 228., 196.), + "blanchedalmond" => (255., 235., 205.), + "blueviolet" => (138., 43., 226.), + "brown" => (165., 42., 42.), + "burlywood" => (222., 184., 135.), + "cadetblue" => (95., 158., 160.), + "chartreuse" => (127., 255., 0.), + "chocolate" => (210., 105., 30.), + "coral" => (255., 127., 80.), + "cornflowerblue" => (100., 149., 237.), + "cornsilk" => (255., 248., 220.), + "crimson" => (220., 20., 60.), + "cyan" => (0., 255., 255.), + "darkblue" => (0., 0., 139.), + "darkcyan" => (0., 139., 139.), + "darkgoldenrod" => (184., 134., 11.), + "darkgray" => (169., 169., 169.), + "darkgreen" => (0., 100., 0.), + "darkgrey" => (169., 169., 169.), + "darkkhaki" => (189., 183., 107.), + "darkmagenta" => (139., 0., 139.), + "darkolivegreen" => (85., 107., 47.), + "darkorange" => (255., 140., 0.), + "darkorchid" => (153., 50., 204.), + "darkred" => (139., 0., 0.), + "darksalmon" => (233., 150., 122.), + "darkseagreen" => (143., 188., 143.), + "darkslateblue" => (72., 61., 139.), + "darkslategray" => (47., 79., 79.), + "darkslategrey" => (47., 79., 79.), + "darkturquoise" => (0., 206., 209.), + "darkviolet" => (148., 0., 211.), + "deeppink" => (255., 20., 147.), + "deepskyblue" => (0., 191., 255.), + "dimgray" => (105., 105., 105.), + "dimgrey" => (105., 105., 105.), + "dodgerblue" => (30., 144., 255.), + "firebrick" => (178., 34., 34.), + "floralwhite" => (255., 250., 240.), + "forestgreen" => (34., 139., 34.), + "gainsboro" => (220., 220., 220.), + "ghostwhite" => (248., 248., 255.), + "gold" => (255., 215., 0.), + "goldenrod" => (218., 165., 32.), + "greenyellow" => (173., 255., 47.), + "grey" => (128., 128., 128.), + "honeydew" => (240., 255., 240.), + "hotpink" => (255., 105., 180.), + "indianred" => (205., 92., 92.), + "indigo" => (75., 0., 130.), + "ivory" => (255., 255., 240.), + "khaki" => (240., 230., 140.), + "lavender" => (230., 230., 250.), + "lavenderblush" => (255., 240., 245.), + "lawngreen" => (124., 252., 0.), + "lemonchiffon" => (255., 250., 205.), + "lightblue" => (173., 216., 230.), + "lightcoral" => (240., 128., 128.), + "lightcyan" => (224., 255., 255.), + "lightgoldenrodyellow" => (250., 250., 210.), + "lightgray" => (211., 211., 211.), + "lightgreen" => (144., 238., 144.), + "lightgrey" => (211., 211., 211.), + "lightpink" => (255., 182., 193.), + "lightsalmon" => (255., 160., 122.), + "lightseagreen" => (32., 178., 170.), + "lightskyblue" => (135., 206., 250.), + "lightslategray" => (119., 136., 153.), + "lightslategrey" => (119., 136., 153.), + "lightsteelblue" => (176., 196., 222.), + "lightyellow" => (255., 255., 224.), + "limegreen" => (50., 205., 50.), + "linen" => (250., 240., 230.), + "magenta" => (255., 0., 255.), + "mediumaquamarine" => (102., 205., 170.), + "mediumblue" => (0., 0., 205.), + "mediumorchid" => (186., 85., 211.), + "mediumpurple" => (147., 112., 219.), + "mediumseagreen" => (60., 179., 113.), + "mediumslateblue" => (123., 104., 238.), + "mediumspringgreen" => (0., 250., 154.), + "mediumturquoise" => (72., 209., 204.), + "mediumvioletred" => (199., 21., 133.), + "midnightblue" => (25., 25., 112.), + "mintcream" => (245., 255., 250.), + "mistyrose" => (255., 228., 225.), + "moccasin" => (255., 228., 181.), + "navajowhite" => (255., 222., 173.), + "oldlace" => (253., 245., 230.), + "olivedrab" => (107., 142., 35.), + "orange" => (255., 165., 0.), + "orangered" => (255., 69., 0.), + "orchid" => (218., 112., 214.), + "palegoldenrod" => (238., 232., 170.), + "palegreen" => (152., 251., 152.), + "paleturquoise" => (175., 238., 238.), + "palevioletred" => (219., 112., 147.), + "papayawhip" => (255., 239., 213.), + "peachpuff" => (255., 218., 185.), + "peru" => (205., 133., 63.), + "pink" => (255., 192., 203.), + "plum" => (221., 160., 221.), + "powderblue" => (176., 224., 230.), + "rosybrown" => (188., 143., 143.), + "royalblue" => (65., 105., 225.), + "saddlebrown" => (139., 69., 19.), + "salmon" => (250., 128., 114.), + "sandybrown" => (244., 164., 96.), + "seagreen" => (46., 139., 87.), + "seashell" => (255., 245., 238.), + "sienna" => (160., 82., 45.), + "skyblue" => (135., 206., 235.), + "slateblue" => (106., 90., 205.), + "slategray" => (112., 128., 144.), + "slategrey" => (112., 128., 144.), + "snow" => (255., 250., 250.), + "springgreen" => (0., 255., 127.), + "steelblue" => (70., 130., 180.), + "tan" => (210., 180., 140.), + "thistle" => (216., 191., 216.), + "tomato" => (255., 99., 71.), + "turquoise" => (64., 224., 208.), + "violet" => (238., 130., 238.), + "wheat" => (245., 222., 179.), + "whitesmoke" => (245., 245., 245.), + "yellowgreen" => (154., 205., 50.), + + "transparent" => return Some(RGBA(RGBA { red: 0., green: 0., blue: 0., alpha: 0. })), + "currentcolor" => return Some(CurrentColor), + _ => return None, + }; + Some(RGBA(RGBA { red: r / 255., green: g / 255., blue: b / 255., alpha: 1. })) } diff --git a/make_color_data.py b/make_color_data.py deleted file mode 100644 index 667c9daf..00000000 --- a/make_color_data.py +++ /dev/null @@ -1,196 +0,0 @@ -# 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/. - -COLORS = sorted([ - ('transparent', (0, 0, 0, 0)), - - ('black', (0, 0, 0, 1)), - ('silver', (192, 192, 192, 1)), - ('gray', (128, 128, 128, 1)), - ('white', (255, 255, 255, 1)), - ('maroon', (128, 0, 0, 1)), - ('red', (255, 0, 0, 1)), - ('purple', (128, 0, 128, 1)), - ('fuchsia', (255, 0, 255, 1)), - ('green', (0, 128, 0, 1)), - ('lime', (0, 255, 0, 1)), - ('olive', (128, 128, 0, 1)), - ('yellow', (255, 255, 0, 1)), - ('navy', (0, 0, 128, 1)), - ('blue', (0, 0, 255, 1)), - ('teal', (0, 128, 128, 1)), - ('aqua', (0, 255, 255, 1)), - - ('aliceblue', (240, 248, 255, 1)), - ('antiquewhite', (250, 235, 215, 1)), - ('aqua', (0, 255, 255, 1)), - ('aquamarine', (127, 255, 212, 1)), - ('azure', (240, 255, 255, 1)), - ('beige', (245, 245, 220, 1)), - ('bisque', (255, 228, 196, 1)), - ('black', (0, 0, 0, 1)), - ('blanchedalmond', (255, 235, 205, 1)), - ('blue', (0, 0, 255, 1)), - ('blueviolet', (138, 43, 226, 1)), - ('brown', (165, 42, 42, 1)), - ('burlywood', (222, 184, 135, 1)), - ('cadetblue', (95, 158, 160, 1)), - ('chartreuse', (127, 255, 0, 1)), - ('chocolate', (210, 105, 30, 1)), - ('coral', (255, 127, 80, 1)), - ('cornflowerblue', (100, 149, 237, 1)), - ('cornsilk', (255, 248, 220, 1)), - ('crimson', (220, 20, 60, 1)), - ('cyan', (0, 255, 255, 1)), - ('darkblue', (0, 0, 139, 1)), - ('darkcyan', (0, 139, 139, 1)), - ('darkgoldenrod', (184, 134, 11, 1)), - ('darkgray', (169, 169, 169, 1)), - ('darkgreen', (0, 100, 0, 1)), - ('darkgrey', (169, 169, 169, 1)), - ('darkkhaki', (189, 183, 107, 1)), - ('darkmagenta', (139, 0, 139, 1)), - ('darkolivegreen', (85, 107, 47, 1)), - ('darkorange', (255, 140, 0, 1)), - ('darkorchid', (153, 50, 204, 1)), - ('darkred', (139, 0, 0, 1)), - ('darksalmon', (233, 150, 122, 1)), - ('darkseagreen', (143, 188, 143, 1)), - ('darkslateblue', (72, 61, 139, 1)), - ('darkslategray', (47, 79, 79, 1)), - ('darkslategrey', (47, 79, 79, 1)), - ('darkturquoise', (0, 206, 209, 1)), - ('darkviolet', (148, 0, 211, 1)), - ('deeppink', (255, 20, 147, 1)), - ('deepskyblue', (0, 191, 255, 1)), - ('dimgray', (105, 105, 105, 1)), - ('dimgrey', (105, 105, 105, 1)), - ('dodgerblue', (30, 144, 255, 1)), - ('firebrick', (178, 34, 34, 1)), - ('floralwhite', (255, 250, 240, 1)), - ('forestgreen', (34, 139, 34, 1)), - ('fuchsia', (255, 0, 255, 1)), - ('gainsboro', (220, 220, 220, 1)), - ('ghostwhite', (248, 248, 255, 1)), - ('gold', (255, 215, 0, 1)), - ('goldenrod', (218, 165, 32, 1)), - ('gray', (128, 128, 128, 1)), - ('green', (0, 128, 0, 1)), - ('greenyellow', (173, 255, 47, 1)), - ('grey', (128, 128, 128, 1)), - ('honeydew', (240, 255, 240, 1)), - ('hotpink', (255, 105, 180, 1)), - ('indianred', (205, 92, 92, 1)), - ('indigo', (75, 0, 130, 1)), - ('ivory', (255, 255, 240, 1)), - ('khaki', (240, 230, 140, 1)), - ('lavender', (230, 230, 250, 1)), - ('lavenderblush', (255, 240, 245, 1)), - ('lawngreen', (124, 252, 0, 1)), - ('lemonchiffon', (255, 250, 205, 1)), - ('lightblue', (173, 216, 230, 1)), - ('lightcoral', (240, 128, 128, 1)), - ('lightcyan', (224, 255, 255, 1)), - ('lightgoldenrodyellow', (250, 250, 210, 1)), - ('lightgray', (211, 211, 211, 1)), - ('lightgreen', (144, 238, 144, 1)), - ('lightgrey', (211, 211, 211, 1)), - ('lightpink', (255, 182, 193, 1)), - ('lightsalmon', (255, 160, 122, 1)), - ('lightseagreen', (32, 178, 170, 1)), - ('lightskyblue', (135, 206, 250, 1)), - ('lightslategray', (119, 136, 153, 1)), - ('lightslategrey', (119, 136, 153, 1)), - ('lightsteelblue', (176, 196, 222, 1)), - ('lightyellow', (255, 255, 224, 1)), - ('lime', (0, 255, 0, 1)), - ('limegreen', (50, 205, 50, 1)), - ('linen', (250, 240, 230, 1)), - ('magenta', (255, 0, 255, 1)), - ('maroon', (128, 0, 0, 1)), - ('mediumaquamarine', (102, 205, 170, 1)), - ('mediumblue', (0, 0, 205, 1)), - ('mediumorchid', (186, 85, 211, 1)), - ('mediumpurple', (147, 112, 219, 1)), - ('mediumseagreen', (60, 179, 113, 1)), - ('mediumslateblue', (123, 104, 238, 1)), - ('mediumspringgreen', (0, 250, 154, 1)), - ('mediumturquoise', (72, 209, 204, 1)), - ('mediumvioletred', (199, 21, 133, 1)), - ('midnightblue', (25, 25, 112, 1)), - ('mintcream', (245, 255, 250, 1)), - ('mistyrose', (255, 228, 225, 1)), - ('moccasin', (255, 228, 181, 1)), - ('navajowhite', (255, 222, 173, 1)), - ('navy', (0, 0, 128, 1)), - ('oldlace', (253, 245, 230, 1)), - ('olive', (128, 128, 0, 1)), - ('olivedrab', (107, 142, 35, 1)), - ('orange', (255, 165, 0, 1)), - ('orangered', (255, 69, 0, 1)), - ('orchid', (218, 112, 214, 1)), - ('palegoldenrod', (238, 232, 170, 1)), - ('palegreen', (152, 251, 152, 1)), - ('paleturquoise', (175, 238, 238, 1)), - ('palevioletred', (219, 112, 147, 1)), - ('papayawhip', (255, 239, 213, 1)), - ('peachpuff', (255, 218, 185, 1)), - ('peru', (205, 133, 63, 1)), - ('pink', (255, 192, 203, 1)), - ('plum', (221, 160, 221, 1)), - ('powderblue', (176, 224, 230, 1)), - ('purple', (128, 0, 128, 1)), - ('red', (255, 0, 0, 1)), - ('rosybrown', (188, 143, 143, 1)), - ('royalblue', (65, 105, 225, 1)), - ('saddlebrown', (139, 69, 19, 1)), - ('salmon', (250, 128, 114, 1)), - ('sandybrown', (244, 164, 96, 1)), - ('seagreen', (46, 139, 87, 1)), - ('seashell', (255, 245, 238, 1)), - ('sienna', (160, 82, 45, 1)), - ('silver', (192, 192, 192, 1)), - ('skyblue', (135, 206, 235, 1)), - ('slateblue', (106, 90, 205, 1)), - ('slategray', (112, 128, 144, 1)), - ('slategrey', (112, 128, 144, 1)), - ('snow', (255, 250, 250, 1)), - ('springgreen', (0, 255, 127, 1)), - ('steelblue', (70, 130, 180, 1)), - ('tan', (210, 180, 140, 1)), - ('teal', (0, 128, 128, 1)), - ('thistle', (216, 191, 216, 1)), - ('tomato', (255, 99, 71, 1)), - ('turquoise', (64, 224, 208, 1)), - ('violet', (238, 130, 238, 1)), - ('wheat', (245, 222, 179, 1)), - ('white', (255, 255, 255, 1)), - ('whitesmoke', (245, 245, 245, 1)), - ('yellow', (255, 255, 0, 1)), - ('yellowgreen', (154, 205, 50, 1)), -]) - -print('''\ -// This file is generated by make_color_data.py -// This is to make sure that COLOR_KEYWORDS is sorted, to allow binary search. - -use super::RGBA; - -macro_rules! rgba( - ($r:expr, $g:expr, $b:expr, $a:expr) => { - RGBA { red: $r / 255., green: $g / 255., blue: $b / 255., alpha: $a } - }; -) - -pub static COLOR_KEYWORDS: &'static [&'static str] = &[ -%s -]; - -pub static COLOR_VALUES: &'static [RGBA] = &[ -%s -]; -''' % ( - '\n'.join(' "%s",' % keyword for keyword, _ in COLORS), - '\n'.join(' rgba!(%s., %s., %s., %s.),' % rgba for _, rgba in COLORS), -))