| Index: src/dateparser.cc
|
| diff --git a/src/dateparser.cc b/src/dateparser.cc
|
| index 6d8048876fb6d6ead2ccd3f7a33a76f7bf214bc1..4a0721fe83c4fabb0fd5f5566660119e2bdcec2b 100644
|
| --- a/src/dateparser.cc
|
| +++ b/src/dateparser.cc
|
| @@ -1,4 +1,4 @@
|
| -// Copyright 2008 the V8 project authors. All rights reserved.
|
| +// Copyright 2011 the V8 project authors. All rights reserved.
|
| // Redistribution and use in source and binary forms, with or without
|
| // modification, are permitted provided that the following conditions are
|
| // met:
|
| @@ -44,7 +44,7 @@ bool DateParser::DayComposer::Write(FixedArray* output) {
|
| int day = kNone;
|
|
|
| if (named_month_ == kNone) {
|
| - if (index_ == 3 && !IsDay(comp_[0])) {
|
| + if (is_iso_date_ || (index_ == 3 && !IsDay(comp_[0]))) {
|
| // YMD
|
| year = comp_[0];
|
| month = comp_[1];
|
| @@ -71,8 +71,10 @@ bool DateParser::DayComposer::Write(FixedArray* output) {
|
| }
|
| }
|
|
|
| - if (Between(year, 0, 49)) year += 2000;
|
| - else if (Between(year, 50, 99)) year += 1900;
|
| + if (!is_iso_date_) {
|
| + if (Between(year, 0, 49)) year += 2000;
|
| + else if (Between(year, 50, 99)) year += 1900;
|
| + }
|
|
|
| if (!Smi::IsValid(year) || !IsMonth(month) || !IsDay(day)) return false;
|
|
|
| @@ -151,6 +153,7 @@ const int8_t DateParser::KeywordTable::
|
| {'m', 's', 't', DateParser::TIME_ZONE_NAME, -7},
|
| {'p', 'd', 't', DateParser::TIME_ZONE_NAME, -7},
|
| {'p', 's', 't', DateParser::TIME_ZONE_NAME, -8},
|
| + {'t', '\0', '\0', DateParser::TIME_SEPARATOR, 0},
|
| {'\0', '\0', '\0', DateParser::INVALID, 0},
|
| };
|
|
|
| @@ -175,4 +178,35 @@ int DateParser::KeywordTable::Lookup(const uint32_t* pre, int len) {
|
| }
|
|
|
|
|
| +int DateParser::ReadMilliseconds(DateToken token) {
|
| + // Read first three significant digits of the original numeral,
|
| + // as inferred from the value and the number of digits.
|
| + // I.e., use the number of digits to see if there were
|
| + // leading zeros.
|
| + int number = token.number();
|
| + int length = token.length();
|
| + if (length < 3) {
|
| + // Less than three digits. Multiply to put most significant digit
|
| + // in hundreds position.
|
| + if (length == 1) {
|
| + number *= 100;
|
| + } else if (length == 2) {
|
| + number *= 10;
|
| + }
|
| + } else if (length > 3) {
|
| + if (length > kMaxSignificantDigits) length = kMaxSignificantDigits;
|
| + // More than three digits. Divide by 10^(length - 3) to get three
|
| + // most significant digits.
|
| + int factor = 1;
|
| + do {
|
| + ASSERT(factor <= 100000000); // factor won't overflow.
|
| + factor *= 10;
|
| + length--;
|
| + } while (length > 3);
|
| + number /= factor;
|
| + }
|
| + return number;
|
| +}
|
| +
|
| +
|
| } } // namespace v8::internal
|
|
|