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:
parent
75562c7943
commit
2679ad1118
@ -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);
|
||||
|
@ -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>";
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
@ -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.
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user