Fix assert in the Date prototype

JerryScript-DCO-1.0-Signed-off-by: Kristof Kosztyo kkosztyo.u-szeged@partner.samsung.com
This commit is contained in:
Kristof Kosztyo
2015-07-23 14:34:36 +02:00
parent 8f594aebfa
commit c8884a4561
3 changed files with 60 additions and 12 deletions
@@ -726,6 +726,7 @@ ecma_date_make_day (ecma_number_t year, /**< year value */
ecma_number_t month, /**< month value */
ecma_number_t date) /**< date value */
{
/* 1. */
if (ecma_number_is_nan (year)
|| ecma_number_is_nan (month)
|| ecma_number_is_nan (date)
@@ -736,25 +737,66 @@ ecma_date_make_day (ecma_number_t year, /**< year value */
return ecma_number_make_nan ();
}
/* 2., 3., 4. */
ecma_number_t y = ecma_number_trunc (year);
ecma_number_t m = ecma_number_trunc (month);
ecma_number_t dt = ecma_number_trunc (date);
/* 5. */
ecma_number_t ym = y + (ecma_number_t) floor (m / 12);
/* 6. */
ecma_number_t mn = (ecma_number_t) fmod (m, 12);
mn = (mn < 0) ? 12 + mn : mn;
/* 7. */
ecma_number_t time = ecma_date_time_from_year (ym);
int32_t step = 182;
int32_t delta = step;
JERRY_ASSERT (ecma_date_year_from_time (time) == ym);
while (ecma_date_month_from_time (time) < mn)
/**
* 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.
*/
if (ecma_date_year_from_time (time) == ym)
{
time += ECMA_DATE_MS_PER_DAY;
/**
* 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's first day */
while (ecma_date_month_from_time (time) < mn)
{
time += ECMA_DATE_MS_PER_DAY;
}
if (ecma_date_month_from_time (time) == mn && ecma_date_date_from_time (time) == 1)
{
/* 8. */
return ecma_date_day (time) + dt - ((ecma_number_t) 1.0);
}
}
JERRY_ASSERT (ecma_date_month_from_time (time) == mn);
JERRY_ASSERT (ecma_date_date_from_time (time) == 1);
return ecma_date_day (time) + dt - ((ecma_number_t) 1.0);
return ecma_number_make_nan ();
} /* ecma_date_make_day */
/**
@@ -56,13 +56,13 @@ extern ecma_completion_value_t ecma_builtin_helper_def_prop (ecma_object_t *obj_
* ECMA-262 v5, 15.9.1.1, 15.9.1.10
*/
/* Hours in a day. */
#define ECMA_DATE_HOURS_PER_DAY 24
#define ECMA_DATE_HOURS_PER_DAY ((ecma_number_t) 24)
/* Minutes in an hour. */
#define ECMA_DATE_MINUTES_PER_HOUR 60
#define ECMA_DATE_MINUTES_PER_HOUR ((ecma_number_t) 60)
/* Seconds in a minute. */
#define ECMA_DATE_SECONDS_PER_MINUTE 60
#define ECMA_DATE_SECONDS_PER_MINUTE ((ecma_number_t) 60)
/* Milliseconds in a second. */
#define ECMA_DATE_MS_PER_SECOND 1000
#define ECMA_DATE_MS_PER_SECOND ((ecma_number_t) 1000)
/* ECMA_DATE_MS_PER_MINUTE == 60000 */
#define ECMA_DATE_MS_PER_MINUTE (ECMA_DATE_MS_PER_SECOND * ECMA_DATE_SECONDS_PER_MINUTE)
/* ECMA_DATE_MS_PER_HOUR == 3600000 */
+6
View File
@@ -52,6 +52,12 @@ assert (d.valueOf() == 8.64e+15);
d = new Date(8.64e+15 + 1);
assert (isNaN(d.valueOf()));
d = new Date(20000000, 0, 1);
assert (isNaN(d.valueOf()));
d = new Date(0, 20000000, 1);
assert (isNaN(d.valueOf()));
var Obj = function (val)
{
this.value = val;