diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-helpers-date.c b/jerry-core/ecma/builtin-objects/ecma-builtin-helpers-date.c index 8d1ca49125..b632398c3e 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-helpers-date.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-helpers-date.c @@ -432,7 +432,8 @@ ecma_date_week_day (ecma_number_t time) /**< time value */ return time; /* time is NaN */ } - return (ecma_number_t) fmod ((ecma_date_day (time) + 4), 7); + ecma_number_t week_day = (ecma_number_t) fmod ((ecma_date_day (time) + 4), 7); + return (week_day < 0) ? 7 + week_day : week_day; } /* ecma_date_week_day */ /** @@ -752,45 +753,19 @@ ecma_date_make_day (ecma_number_t year, /**< year value */ /* 7. */ ecma_number_t time = ecma_date_time_from_year (ym); - int32_t step = 182; - int32_t delta = step; /** * The algorithm below searches the following date: ym-mn-1 * To find this time it starts from the beggining of the year (ym) - * then increase it by ECMA_DATE_MS_PER_DAY until it reaches the - * right date. + * then find the first day of the month. */ if (ecma_date_year_from_time (time) == ym) { - /** - * Binary search to get the closest day in the previous month. - * It has to use integer days so sometimes the found time - * needs some more increasing which is done day by day below. - */ - while (delta) - { - if (ecma_date_month_from_time (time + step * ECMA_DATE_MS_PER_DAY) < mn) - { - step += delta; - } - else - { - step -= delta; - } - delta = delta / 2; - } - - if (ecma_date_month_from_time (time + step) < mn) - { - time += step * ECMA_DATE_MS_PER_DAY; - } + /* Get the month */ + time += 31 * mn * ECMA_DATE_MS_PER_DAY; /* Get the month's first day */ - while (ecma_date_month_from_time (time) < mn) - { - time += ECMA_DATE_MS_PER_DAY; - } + time += ((ecma_number_t) 1.0 - ecma_date_date_from_time (time)) * ECMA_DATE_MS_PER_DAY; if (ecma_date_month_from_time (time) == mn && ecma_date_date_from_time (time) == 1) { diff --git a/tests/jerry/regression-test-issue-1386.js b/tests/jerry/regression-test-issue-1386.js new file mode 100644 index 0000000000..fe101dda69 --- /dev/null +++ b/tests/jerry/regression-test-issue-1386.js @@ -0,0 +1,24 @@ +// Copyright 2016 Hayun Lee (lhy920806@gmail.com) +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +for (var y = 1950; y < 2050; y++) { + for (var m = 0; m < 12; m++) { + var last_date = new Date(y, m, 1).getDay (); + assert (!isNaN (last_date)); + for (var d = 1; d < 32; d++) { + assert (last_date == new Date(y, m, d).getDay ()); + last_date = (last_date + 1) % 7; + } + } +} diff --git a/tests/unit/test-date-helpers.c b/tests/unit/test-date-helpers.c index e0888bc663..b6a21e4035 100644 --- a/tests/unit/test-date-helpers.c +++ b/tests/unit/test-date-helpers.c @@ -162,6 +162,8 @@ main () TEST_ASSERT (ecma_date_make_day (1970, 1, 35) == 65); TEST_ASSERT (ecma_date_make_day (1970, 13, 35) == 430); TEST_ASSERT (ecma_date_make_day (2016, 2, 1) == 16861); + TEST_ASSERT (ecma_date_make_day (2016, 8, 31) == 17075); + TEST_ASSERT (ecma_date_make_day (2016, 9, 1) == 17075); /* ecma_number_t ecma_date_make_date (day, time) */