Bug 1370779 followup 2 - Downgrade cssparser to 0.19.2.

MozReview-Commit-ID: 3lf30ZvMvWm
This commit is contained in:
Xidorn Quan 2017-08-23 13:58:16 +10:00
parent 759a4f76a0
commit 77c491fafa
8 changed files with 63 additions and 185 deletions

View File

@ -1 +1 @@
{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"f1fb4b65964c81bc1240544267ea334f554ca38ae7a74d57066f4d47d2b5d568","Cargo.toml":"b525dcc16da6c23dc7e5a69eea402eb202635b530470f4090b82df71af738ba9","LICENSE":"fab3dd6bdab226f1c08630b1dd917e11fcb4ec5e1e020e2c16f83a0a13863e85","README.md":"c5781e673335f37ed3d7acb119f8ed33efdf6eb75a7094b7da2abe0c3230adb8","build.rs":"950bcc47a196f07f99f59637c28cc65e02a885130011f90a2b2608248b4724a2","build/match_byte.rs":"89e8b941af74df2c204abf808672d3ff278bdec75abc918c41a843260b924677","docs/.nojekyll":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","docs/404.html":"025861f76f8d1f6d67c20ab624c6e418f4f824385e2dd8ad8732c4ea563c6a2e","docs/index.html":"025861f76f8d1f6d67c20ab624c6e418f4f824385e2dd8ad8732c4ea563c6a2e","src/color.rs":"b847b80097015cb7d0f4be67c0d8b2f6b82006be865917ff14a96b484760d460","src/cow_rc_str.rs":"541216f8ef74ee3cc5cbbc1347e5f32ed66588c401851c9a7d68b867aede1de0","src/from_bytes.rs":"331fe63af2123ae3675b61928a69461b5ac77799fff3ce9978c55cf2c558f4ff","src/lib.rs":"56d7bb15699a938c827ec57464525f0a58f0529920433db6c652142e97fd67e4","src/macros.rs":"adb9773c157890381556ea83d7942dcc676f99eea71abbb6afeffee1e3f28960","src/nth.rs":"246fa83a3ab97a7bb617c97a976af77136652ce77ba8ccca22e144b213b61310","src/parser.rs":"a7a200d11ed3acebc87fa862a7b55b5e4769d63607e4443fddc0c41f1c8caba1","src/rules_and_declarations.rs":"44e47663aaa8a5ff167393b91337e377e5a4fcbef64b227028780b6d22879f69","src/serializer.rs":"843c9d01de00523851a4c40f791c64e3b00325426cb38f897e4a2ddb4cfa6de8","src/size_of_tests.rs":"a28664d44797519119d659eaf7e84e1789ef97e9e2c2d36630eb9f226c0cc0a6","src/tests.rs":"fb3dda2a53109642a9bdc407499e151c1275c440e15e31c0eb9a300acfac7444","src/tokenizer.rs":"63640e6a2d875e8afda9dea6034b8c57db9b5877c3c491a97fee1c6ec223b75d","src/unicode_range.rs":"fbbd0f4b393944699730a6b0f945b2b2376fcea61fce2ea37190fb287793021a"},"package":"6b32e2d9f37c01c985ffdcf891ef4b7cd226494144545fc8e312ff01523f7ec0"}
{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"f1fb4b65964c81bc1240544267ea334f554ca38ae7a74d57066f4d47d2b5d568","Cargo.toml":"c4f2dc684880666eaf58ade1209dc52e94a19b85b3b7ceeb1908642400c633f4","LICENSE":"fab3dd6bdab226f1c08630b1dd917e11fcb4ec5e1e020e2c16f83a0a13863e85","README.md":"c5781e673335f37ed3d7acb119f8ed33efdf6eb75a7094b7da2abe0c3230adb8","build.rs":"950bcc47a196f07f99f59637c28cc65e02a885130011f90a2b2608248b4724a2","build/match_byte.rs":"89e8b941af74df2c204abf808672d3ff278bdec75abc918c41a843260b924677","docs/.nojekyll":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","docs/404.html":"025861f76f8d1f6d67c20ab624c6e418f4f824385e2dd8ad8732c4ea563c6a2e","docs/index.html":"025861f76f8d1f6d67c20ab624c6e418f4f824385e2dd8ad8732c4ea563c6a2e","src/color.rs":"b847b80097015cb7d0f4be67c0d8b2f6b82006be865917ff14a96b484760d460","src/cow_rc_str.rs":"541216f8ef74ee3cc5cbbc1347e5f32ed66588c401851c9a7d68b867aede1de0","src/from_bytes.rs":"331fe63af2123ae3675b61928a69461b5ac77799fff3ce9978c55cf2c558f4ff","src/lib.rs":"56d7bb15699a938c827ec57464525f0a58f0529920433db6c652142e97fd67e4","src/macros.rs":"adb9773c157890381556ea83d7942dcc676f99eea71abbb6afeffee1e3f28960","src/nth.rs":"246fa83a3ab97a7bb617c97a976af77136652ce77ba8ccca22e144b213b61310","src/parser.rs":"7a35d02bf0158a4725527e32295ce734d317e226569234d346952e27048f6ee2","src/rules_and_declarations.rs":"f2cde5c4518a2349d24049f6195e31783a8af2815d84394d21f90c763fc257a1","src/serializer.rs":"843c9d01de00523851a4c40f791c64e3b00325426cb38f897e4a2ddb4cfa6de8","src/size_of_tests.rs":"a28664d44797519119d659eaf7e84e1789ef97e9e2c2d36630eb9f226c0cc0a6","src/tests.rs":"120298ba20126c90ec6c8b1eb837b3c3a567fc6f9701552486191cc61d8459a6","src/tokenizer.rs":"914326e19bf2d97122b41e9930e16a70825aa5c4096bdb39c66d18388f4cdbda","src/unicode_range.rs":"fbbd0f4b393944699730a6b0f945b2b2376fcea61fce2ea37190fb287793021a"},"package":"1f9442c00898020a56c9485d64c9c8f14ae30ba45be89d15846046593383467f"}

View File

@ -12,7 +12,7 @@
[package]
name = "cssparser"
version = "0.19.4"
version = "0.19.2"
authors = ["Simon Sapin <simon.sapin@exyr.org>"]
build = "build.rs"
exclude = ["src/css-parsing-tests/**", "src/big-data-url.css"]
@ -22,12 +22,6 @@ readme = "README.md"
keywords = ["css", "syntax", "parser"]
license = "MPL-2.0"
repository = "https://github.com/servo/rust-cssparser"
[dependencies.phf]
version = "0.7"
[dependencies.matches]
version = "0.1"
[dependencies.serde]
version = "1.0"
optional = true
@ -44,20 +38,26 @@ optional = true
[dependencies.cssparser-macros]
version = "0.3"
[dev-dependencies.encoding_rs]
version = "0.5"
[dependencies.phf]
version = "0.7"
[dependencies.matches]
version = "0.1"
[dev-dependencies.difference]
version = "1.0"
[dev-dependencies.rustc-serialize]
version = "0.3"
[dev-dependencies.difference]
version = "1.0"
[build-dependencies.quote]
version = "0.3"
[dev-dependencies.encoding_rs]
version = "0.5"
[build-dependencies.syn]
version = "0.11"
[build-dependencies.quote]
version = "0.3"
[features]
bench = []
dummy_match_byte = []
bench = []

View File

@ -288,32 +288,6 @@ impl<'i: 't, 't> Parser<'i, 't> {
}
}
/// Advance the input until the next token thats not whitespace or a comment.
#[inline]
pub fn skip_whitespace(&mut self) {
// If we just consumed `{`, `[`, `(`, or `function(`, leave whitespace
// or comments inside the block or function up to the nested parser.
if self.at_start_of.is_some() {
return
}
self.input.tokenizer.skip_whitespace()
}
#[inline]
pub(crate) fn skip_cdc_and_cdo(&mut self) {
self.input.tokenizer.skip_cdc_and_cdo()
}
#[inline]
pub(crate) fn next_byte(&self) -> Option<u8> {
let byte = self.input.tokenizer.next_byte();
if self.stop_before.contains(Delimiters::from_byte(byte)) {
return None
}
byte
}
/// Restore the internal state of the parser (including position within the input)
/// to what was previously saved by the `Parser::position` method.
///
@ -390,8 +364,14 @@ impl<'i: 't, 't> Parser<'i, 't> {
///
/// This only returns a closing token when it is unmatched (and therefore an error).
pub fn next(&mut self) -> Result<&Token<'i>, BasicParseError<'i>> {
self.skip_whitespace();
self.next_including_whitespace_and_comments()
loop {
match self.next_including_whitespace_and_comments() {
Err(e) => return Err(e),
Ok(&Token::WhiteSpace(_)) | Ok(&Token::Comment(_)) => {},
_ => break
}
}
Ok(self.input.cached_token_ref())
}
/// Same as `Parser::next`, but does not skip whitespace tokens.
@ -479,7 +459,6 @@ impl<'i: 't, 't> Parser<'i, 't> {
where F: for<'tt> FnMut(&mut Parser<'i, 'tt>) -> Result<T, ParseError<'i, E>> {
let mut values = vec![];
loop {
self.skip_whitespace(); // Unnecessary for correctness, but may help try() in parse_one rewind less.
values.push(self.parse_until_before(Delimiter::Comma, &mut parse_one)?);
match self.next() {
Err(_) => return Ok(values),

View File

@ -342,29 +342,15 @@ where P: QualifiedRuleParser<'i, QualifiedRule = R, Error = E> +
fn next(&mut self) -> Option<Result<R, PreciseParseError<'i, E>>> {
loop {
if self.is_stylesheet {
self.input.skip_cdc_and_cdo()
} else {
self.input.skip_whitespace()
}
let start = self.input.state();
let at_keyword;
match self.input.next_byte() {
Some(b'@') => {
match self.input.next_including_whitespace_and_comments() {
Ok(&Token::AtKeyword(ref name)) => at_keyword = Some(name.clone()),
_ => at_keyword = None,
}
// FIXME: move this back inside `match` when lifetimes are non-lexical
if at_keyword.is_none() {
self.input.reset(&start)
}
}
Some(_) => at_keyword = None,
None => return None
}
// FIXME: remove intermediate variable when lifetimes are non-lexical
let at_keyword = match self.input.next_including_whitespace_and_comments() {
Ok(&Token::WhiteSpace(_)) | Ok(&Token::Comment(_)) => continue,
Ok(&Token::CDO) | Ok(&Token::CDC) if self.is_stylesheet => continue,
Ok(&Token::AtKeyword(ref name)) => Some(name.clone()),
Ok(_) => None,
Err(_) => return None,
};
if let Some(name) = at_keyword {
let first_stylesheet_rule = self.is_stylesheet && !self.any_rule_so_far;
self.any_rule_so_far = true;
@ -376,6 +362,7 @@ where P: QualifiedRuleParser<'i, QualifiedRule = R, Error = E> +
}
} else {
self.any_rule_so_far = true;
self.input.reset(&start);
return Some(parse_qualified_rule(self.input, &mut self.parser)
.map_err(|e| PreciseParseError {
error: e,
@ -413,27 +400,20 @@ pub fn parse_one_rule<'i, 't, R, P, E>(input: &mut Parser<'i, 't>, parser: &mut
where P: QualifiedRuleParser<'i, QualifiedRule = R, Error = E> +
AtRuleParser<'i, AtRule = R, Error = E> {
input.parse_entirely(|input| {
input.skip_whitespace();
loop {
let start = input.state();
let at_keyword;
if input.next_byte() == Some(b'@') {
match *input.next_including_whitespace_and_comments()? {
Token::AtKeyword(ref name) => at_keyword = Some(name.clone()),
_ => at_keyword = None,
}
// FIXME: move this back inside `match` when lifetimes are non-lexical
if at_keyword.is_none() {
input.reset(&start)
}
} else {
at_keyword = None
}
// FIXME: remove intermediate variable when lifetimes are non-lexical
let at_keyword = match *input.next_including_whitespace_and_comments()? {
Token::WhiteSpace(_) | Token::Comment(_) => continue,
Token::AtKeyword(ref name) => Some(name.clone()),
_ => None
};
if let Some(name) = at_keyword {
parse_at_rule(&start, name, input, parser).map_err(|e| e.error)
return parse_at_rule(&start, name, input, parser).map_err(|e| e.error)
} else {
parse_qualified_rule(input, parser)
input.reset(&start);
return parse_qualified_rule(input, parser)
}
}
})
}

View File

@ -970,15 +970,6 @@ fn parser_maintains_current_line() {
assert_eq!(parser.current_line(), "ident");
}
#[test]
fn cdc_regression_test() {
let mut input = ParserInput::new("-->x");
let mut parser = Parser::new(&mut input);
parser.skip_cdc_and_cdo();
assert_eq!(parser.next(), Ok(&Token::Ident("x".into())));
assert_eq!(parser.next(), Err(BasicParseError::EndOfInput));
}
#[test]
fn parse_entirely_reports_first_error() {
#[derive(PartialEq, Debug)]

View File

@ -411,76 +411,6 @@ impl<'a> Tokenizer<'a> {
fn starts_with(&self, needle: &[u8]) -> bool {
self.input.as_bytes()[self.position..].starts_with(needle)
}
pub fn skip_whitespace(&mut self) {
while !self.is_eof() {
match_byte! { self.next_byte_unchecked(),
b' ' | b'\t' => {
self.advance(1)
},
b'\n' | b'\x0C' => {
self.advance(1);
self.seen_newline(false);
},
b'\r' => {
self.advance(1);
self.seen_newline(true);
},
b'/' => {
if self.starts_with(b"/*") {
consume_comment(self);
} else {
return
}
}
_ => {
return
}
}
}
}
pub fn skip_cdc_and_cdo(&mut self) {
while !self.is_eof() {
match_byte! { self.next_byte_unchecked(),
b' ' | b'\t' => {
self.advance(1)
},
b'\n' | b'\x0C' => {
self.advance(1);
self.seen_newline(false);
},
b'\r' => {
self.advance(1);
self.seen_newline(true);
},
b'/' => {
if self.starts_with(b"/*") {
consume_comment(self);
} else {
return
}
}
b'<' => {
if self.starts_with(b"<!--") {
self.advance(4)
} else {
return
}
}
b'-' => {
if self.starts_with(b"-->") {
self.advance(3)
} else {
return
}
}
_ => {
return
}
}
}
}
}
/// A position from the start of the input, counted in UTF-8 bytes.
@ -584,7 +514,9 @@ fn next_token<'a>(tokenizer: &mut Tokenizer<'a>) -> Result<Token<'a>, ()> {
}
b'/' => {
if tokenizer.starts_with(b"/*") {
Comment(consume_comment(tokenizer))
let contents = consume_comment(tokenizer);
check_for_source_map(tokenizer, contents);
Comment(contents)
} else {
tokenizer.advance(1);
Delim('/')
@ -695,9 +627,7 @@ fn consume_comment<'a>(tokenizer: &mut Tokenizer<'a>) -> &'a str {
tokenizer.advance(1);
if tokenizer.next_byte() == Some(b'/') {
tokenizer.advance(1);
let contents = tokenizer.slice(start_position..end_position);
check_for_source_map(tokenizer, contents);
return contents
return tokenizer.slice(start_position..end_position)
}
}
b'\n' | b'\x0C' => {
@ -713,9 +643,7 @@ fn consume_comment<'a>(tokenizer: &mut Tokenizer<'a>) -> &'a str {
}
}
}
let contents = tokenizer.slice_from(start_position);
check_for_source_map(tokenizer, contents);
contents
tokenizer.slice_from(start_position)
}
fn consume_string<'a>(tokenizer: &mut Tokenizer<'a>, single_quote: bool) -> Token<'a> {

View File

@ -232,7 +232,7 @@ dependencies = [
[[package]]
name = "cssparser"
version = "0.19.4"
version = "0.19.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"cssparser-macros 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
@ -398,7 +398,7 @@ name = "geckoservo"
version = "0.0.1"
dependencies = [
"atomic_refcell 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
"cssparser 0.19.4 (registry+https://github.com/rust-lang/crates.io-index)",
"cssparser 0.19.2 (registry+https://github.com/rust-lang/crates.io-index)",
"env_logger 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
@ -857,7 +857,7 @@ name = "selectors"
version = "0.19.0"
dependencies = [
"bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
"cssparser 0.19.4 (registry+https://github.com/rust-lang/crates.io-index)",
"cssparser 0.19.2 (registry+https://github.com/rust-lang/crates.io-index)",
"fnv 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
"matches 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
@ -959,7 +959,7 @@ dependencies = [
"bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
"byteorder 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
"cfg-if 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
"cssparser 0.19.4 (registry+https://github.com/rust-lang/crates.io-index)",
"cssparser 0.19.2 (registry+https://github.com/rust-lang/crates.io-index)",
"euclid 0.15.1 (registry+https://github.com/rust-lang/crates.io-index)",
"fnv 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
"itertools 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)",
@ -1006,7 +1006,7 @@ version = "0.0.1"
dependencies = [
"app_units 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
"bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
"cssparser 0.19.4 (registry+https://github.com/rust-lang/crates.io-index)",
"cssparser 0.19.2 (registry+https://github.com/rust-lang/crates.io-index)",
"euclid 0.15.1 (registry+https://github.com/rust-lang/crates.io-index)",
"selectors 0.19.0",
]
@ -1312,7 +1312,7 @@ dependencies = [
"checksum core-foundation-sys 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "41115a6aa5d3e1e5ef98148373f25971d1fad53818553f216495f9e67e90a624"
"checksum core-graphics 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a9f841e9637adec70838c537cae52cb4c751cc6514ad05669b51d107c2021c79"
"checksum core-text 6.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "16ce16d9ed00181016c11ff48e561314bec92bfbce9fe48f319366618d4e5de6"
"checksum cssparser 0.19.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6b32e2d9f37c01c985ffdcf891ef4b7cd226494144545fc8e312ff01523f7ec0"
"checksum cssparser 0.19.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1f9442c00898020a56c9485d64c9c8f14ae30ba45be89d15846046593383467f"
"checksum cssparser-macros 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "079adec4af52bb5275eadd004292028c79eb3c5f5b4ee8086a36d4197032f6df"
"checksum dtoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "09c3753c3db574d215cba4ea76018483895d7bff25a31b49ba45db21c48e50ab"
"checksum dtoa-short 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fe6f727b406462fd57c95fed84d1b0dbfb5f0136fcac005adba9ea0367c05cc8"

View File

@ -230,7 +230,7 @@ dependencies = [
[[package]]
name = "cssparser"
version = "0.19.4"
version = "0.19.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"cssparser-macros 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
@ -396,7 +396,7 @@ name = "geckoservo"
version = "0.0.1"
dependencies = [
"atomic_refcell 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
"cssparser 0.19.4 (registry+https://github.com/rust-lang/crates.io-index)",
"cssparser 0.19.2 (registry+https://github.com/rust-lang/crates.io-index)",
"env_logger 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
@ -844,7 +844,7 @@ name = "selectors"
version = "0.19.0"
dependencies = [
"bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
"cssparser 0.19.4 (registry+https://github.com/rust-lang/crates.io-index)",
"cssparser 0.19.2 (registry+https://github.com/rust-lang/crates.io-index)",
"fnv 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
"matches 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
@ -946,7 +946,7 @@ dependencies = [
"bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
"byteorder 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
"cfg-if 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
"cssparser 0.19.4 (registry+https://github.com/rust-lang/crates.io-index)",
"cssparser 0.19.2 (registry+https://github.com/rust-lang/crates.io-index)",
"euclid 0.15.1 (registry+https://github.com/rust-lang/crates.io-index)",
"fnv 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
"itertools 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)",
@ -993,7 +993,7 @@ version = "0.0.1"
dependencies = [
"app_units 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
"bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
"cssparser 0.19.4 (registry+https://github.com/rust-lang/crates.io-index)",
"cssparser 0.19.2 (registry+https://github.com/rust-lang/crates.io-index)",
"euclid 0.15.1 (registry+https://github.com/rust-lang/crates.io-index)",
"selectors 0.19.0",
]
@ -1299,7 +1299,7 @@ dependencies = [
"checksum core-foundation-sys 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "41115a6aa5d3e1e5ef98148373f25971d1fad53818553f216495f9e67e90a624"
"checksum core-graphics 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a9f841e9637adec70838c537cae52cb4c751cc6514ad05669b51d107c2021c79"
"checksum core-text 6.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "16ce16d9ed00181016c11ff48e561314bec92bfbce9fe48f319366618d4e5de6"
"checksum cssparser 0.19.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6b32e2d9f37c01c985ffdcf891ef4b7cd226494144545fc8e312ff01523f7ec0"
"checksum cssparser 0.19.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1f9442c00898020a56c9485d64c9c8f14ae30ba45be89d15846046593383467f"
"checksum cssparser-macros 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "079adec4af52bb5275eadd004292028c79eb3c5f5b4ee8086a36d4197032f6df"
"checksum dtoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "09c3753c3db574d215cba4ea76018483895d7bff25a31b49ba45db21c48e50ab"
"checksum dtoa-short 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fe6f727b406462fd57c95fed84d1b0dbfb5f0136fcac005adba9ea0367c05cc8"