@@ -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/* *
0 commit comments