5 #ifndef V8_DATEPARSER_INL_H_
6 #define V8_DATEPARSER_INL_H_
13 template <
typename Char>
18 InputReader<Char> in(unicode_cache, str);
74 if (next_unhandled_token.
IsInvalid())
return false;
75 bool has_read_number = !day.IsEmpty();
77 for (
DateToken token = next_unhandled_token;
79 token = scanner.
Next()) {
80 if (token.IsNumber()) {
81 has_read_number =
true;
82 int n = token.number();
86 if (!time.IsEmpty())
return false;
91 if (!time.Add(n))
return false;
94 }
else if (scanner.
SkipSymbol(
'.') && time.IsExpecting(n)) {
98 if (n < 0)
return false;
100 }
else if (tz.IsExpecting(n)) {
101 tz.SetAbsoluteMinute(n);
102 }
else if (time.IsExpecting(n)) {
112 if (!day.Add(n))
return false;
115 }
else if (token.IsKeyword()) {
118 int value = token.keyword_value();
119 if (type ==
AM_PM && !time.IsEmpty()) {
120 time.SetHourOffset(value);
122 day.SetNamedMonth(value);
128 if (has_read_number)
return false;
133 }
else if (token.IsAsciiSign() && (tz.IsUTC() || !time.IsEmpty())) {
135 tz.SetSign(token.ascii_sign());
141 has_read_number =
true;
144 tz.SetAbsoluteHour(n);
145 tz.SetAbsoluteMinute(
kNone);
147 tz.SetAbsoluteHour(n / 100);
148 tz.SetAbsoluteMinute(n % 100);
150 }
else if ((token.IsAsciiSign() || token.IsSymbol(
')')) &&
159 return day.Write(out) && time.Write(out) && tz.Write(out);
163 template<
typename CharType>
165 int pre_pos = in_->position();
166 if (in_->IsEnd())
return DateToken::EndOfInput();
167 if (in_->IsAsciiDigit()) {
168 int n = in_->ReadUnsignedNumeral();
169 int length = in_->position() - pre_pos;
170 return DateToken::Number(n, length);
177 if (in_->IsAsciiAlphaOrAbove()) {
178 DCHECK(KeywordTable::kPrefixLength == 3);
180 int length = in_->ReadWord(buffer, 3);
181 int index = KeywordTable::Lookup(buffer, length);
182 return DateToken::Keyword(KeywordTable::GetType(index),
183 KeywordTable::GetValue(index),
186 if (in_->SkipWhiteSpace()) {
187 return DateToken::WhiteSpace(in_->position() - pre_pos);
189 if (in_->SkipParentheses()) {
190 return DateToken::Unknown();
193 return DateToken::Unknown();
197 template <
typename Char>
202 TimeZoneComposer* tz) {
215 if (
sign < 0 && year == 0)
return sign_token;
216 day->Add(
sign * year);
220 return scanner->
Next();
224 !DayComposer::IsMonth(scanner->
Peek().
number()))
return scanner->
Next();
228 !DayComposer::IsDay(scanner->
Peek().
number()))
return scanner->
Next();
243 bool hour_is_24 = (scanner->
Peek().
number() == 24);
247 !TimeComposer::IsMinute(scanner->
Peek().
number()) ||
248 (hour_is_24 && scanner->
Peek().
number() > 0)) {
254 !TimeComposer::IsSecond(scanner->
Peek().
number()) ||
255 (hour_is_24 && scanner->
Peek().
number() > 0)) {
261 (hour_is_24 && scanner->
Peek().
number() > 0)) {
274 tz->SetSign(scanner->
Next().
symbol() ==
'+' ? 1 : -1);
278 int hour = hourmin / 100;
279 int min = hourmin % 100;
280 if (!TimeComposer::IsHour(hour) || !TimeComposer::IsMinute(
min)) {
283 tz->SetAbsoluteHour(hour);
284 tz->SetAbsoluteMinute(
min);
288 !TimeComposer::IsHour(scanner->
Peek().
number())) {
291 tz->SetAbsoluteHour(scanner->
Next().
number());
294 !TimeComposer::IsMinute(scanner->
Peek().
number())) {
297 tz->SetAbsoluteMinute(scanner->
Next().
number());
303 if (tz->IsEmpty()) tz->Set(0);
bool SkipSymbol(char symbol)
static bool Parse(Vector< Char > str, FixedArray *output, UnicodeCache *cache)
static DateParser::DateToken ParseES5DateTime(DateStringTokenizer< Char > *scanner, DayComposer *day, TimeComposer *time, TimeZoneComposer *tz)
static bool Between(int x, int lo, int hi)
static int ReadMilliseconds(DateToken number)
#define DCHECK(condition)
IN DWORD64 OUT PDWORD64 OUT PIMAGEHLP_SYMBOL64 Symbol
static int min(int a, int b)
Debugger support for the V8 JavaScript engine.
bool IsFixedLengthNumber(int length)
static DateToken Invalid()
bool IsKeywordType(KeywordType tag)
static DateToken EndOfInput()