Skip to content

Commit

Permalink
deps: V8: cherry-pick cced52a97ee9
Browse files Browse the repository at this point in the history
Original commit message:

    [date] Skip leading zeros when parsing date string

    1. Skip leading zeros when parsing date string
    2. Add necessary unittests

    Bug: v8:12256
    Change-Id: Ibc1f320382a2e33175f7f57542c8fe48afd05fa8
    Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3223239
    Reviewed-by: Shu-yu Guo <[email protected]>
    Reviewed-by: Igor Sheludko <[email protected]>
    Commit-Queue: Shu-yu Guo <[email protected]>
    Cr-Commit-Position: refs/heads/main@{#77592}

Refs: v8/v8@cced52a

PR-URL: #40656
Reviewed-By: Colin Ihrig <[email protected]>
Reviewed-By: Michaël Zasso <[email protected]>
Reviewed-By: Richard Lau <[email protected]>
Reviewed-By: Mohammed Keyvanzadeh <[email protected]>
Reviewed-By: James M Snell <[email protected]>
  • Loading branch information
rayw000 authored and danielleadams committed Feb 1, 2022
1 parent f260bbc commit 7cbbe0d
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 0 deletions.
3 changes: 3 additions & 0 deletions deps/v8/src/date/dateparser.h
Original file line number Diff line number Diff line change
Expand Up @@ -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++;
Expand Down
54 changes: 54 additions & 0 deletions deps/v8/test/mjsunit/regress/regress-12256.js
Original file line number Diff line number Diff line change
@@ -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));
}

0 comments on commit 7cbbe0d

Please sign in to comment.