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 |