Date.UTC should not return NaN with only Year param
authoryusukesuzuki@slowstart.org <yusukesuzuki@slowstart.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 10 Aug 2018 17:42:32 +0000 (17:42 +0000)
committeryusukesuzuki@slowstart.org <yusukesuzuki@slowstart.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 10 Aug 2018 17:42:32 +0000 (17:42 +0000)
https://bugs.webkit.org/show_bug.cgi?id=188378

Reviewed by Keith Miller.

JSTests:

* ChakraCore.yaml:
* ChakraCore/test/Date/dateutc.baseline-jsc: Added.
* stress/date-utc-optional.js: Added.
(shouldBe):
* test262/expectations.yaml:

Source/JavaScriptCore:

Date.UTC requires one argument for |year|. But the other ones are optional.
This patch fix this handling.

* runtime/DateConstructor.cpp:
(JSC::millisecondsFromComponents):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@234763 268f45cc-cd09-0410-ab3c-d52691b4dbfc

JSTests/ChakraCore.yaml
JSTests/ChakraCore/test/Date/dateutc.baseline-jsc [new file with mode: 0644]
JSTests/ChangeLog
JSTests/stress/date-utc-optional.js [new file with mode: 0644]
JSTests/test262/expectations.yaml
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/runtime/DateConstructor.cpp

index b248fac..6beb273 100644 (file)
 - path: ChakraCore/test/Date/toISO_3.js
   cmd: runChakra :baseline, "NoException", "toISO_3.baseline", []
 - path: ChakraCore/test/Date/dateutc.js
-  cmd: runChakra :baseline, "NoException", "dateutc.baseline", []
+  cmd: runChakra :baseline, "NoException", "dateutc.baseline-jsc", []
 - path: ChakraCore/test/Date/MillisecondTruncationCheckAfterCopyConstructor.js
   cmd: runChakra :baseline, "NoException", "MillisecondTruncationCheckAfterCopyConstructor.es6.baseline", []
   # FIXME: unskip the following test on Windows when https://bugs.webkit.org/show_bug.cgi?id=165193 is fixed.
diff --git a/JSTests/ChakraCore/test/Date/dateutc.baseline-jsc b/JSTests/ChakraCore/test/Date/dateutc.baseline-jsc
new file mode 100644 (file)
index 0000000..2a565e7
--- /dev/null
@@ -0,0 +1,13 @@
+126230400000
+126230400000
+149817600000
+151804800000
+151804800000
+151806000000
+151806030000
+151806030040
+151806030040
+-2151877169960
+151806030040
+NaN
+NaN
index e83671f..731ab24 100644 (file)
@@ -1,3 +1,16 @@
+2018-08-10  Yusuke Suzuki  <yusukesuzuki@slowstart.org>
+
+        Date.UTC should not return NaN with only Year param
+        https://bugs.webkit.org/show_bug.cgi?id=188378
+
+        Reviewed by Keith Miller.
+
+        * ChakraCore.yaml:
+        * ChakraCore/test/Date/dateutc.baseline-jsc: Added.
+        * stress/date-utc-optional.js: Added.
+        (shouldBe):
+        * test262/expectations.yaml:
+
 2018-08-08  Keith Miller  <keith_miller@apple.com>
 
         Array.prototype.sort should call @toLength instead of ">>> 0"
diff --git a/JSTests/stress/date-utc-optional.js b/JSTests/stress/date-utc-optional.js
new file mode 100644 (file)
index 0000000..f14f7c6
--- /dev/null
@@ -0,0 +1,16 @@
+function shouldBe(actual, expected) {
+    if (actual !== expected)
+        throw new Error('bad value: ' + actual);
+}
+
+for (var i = 0; i < 1e5; ++i) {
+    shouldBe(Number.isNaN(Date.UTC()), true);
+    shouldBe(Date.UTC(2018), 1514764800000);
+    shouldBe(Date.UTC(2018, 1), 1517443200000);
+    shouldBe(Date.UTC(2018, 1, 2), 1517529600000);
+    shouldBe(Date.UTC(2018, 1, 2, 3), 1517540400000);
+    shouldBe(Date.UTC(2018, 1, 2, 3, 4), 1517540640000);
+    shouldBe(Date.UTC(2018, 1, 2, 3, 4, 5), 1517540645000);
+    shouldBe(Date.UTC(2018, 1, 2, 3, 4, 5, 6), 1517540645006);
+    shouldBe(Date.UTC(2018, 1, 2, 3, 4, 5, 6, 7), 1517540645006);
+}
index 3fe3d5c..090f79e 100644 (file)
@@ -855,9 +855,6 @@ test/built-ins/DataView/prototype/setUint8/detached-buffer-before-outofrange-byt
 test/built-ins/DataView/prototype/setUint8/detached-buffer.js:
   default: 'Test262Error: Expected a TypeError but got a RangeError'
   strict mode: 'Test262Error: Expected a TypeError but got a RangeError'
