Skip to content

Commit c8884a4

Browse files
committed
Fix assert in the Date prototype
JerryScript-DCO-1.0-Signed-off-by: Kristof Kosztyo kkosztyo.u-szeged@partner.samsung.com
1 parent 8f594ae commit c8884a4

File tree

3 files changed

+60
-12
lines changed

3 files changed

+60
-12
lines changed

jerry-core/ecma/builtin-objects/ecma-builtin-helpers-date.cpp

Lines changed: 50 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -726,6 +726,7 @@ ecma_date_make_day (ecma_number_t year, /**< year value */
726726
ecma_number_t month, /**< month value */
727727
ecma_number_t date) /**< date value */
728728
{
729+
/* 1. */
729730
if (ecma_number_is_nan (year)
730731
|| ecma_number_is_nan (month)
731732
|| ecma_number_is_nan (date)
@@ -736,25 +737,66 @@ ecma_date_make_day (ecma_number_t year, /**< year value */
736737
return ecma_number_make_nan ();
737738
}
738739

740+
/* 2., 3., 4. */
739741
ecma_number_t y = ecma_number_trunc (year);
740742
ecma_number_t m = ecma_number_trunc (month);
741743
ecma_number_t dt = ecma_number_trunc (date);
744+
/* 5. */
742745
ecma_number_t ym = y + (ecma_number_t) floor (m / 12);
746+
/* 6. */
743747
ecma_number_t mn = (ecma_number_t) fmod (m, 12);
744748
mn = (mn < 0) ? 12 + mn : mn;
749+
750+
/* 7. */
745751
ecma_number_t time = ecma_date_time_from_year (ym);
752+
int32_t step = 182;
753+
int32_t delta = step;
754+
755+
/**
756+
* The algorithm below searches the following date: ym-mn-1
757+
* To find this time it starts from the beggining of the year (ym)
758+
* then increase it by ECMA_DATE_MS_PER_DAY until it reaches the
759+
* right date.
760+
*/
761+
if (ecma_date_year_from_time (time) == ym)
762+
{
763+
/**
764+
* Binary search to get the closest day in the previous month.
765+
* It has to use integer days so sometimes the found time
766+
* needs some more increasing which is done day by day below.
767+
*/
768+
while (delta)
769+
{
770+
if (ecma_date_month_from_time (time + step * ECMA_DATE_MS_PER_DAY) < mn)
771+
{
772+
step += delta;
773+
}
774+
else
775+
{
776+
step -= delta;
777+
}
778+
delta = delta / 2;
779+
}
780+
781+
if (ecma_date_month_from_time (time + step) < mn)
782+
{
783+
time += step * ECMA_DATE_MS_PER_DAY;
784+
}
746785

747-
JERRY_ASSERT (ecma_date_year_from_time (time) == ym);
786+
/* Get the month's first day */
787+
while (ecma_date_month_from_time (time) < mn)
788+
{
789+
time += ECMA_DATE_MS_PER_DAY;
790+
}
748791

749-
while (ecma_date_month_from_time (time) < mn)
750-
{
751-
time += ECMA_DATE_MS_PER_DAY;
792+
if (ecma_date_month_from_time (time) == mn && ecma_date_date_from_time (time) == 1)
793+
{
794+
/* 8. */
795+
return ecma_date_day (time) + dt - ((ecma_number_t) 1.0);
796+
}
752797
}
753798

754-
JERRY_ASSERT (ecma_date_month_from_time (time) == mn);
755-
JERRY_ASSERT (ecma_date_date_from_time (time) == 1);
756-
757-
return ecma_date_day (time) + dt - ((ecma_number_t) 1.0);
799+
return ecma_number_make_nan ();
758800
} /* ecma_date_make_day */
759801

760802
/**

jerry-core/ecma/builtin-objects/ecma-builtin-helpers.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,13 @@ extern ecma_completion_value_t ecma_builtin_helper_def_prop (ecma_object_t *obj_
5656
* ECMA-262 v5, 15.9.1.1, 15.9.1.10
5757
*/
5858
/* Hours in a day. */
59-
#define ECMA_DATE_HOURS_PER_DAY 24
59+
#define ECMA_DATE_HOURS_PER_DAY ((ecma_number_t) 24)
6060
/* Minutes in an hour. */
61-
#define ECMA_DATE_MINUTES_PER_HOUR 60
61+
#define ECMA_DATE_MINUTES_PER_HOUR ((ecma_number_t) 60)
6262
/* Seconds in a minute. */
63-
#define ECMA_DATE_SECONDS_PER_MINUTE 60
63+
#define ECMA_DATE_SECONDS_PER_MINUTE ((ecma_number_t) 60)
6464
/* Milliseconds in a second. */
65-
#define ECMA_DATE_MS_PER_SECOND 1000
65+
#define ECMA_DATE_MS_PER_SECOND ((ecma_number_t) 1000)
6666
/* ECMA_DATE_MS_PER_MINUTE == 60000 */
6767
#define ECMA_DATE_MS_PER_MINUTE (ECMA_DATE_MS_PER_SECOND * ECMA_DATE_SECONDS_PER_MINUTE)
6868
/* ECMA_DATE_MS_PER_HOUR == 3600000 */

tests/jerry/date-construct.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,12 @@ assert (d.valueOf() == 8.64e+15);
5252
d = new Date(8.64e+15 + 1);
5353
assert (isNaN(d.valueOf()));
5454

55+
d = new Date(20000000, 0, 1);
56+
assert (isNaN(d.valueOf()));
57+
58+
d = new Date(0, 20000000, 1);
59+
assert (isNaN(d.valueOf()));
60+
5561
var Obj = function (val)
5662
{
5763
this.value = val;

0 commit comments

Comments
 (0)