Guard local time posix functions from NaN value of invalid dates.

Review URL: http://codereview.chromium.org/160451

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@2601 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
whesse@chromium.org 2009-07-31 13:17:59 +00:00
parent 75562c7943
commit 2679ad1118
6 changed files with 18 additions and 9 deletions

View File

@ -156,6 +156,8 @@ var DST_offset_cache = {
// NOTE: The implementation relies on the fact that no time zones have
// more than one daylight savings offset change per month.
// This function must never be called with the argument NaN.
// All uses of it are guarded so this does not happen.
function DaylightSavingsOffset(t) {
// Load the cache object from the builtins object.
var cache = DST_offset_cache;
@ -219,6 +221,7 @@ var timezone_cache_time = $NaN;
var timezone_cache_timezone;
function LocalTimezone(t) {
if (NUMBER_IS_NAN(t)) return "";
if (t == timezone_cache_time) {
return timezone_cache_timezone;
}
@ -464,9 +467,11 @@ var Date_cache = {
value = cache.time;
} else {
value = DateParse(year);
cache.time = value;
cache.year = YearFromTime(LocalTimeNoCheck(value));
cache.string = year;
if (!NUMBER_IS_NAN(value)) {
cache.time = value;
cache.year = YearFromTime(LocalTimeNoCheck(value));
cache.string = year;
}
}
} else {
@ -647,6 +652,7 @@ function TimeString(time) {
function LocalTimezoneString(time) {
// time is not NaN because of checks in calling functions.
var timezoneOffset = (local_time_offset + DaylightSavingsOffset(time)) / msPerMinute;
var sign = (timezoneOffset >= 0) ? 1 : -1;
var hours = FLOOR((sign * timezoneOffset)/60);

View File

@ -80,7 +80,7 @@ int64_t OS::Ticks() {
// Returns a string identifying the current timezone taking into
// account daylight saving.
char* OS::LocalTimezone(double time) {
const char* OS::LocalTimezone(double time) {
UNIMPLEMENTED();
return "<none>";
}

View File

@ -86,16 +86,20 @@ int64_t OS::Ticks() {
}
char* OS::LocalTimezone(double time) {
const char* OS::LocalTimezone(double time) {
ASSERT(!isnan(time));
time_t tv = static_cast<time_t>(floor(time/msPerSecond));
struct tm* t = localtime(&tv);
return const_cast<char*>(t->tm_zone);
if (NULL == t) return "";
return t->tm_zone;
}
double OS::DaylightSavingsOffset(double time) {
ASSERT(!isnan(time));
time_t tv = static_cast<time_t>(floor(time/msPerSecond));
struct tm* t = localtime(&tv);
if (NULL == t) return nan_value();
return t->tm_isdst > 0 ? 3600 * msPerSecond : 0;
}

View File

@ -603,7 +603,7 @@ int64_t OS::Ticks() {
// Returns a string identifying the current timezone taking into
// account daylight saving.
char* OS::LocalTimezone(double time) {
const char* OS::LocalTimezone(double time) {
return Time(time).LocalTimezone();
}

View File

@ -143,7 +143,7 @@ class OS {
// Returns a string identifying the current time zone. The
// timestamp is used for determining if DST is in effect.
static char* LocalTimezone(double time);
static const char* LocalTimezone(double time);
// Returns the local time offset in milliseconds east of UTC without
// taking daylight savings time into account.

View File

@ -101,6 +101,5 @@ fuzz-natives: PASS || TIMEOUT
debug-handle: CRASH || FAIL
debug-clearbreakpointgroup: CRASH || FAIL
regress/regress-269: CRASH || FAIL
regress/regress-1200351: CRASH || FAIL
regress/regress-998565: CRASH || FAIL
tools/tickprocessor: PASS || CRASH || FAIL