-test/built-ins/Date/UTC/return-value.js:
-  default: 'Test262Error: 1970 Expected SameValue(«NaN», Â«0») to be true'
-  strict mode: 'Test262Error: 1970 Expected SameValue(«NaN», Â«0») to be true'
 test/built-ins/Date/proto-from-ctor-realm-one.js:
   default: 'TypeError: Type error'
   strict mode: 'TypeError: Type error'
index f048ee1..f4e9825 100644 (file)
@@ -1,3 +1,16 @@
+2018-08-10  Yusuke Suzuki  <yusukesuzuki@slowstart.org>
+
+        Date.UTC should not return NaN with only Year param
+        https://bugs.webkit.org/show_bug.cgi?id=188378
+
+        Reviewed by Keith Miller.
+
+        Date.UTC requires one argument for |year|. But the other ones are optional.
+        This patch fix this handling.
+
+        * runtime/DateConstructor.cpp:
+        (JSC::millisecondsFromComponents):
+
 2018-08-08  Keith Miller  <keith_miller@apple.com>
 
         Array.prototype.sort should call @toLength instead of ">>> 0"
index fd44221..e38e5ed 100644 (file)
@@ -88,34 +88,30 @@ static double millisecondsFromComponents(ExecState* exec, const ArgList& args, W
     VM& vm = exec->vm();
     auto scope = DECLARE_THROW_SCOPE(vm);
 
-    double doubleArguments[7];
-    for (int i = 0; i < 7; i++) {
+    // Initialize doubleArguments with default values.
+    double doubleArguments[7] {
+        0, 0, 1, 0, 0, 0, 0
+    };
+    unsigned numberOfUsedArguments = std::max(std::min<unsigned>(7U, args.size()), 1U);
+    for (unsigned i = 0; i < numberOfUsedArguments; ++i) {
         doubleArguments[i] = args.at(i).toNumber(exec);
         RETURN_IF_EXCEPTION(scope, 0);
     }
-
-    int numArgs = args.size();
-
-    if ((!std::isfinite(doubleArguments[0]) || (doubleArguments[0] > INT_MAX) || (doubleArguments[0] < INT_MIN))
-        || (!std::isfinite(doubleArguments[1]) || (doubleArguments[1] > INT_MAX) || (doubleArguments[1] < INT_MIN))
-        || (numArgs >= 3 && (!std::isfinite(doubleArguments[2]) || (doubleArguments[2] > INT_MAX) || (doubleArguments[2] < INT_MIN)))
-        || (numArgs >= 4 && (!std::isfinite(doubleArguments[3]) || (doubleArguments[3] > INT_MAX) || (doubleArguments[3] < INT_MIN)))
-        || (numArgs >= 5 && (!std::isfinite(doubleArguments[4]) || (doubleArguments[4] > INT_MAX) || (doubleArguments[4] < INT_MIN)))
-        || (numArgs >= 6 && (!std::isfinite(doubleArguments[5]) || (doubleArguments[5] > INT_MAX) || (doubleArguments[5] < INT_MIN)))
-        || (numArgs >= 7 && (!std::isfinite(doubleArguments[6]) || (doubleArguments[6] > INT_MAX) || (doubleArguments[6] < INT_MIN))))
-        return PNaN;
+    for (unsigned i = 0; i < numberOfUsedArguments; ++i) {
+        if (!std::isfinite(doubleArguments[i]) || (doubleArguments[i] > INT_MAX) || (doubleArguments[i] < INT_MIN))
+            return PNaN;
+    }
 
     GregorianDateTime t;
     int year = JSC::toInt32(doubleArguments[0]);
     t.setYear((year >= 0 && year <= 99) ? (year + 1900) : year);
     t.setMonth(JSC::toInt32(doubleArguments[1]));
-    t.setMonthDay((numArgs >= 3) ? JSC::toInt32(doubleArguments[2]) : 1);
+    t.setMonthDay(JSC::toInt32(doubleArguments[2]));
     t.setHour(JSC::toInt32(doubleArguments[3]));
     t.setMinute(JSC::toInt32(doubleArguments[4]));
     t.setSecond(JSC::toInt32(doubleArguments[5]));
     t.setIsDST(-1);
-    double ms = (numArgs >= 7) ? doubleArguments[6] : 0;
-    return gregorianDateTimeToMS(vm, t, ms, timeType);
+    return gregorianDateTimeToMS(vm, t, doubleArguments[6], timeType);
 }
 
 // ECMA 15.9.3