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
-~----------~----~----~----~------~----~------~--~---

Reply via email to