diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-helpers-date.cpp b/jerry-core/ecma/builtin-objects/ecma-builtin-helpers-date.cpp index 511e619d8..9d31896de 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-helpers-date.cpp +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-helpers-date.cpp @@ -187,13 +187,19 @@ ecma_date_year_from_time (ecma_number_t time) /**< time value */ /* ECMA-262 v5, 15.9.1.1 define the largest year that is * representable (285616) forward from 01 January, 1970 UTC. */ - ecma_number_t year = (ecma_number_t) (285616 + 1970); + ecma_number_t year = (ecma_number_t) (1970 + 285616); + ecma_number_t lower_year_boundary = (ecma_number_t) (1970 - 285616); while (ecma_date_time_from_year (year) > time) { - if (ecma_date_time_from_year ((ecma_number_t) floor (year / 2)) > time) + ecma_number_t year_boundary = (ecma_number_t) floor (lower_year_boundary + (year - lower_year_boundary) / 2); + if (ecma_date_time_from_year (year_boundary) > time) { - year = (ecma_number_t) floor (year / 2); + year = year_boundary; + } + else + { + lower_year_boundary = year_boundary; } year--; } diff --git a/tests/jerry/date-getters.js b/tests/jerry/date-getters.js index 0d1c45c02..b0e5936c1 100644 --- a/tests/jerry/date-getters.js +++ b/tests/jerry/date-getters.js @@ -100,6 +100,7 @@ assert (isNaN (d.getTimezoneOffset())); /* 5. test case */ assert (new Date(2013, -1).getMonth() === 11); +assert (new Date(-2, -2).getFullYear() === -3); assert (new Date(-1, -1).getFullYear() === -2); assert (new Date(-1, -1, -1).getMonth() === 10); assert (new Date(-1, -1, -1, -1).getDate() === 28); diff --git a/tests/unit/test-date-helpers.cpp b/tests/unit/test-date-helpers.cpp index 4c823f19a..b2aa49a80 100644 --- a/tests/unit/test-date-helpers.cpp +++ b/tests/unit/test-date-helpers.cpp @@ -81,6 +81,7 @@ main (int __attr_unused___ argc, JERRY_ASSERT (ecma_date_year_from_time (-1970 * MS_PER_YEAR) == 1); JERRY_ASSERT (ecma_date_year_from_time (START_OF_GREGORIAN_CALENDAR) == 0); JERRY_ASSERT (ecma_date_year_from_time (START_OF_GREGORIAN_CALENDAR - 1) == -1); + JERRY_ASSERT (ecma_date_year_from_time (START_OF_GREGORIAN_CALENDAR - 3 * MS_PER_YEAR) == -3); /* int ecma_date_day_within_year (time) */