| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef V8_DATEPARSER_INL_H_ | 5 #ifndef V8_DATEPARSER_INL_H_ |
| 6 #define V8_DATEPARSER_INL_H_ | 6 #define V8_DATEPARSER_INL_H_ |
| 7 | 7 |
| 8 #include "src/char-predicates-inl.h" | 8 #include "src/char-predicates-inl.h" |
| 9 #include "src/dateparser.h" | 9 #include "src/dateparser.h" |
| 10 #include "src/unicode-cache-inl.h" | 10 #include "src/unicode-cache-inl.h" |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 68 // specification. | 68 // specification. |
| 69 // After a valid "T" has been read while scanning an ES5 datetime string, | 69 // After a valid "T" has been read while scanning an ES5 datetime string, |
| 70 // the input can no longer be a valid legacy date, since the "T" is a | 70 // the input can no longer be a valid legacy date, since the "T" is a |
| 71 // garbage string after a number has been read. | 71 // garbage string after a number has been read. |
| 72 | 72 |
| 73 // First try getting as far as possible with as ES5 Date Time String. | 73 // First try getting as far as possible with as ES5 Date Time String. |
| 74 DateToken next_unhandled_token = ParseES5DateTime(&scanner, &day, &time, &tz); | 74 DateToken next_unhandled_token = ParseES5DateTime(&scanner, &day, &time, &tz); |
| 75 if (next_unhandled_token.IsInvalid()) return false; | 75 if (next_unhandled_token.IsInvalid()) return false; |
| 76 bool has_read_number = !day.IsEmpty(); | 76 bool has_read_number = !day.IsEmpty(); |
| 77 // If there's anything left, continue with the legacy parser. | 77 // If there's anything left, continue with the legacy parser. |
| 78 bool legacy_parser = !next_unhandled_token.IsEndOfInput(); | 78 bool legacy_parser = false; |
| 79 for (DateToken token = next_unhandled_token; | 79 for (DateToken token = next_unhandled_token; |
| 80 !token.IsEndOfInput(); | 80 !token.IsEndOfInput(); |
| 81 token = scanner.Next()) { | 81 token = scanner.Next()) { |
| 82 if (token.IsNumber()) { | 82 if (token.IsNumber()) { |
| 83 legacy_parser = true; |
| 83 has_read_number = true; | 84 has_read_number = true; |
| 84 int n = token.number(); | 85 int n = token.number(); |
| 85 if (scanner.SkipSymbol(':')) { | 86 if (scanner.SkipSymbol(':')) { |
| 86 if (scanner.SkipSymbol(':')) { | 87 if (scanner.SkipSymbol(':')) { |
| 87 // n + "::" | 88 // n + "::" |
| 88 if (!time.IsEmpty()) return false; | 89 if (!time.IsEmpty()) return false; |
| 89 time.Add(n); | 90 time.Add(n); |
| 90 time.Add(0); | 91 time.Add(0); |
| 91 } else { | 92 } else { |
| 92 // n + ":" | 93 // n + ":" |
| (...skipping 15 matching lines...) Expand all Loading... |
| 108 DateToken peek = scanner.Peek(); | 109 DateToken peek = scanner.Peek(); |
| 109 if (!peek.IsEndOfInput() && | 110 if (!peek.IsEndOfInput() && |
| 110 !peek.IsWhiteSpace() && | 111 !peek.IsWhiteSpace() && |
| 111 !peek.IsKeywordZ() && | 112 !peek.IsKeywordZ() && |
| 112 !peek.IsAsciiSign()) return false; | 113 !peek.IsAsciiSign()) return false; |
| 113 } else { | 114 } else { |
| 114 if (!day.Add(n)) return false; | 115 if (!day.Add(n)) return false; |
| 115 scanner.SkipSymbol('-'); | 116 scanner.SkipSymbol('-'); |
| 116 } | 117 } |
| 117 } else if (token.IsKeyword()) { | 118 } else if (token.IsKeyword()) { |
| 119 legacy_parser = true; |
| 118 // Parse a "word" (sequence of chars. >= 'A'). | 120 // Parse a "word" (sequence of chars. >= 'A'). |
| 119 KeywordType type = token.keyword_type(); | 121 KeywordType type = token.keyword_type(); |
| 120 int value = token.keyword_value(); | 122 int value = token.keyword_value(); |
| 121 if (type == AM_PM && !time.IsEmpty()) { | 123 if (type == AM_PM && !time.IsEmpty()) { |
| 122 time.SetHourOffset(value); | 124 time.SetHourOffset(value); |
| 123 } else if (type == MONTH_NAME) { | 125 } else if (type == MONTH_NAME) { |
| 124 day.SetNamedMonth(value); | 126 day.SetNamedMonth(value); |
| 125 scanner.SkipSymbol('-'); | 127 scanner.SkipSymbol('-'); |
| 126 } else if (type == TIME_ZONE_NAME && has_read_number) { | 128 } else if (type == TIME_ZONE_NAME && has_read_number) { |
| 127 tz.Set(value); | 129 tz.Set(value); |
| 128 } else { | 130 } else { |
| 129 // Garbage words are illegal if a number has been read. | 131 // Garbage words are illegal if a number has been read. |
| 130 if (has_read_number) return false; | 132 if (has_read_number) return false; |
| 131 // The first number has to be separated from garbage words by | 133 // The first number has to be separated from garbage words by |
| 132 // whitespace or other separators. | 134 // whitespace or other separators. |
| 133 if (scanner.Peek().IsNumber()) return false; | 135 if (scanner.Peek().IsNumber()) return false; |
| 134 } | 136 } |
| 135 } else if (token.IsAsciiSign() && (tz.IsUTC() || !time.IsEmpty())) { | 137 } else if (token.IsAsciiSign() && (tz.IsUTC() || !time.IsEmpty())) { |
| 138 legacy_parser = true; |
| 136 // Parse UTC offset (only after UTC or time). | 139 // Parse UTC offset (only after UTC or time). |
| 137 tz.SetSign(token.ascii_sign()); | 140 tz.SetSign(token.ascii_sign()); |
| 138 // The following number may be empty. | 141 // The following number may be empty. |
| 139 int n = 0; | 142 int n = 0; |
| 140 int length = 0; | 143 int length = 0; |
| 141 if (scanner.Peek().IsNumber()) { | 144 if (scanner.Peek().IsNumber()) { |
| 142 DateToken token = scanner.Next(); | 145 DateToken token = scanner.Next(); |
| 143 length = token.length(); | 146 length = token.length(); |
| 144 n = token.number(); | 147 n = token.number(); |
| 145 } | 148 } |
| (...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 344 if (tz->IsEmpty()) tz->Set(0); | 347 if (tz->IsEmpty()) tz->Set(0); |
| 345 day->set_iso_date(); | 348 day->set_iso_date(); |
| 346 return DateToken::EndOfInput(); | 349 return DateToken::EndOfInput(); |
| 347 } | 350 } |
| 348 | 351 |
| 349 | 352 |
| 350 } // namespace internal | 353 } // namespace internal |
| 351 } // namespace v8 | 354 } // namespace v8 |
| 352 | 355 |
| 353 #endif // V8_DATEPARSER_INL_H_ | 356 #endif // V8_DATEPARSER_INL_H_ |
| OLD | NEW |