Reviewers: Kasper Lund, Message: This will be tested on most platforms on Flexo, and I will also test on MacOS 64.
Description: Add safe handling of NaN to Posix platform-dependent time functions. Please review this at http://codereview.chromium.org/160580 SVN Base: http://v8.googlecode.com/svn/branches/bleeding_edge/ Affected files: M src/date-delay.js M src/platform-posix.cc A test/mjsunit/regress/regress-416.js Index: src/date-delay.js =================================================================== --- src/date-delay.js (revision 2614) +++ src/date-delay.js (working copy) @@ -156,8 +156,7 @@ // 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. +// If this function is called with NaN it returns NaN. function DaylightSavingsOffset(t) { // Load the cache object from the builtins object. var cache = DST_offset_cache; @@ -652,12 +651,13 @@ function LocalTimezoneString(time) { - // time is not NaN because of checks in calling functions. - var timezoneOffset = (local_time_offset + DaylightSavingsOffset(time)) / msPerMinute; + var timezoneOffset = + (local_time_offset + DaylightSavingsOffset(time)) / msPerMinute; var sign = (timezoneOffset >= 0) ? 1 : -1; var hours = FLOOR((sign * timezoneOffset)/60); var min = FLOOR((sign * timezoneOffset)%60); - var gmt = ' GMT' + ((sign == 1) ? '+' : '-') + TwoDigitString(hours) + TwoDigitString(min); + var gmt = ' GMT' + ((sign == 1) ? '+' : '-') + + TwoDigitString(hours) + TwoDigitString(min); return gmt + ' (' + LocalTimezone(time) + ')'; } Index: src/platform-posix.cc =================================================================== --- src/platform-posix.cc (revision 2614) +++ src/platform-posix.cc (working copy) @@ -87,7 +87,7 @@ const char* OS::LocalTimezone(double time) { - ASSERT(!isnan(time)); + if (isnan(time)) return ""; time_t tv = static_cast<time_t>(floor(time/msPerSecond)); struct tm* t = localtime(&tv); if (NULL == t) return ""; @@ -96,7 +96,7 @@ double OS::DaylightSavingsOffset(double time) { - ASSERT(!isnan(time)); + if (isnan(time)) return nan_value(); time_t tv = static_cast<time_t>(floor(time/msPerSecond)); struct tm* t = localtime(&tv); if (NULL == t) return nan_value(); Index: test/mjsunit/regress/regress-416.js =================================================================== --- test/mjsunit/regress/regress-416.js (revision 0) +++ test/mjsunit/regress/regress-416.js (revision 0) @@ -0,0 +1,41 @@ +// Copyright 2009 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: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Test of invalid Date construction, and TimeClip function. + +// See http://code.google.com/p/v8/issues/detail?id=416 + +assertEquals((new Date(1e81)).valueOf(), Number.NaN, "new Date(1e81)"); +assertEquals((new Date(-1e81)).valueOf(), Number.NaN, "new Date(-1e81)"); +assertEquals((new Date(1e81, "")).valueOf(), Number.NaN, + "new Date(1e81, \"\")"); +assertEquals((new Date(-1e81, "")).valueOf(), Number.NaN, + "new Date(-1e81, \"\")"); +assertEquals((new Date(Number.NaN)).valueOf(), Number.NaN, + "new Date(Number.NaN)"); +assertEquals((new Date(Number.NaN, "")).valueOf(), Number.NaN, + "new Date(Number.NaN, \"\")"); --~--~---------~--~----~------------~-------~--~----~ v8-dev mailing list [email protected] http://groups.google.com/group/v8-dev -~----------~----~----~----~------~----~------~--~---
