summaryrefslogtreecommitdiff
path: root/deps/v8
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8')
-rw-r--r--deps/v8/src/date/dateparser.h3
-rw-r--r--deps/v8/test/mjsunit/regress/regress-12256.js54
2 files changed, 57 insertions, 0 deletions
diff --git a/deps/v8/src/date/dateparser.h b/deps/v8/src/date/dateparser.h
index 9975737c07..1a0a0b15ab 100644
--- a/deps/v8/src/date/dateparser.h
+++ b/deps/v8/src/date/dateparser.h
@@ -75,6 +75,9 @@ class DateParser : public AllStatic {
int ReadUnsignedNumeral() {
int n = 0;
int i = 0;
+ // First, skip leading zeros
+ while (ch_ == '0') Next();
+ // And then, do the conversion
while (IsAsciiDigit()) {
if (i < kMaxSignificantDigits) n = n * 10 + ch_ - '0';
i++;
diff --git a/deps/v8/test/mjsunit/regress/regress-12256.js b/deps/v8/test/mjsunit/regress/regress-12256.js
new file mode 100644
index 0000000000..e6407c06ed
--- /dev/null
+++ b/deps/v8/test/mjsunit/regress/regress-12256.js
@@ -0,0 +1,54 @@
+// Copyright 2021 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+const dates = [{ year: '2021', month: '10', day: '22', hour: '10', minute: '12', second: '32' },
+ { year: '2021', month: '8', day: '3', hour: '9', minute: '9', second: '6' }];
+
+for (let date of dates) {
+ const { year, month, day, hour, minute, second } = date;
+ const s0 = `${year}-${month}-${day} ${hour}:${minute}:${second}Z`;
+
+ // V8 reads at most kMaxSignificantDigits (9) to build the value of a numeral,
+ // so let's test up to 9 leading zeros.
+
+ // For years
+ for (let i = 1; i < 10; i++) {
+ const s1 = `${'0'.repeat(i) + year}-${month}-${day} ${hour}:${minute}:${second}Z`;
+ assertTrue(new Date(s0).getTime() == new Date(s1).getTime());
+ }
+
+ // For months
+ for (let i = 1; i < 10; i++) {
+ const s1 = `${year}-${'0'.repeat(i) + month}-${day} ${hour}:${minute}:${second}Z`;
+ assertTrue(new Date(s0).getTime() == new Date(s1).getTime());
+ }
+
+ // For days
+ for (let i = 1; i < 10; i++) {
+ const s1 = `${year}-${month}-${'0'.repeat(i) + day} ${hour}:${minute}:${second}Z`;
+ assertTrue(new Date(s0).getTime() == new Date(s1).getTime());
+ }
+
+ // For hours
+ for (let i = 1; i < 10; i++) {
+ const s1 = `${year}-${month}-${day} ${'0'.repeat(i) + hour}:${minute}:${second}Z`;
+ assertTrue(new Date(s0).getTime() == new Date(s1).getTime());
+ }
+
+ // For minutes
+ for (let i = 1; i < 10; i++) {
+ const s1 = `${year}-${month}-${day} ${hour}:${'0'.repeat(i) + minute}:${second}Z`;
+ assertTrue(new Date(s0).getTime() == new Date(s1).getTime());
+ }
+
+ // For seconds
+ for (let i = 1; i < 10; i++) {
+ const s1 = `${year}-${month}-${day} ${hour}:${minute}:${'0'.repeat(i) + second}Z`;
+ assertTrue(new Date(s0).getTime() == new Date(s1).getTime());
+ }
+
+ // With same input date string,
+ // Date() and Date.parse() should return the same date
+ assertTrue(new Date(s0).getTime() == Date.parse(s0));
+}