2727 * @{
2828 */
2929
30- /* 24 * 3600 * 1000 */
31- #define ECMA_MS_PER_DAY 86400000
30+ #define ECMA_DATE_HOURS_PER_DAY 24
31+ #define ECMA_DATE_MINUTES_PER_HOUR 60
32+ #define ECMA_DATE_SECONDS_PER_MINUTE 60
33+ #define ECMA_DATE_MS_PER_SECOND 1000
34+ /* ECMA_DATE_MS_PER_MINUTE == 60000 */
35+ #define ECMA_DATE_MS_PER_MINUTE (ECMA_DATE_MS_PER_SECOND * ECMA_DATE_SECONDS_PER_MINUTE)
36+ /* ECMA_DATE_MS_PER_HOUR == 3600000 */
37+ #define ECMA_DATE_MS_PER_HOUR (ECMA_DATE_MS_PER_MINUTE * ECMA_DATE_MINUTES_PER_HOUR)
38+ /* ECMA_DATE_MS_PER_DAY == 86400000 */
39+ #define ECMA_DATE_MS_PER_DAY (ECMA_DATE_MS_PER_HOUR * ECMA_DATE_HOURS_PER_DAY)
40+ #define ECMA_DATE_MAX_VALUE 8.64e15
3241
3342/* *
3443 * Helper function to get day number from time value.
4150int __attr_always_inline___
4251ecma_date_day (ecma_number_t time) /* *< time value */
4352{
44- return (int ) floor (time / ECMA_MS_PER_DAY );
53+ return (int ) floor (time / ECMA_DATE_MS_PER_DAY );
4554} /* ecma_date_day */
4655
4756/* *
@@ -55,7 +64,7 @@ ecma_date_day (ecma_number_t time) /**< time value */
5564ecma_number_t __attr_always_inline___
5665ecma_date_time_within_day (ecma_number_t time) /* *< time value */
5766{
58- return (ecma_number_t ) fmod (time, ECMA_MS_PER_DAY );
67+ return (ecma_number_t ) fmod (time, ECMA_DATE_MS_PER_DAY );
5968} /* ecma_date_time_within_day */
6069
6170/* *
@@ -115,7 +124,7 @@ ecma_date_day_from_year (ecma_number_t year) /**< year value */
115124ecma_number_t __attr_always_inline___
116125ecma_date_time_from_year (ecma_number_t year) /* *< year value */
117126{
118- return ECMA_MS_PER_DAY * (ecma_number_t ) ecma_date_day_from_year (year);
127+ return ECMA_DATE_MS_PER_DAY * (ecma_number_t ) ecma_date_day_from_year (year);
119128} /* ecma_date_time_from_year */
120129
121130/* *
@@ -358,9 +367,9 @@ ecma_date_daylight_saving_ta (ecma_number_t __attr_unused___ time)
358367 * @return local time
359368 */
360369ecma_number_t __attr_always_inline___
361- ecma_date_local_time (ecma_number_t __attr_unused___ time)
370+ ecma_date_local_time (ecma_number_t time)
362371{
363- JERRY_UNIMPLEMENTED ( " The ecma_date_local_time is not implemented yet. " );
372+ return time + ecma_date_local_tza () + ecma_date_daylight_saving_ta (time );
364373} /* ecma_date_local_time */
365374
366375/* *
@@ -372,9 +381,10 @@ ecma_date_local_time (ecma_number_t __attr_unused___ time)
372381 * @return utc value
373382 */
374383ecma_number_t __attr_always_inline___
375- ecma_date_utc (ecma_number_t __attr_unused___ time)
384+ ecma_date_utc (ecma_number_t time)
376385{
377- JERRY_UNIMPLEMENTED (" The ecma_date_utc is not implemented yet." );
386+ ecma_number_t simple_utc_time = time - ecma_date_local_tza ();
387+ return simple_utc_time - ecma_date_daylight_saving_ta (simple_utc_time);
378388} /* ecma_date_utc */
379389
380390/* *
@@ -386,9 +396,10 @@ ecma_date_utc (ecma_number_t __attr_unused___ time)
386396 * @return hour value
387397 */
388398ecma_number_t __attr_always_inline___
389- ecma_date_hour_from_time (ecma_number_t __attr_unused___ time)
399+ ecma_date_hour_from_time (ecma_number_t time)
390400{
391- JERRY_UNIMPLEMENTED (" The ecma_date_hour_from_time is not implemented yet." );
401+ return (ecma_number_t ) fmod (floor (time / ECMA_DATE_MS_PER_HOUR),
402+ ECMA_DATE_HOURS_PER_DAY);
392403} /* ecma_date_hour_from_time */
393404
394405/* *
@@ -400,9 +411,10 @@ ecma_date_hour_from_time (ecma_number_t __attr_unused___ time)
400411 * @return minute value
401412 */
402413ecma_number_t __attr_always_inline___
403- ecma_date_min_from_time (ecma_number_t __attr_unused___ time)
414+ ecma_date_min_from_time (ecma_number_t time)
404415{
405- JERRY_UNIMPLEMENTED (" The ecma_date_min_from_time is not implemented yet." );
416+ return (ecma_number_t ) fmod (floor (time / ECMA_DATE_MS_PER_MINUTE),
417+ ECMA_DATE_MINUTES_PER_HOUR);
406418} /* ecma_date_min_from_time */
407419
408420/* *
@@ -414,9 +426,10 @@ ecma_date_min_from_time (ecma_number_t __attr_unused___ time)
414426 * @return second value
415427 */
416428ecma_number_t __attr_always_inline___
417- ecma_date_sec_from_time (ecma_number_t __attr_unused___ time)
429+ ecma_date_sec_from_time (ecma_number_t time)
418430{
419- JERRY_UNIMPLEMENTED (" The ecma_date_sec_from_time is not implemented yet." );
431+ return (ecma_number_t ) fmod (floor (time / ECMA_DATE_MS_PER_SECOND),
432+ ECMA_DATE_SECONDS_PER_MINUTE);
420433} /* ecma_date_sec_from_time */
421434
422435/* *
@@ -428,9 +441,9 @@ ecma_date_sec_from_time (ecma_number_t __attr_unused___ time)
428441 * @return millisecond value
429442 */
430443ecma_number_t __attr_always_inline___
431- ecma_date_ms_from_time (ecma_number_t __attr_unused___ time)
444+ ecma_date_ms_from_time (ecma_number_t time)
432445{
433- JERRY_UNIMPLEMENTED ( " The ecma_date_ms_from_time is not implemented yet. " );
446+ return ( ecma_number_t ) fmod (time, ECMA_DATE_MS_PER_SECOND );
434447} /* ecma_date_ms_from_time */
435448
436449/* *
@@ -442,12 +455,30 @@ ecma_date_ms_from_time (ecma_number_t __attr_unused___ time)
442455 * @return time value
443456 */
444457ecma_number_t __attr_always_inline___
445- ecma_date_make_time (ecma_number_t __attr_unused___ hour,
446- ecma_number_t __attr_unused___ min,
447- ecma_number_t __attr_unused___ sec,
448- ecma_number_t __attr_unused___ ms)
458+ ecma_date_make_time (ecma_number_t hour,
459+ ecma_number_t min,
460+ ecma_number_t sec,
461+ ecma_number_t ms)
449462{
450- JERRY_UNIMPLEMENTED (" The ecma_date_make_time is not implemented yet." );
463+ if (ecma_number_is_nan (hour) || ecma_number_is_infinity (hour)
464+ || ecma_number_is_nan (min) || ecma_number_is_infinity (min)
465+ || ecma_number_is_nan (sec) || ecma_number_is_infinity (sec)
466+ || ecma_number_is_nan (ms) || ecma_number_is_infinity (ms))
467+ {
468+ return ecma_number_make_nan ();
469+ }
470+
471+ ecma_number_t h = ecma_number_trunc (hour);
472+ ecma_number_t m = ecma_number_trunc (min);
473+ ecma_number_t s = ecma_number_trunc (sec);
474+ ecma_number_t milli = ecma_number_trunc (ms);
475+
476+ /* FIXME: performing the arithmetic according to IEEE 754 rules
477+ * (that is, as if using the ECMAScript operators * and +) */
478+ return (h * ECMA_DATE_MS_PER_HOUR
479+ + m * ECMA_DATE_MS_PER_MINUTE
480+ + s * ECMA_DATE_MS_PER_SECOND
481+ + milli);
451482} /* ecma_date_make_time */
452483
453484/* *
@@ -459,11 +490,35 @@ ecma_date_make_time (ecma_number_t __attr_unused___ hour,
459490 * @return day value
460491 */
461492ecma_number_t __attr_always_inline___
462- ecma_date_make_day (ecma_number_t __attr_unused___ year,
463- ecma_number_t __attr_unused___ month,
464- ecma_number_t __attr_unused___ date)
493+ ecma_date_make_day (ecma_number_t year,
494+ ecma_number_t month,
495+ ecma_number_t date)
465496{
466- JERRY_UNIMPLEMENTED (" The ecma_date_make_day is not implemented yet." );
497+ if (ecma_number_is_nan (year) || ecma_number_is_infinity (year)
498+ || ecma_number_is_nan (month) || ecma_number_is_infinity (month)
499+ || ecma_number_is_nan (date) || ecma_number_is_infinity (date))
500+ {
501+ return ecma_number_make_nan ();
502+ }
503+
504+ ecma_number_t y = ecma_number_trunc (year);
505+ ecma_number_t m = ecma_number_trunc (month);
506+ ecma_number_t dt = ecma_number_trunc (date);
507+ ecma_number_t ym = y + (ecma_number_t ) floor (m / 12 );
508+ ecma_number_t mn = (ecma_number_t ) fmod (m, 12 );
509+ ecma_number_t time = ecma_date_time_from_year (ym);
510+
511+ JERRY_ASSERT (ecma_date_year_from_time (time) == ym);
512+
513+ while (ecma_date_month_from_time (time) < mn)
514+ {
515+ time += ECMA_DATE_MS_PER_DAY;
516+ }
517+
518+ JERRY_ASSERT ((ecma_date_month_from_time (time) == mn)
519+ && (ecma_date_date_from_time (time) == 1 ));
520+
521+ return (ecma_number_t ) ecma_date_day (time) + dt - ((ecma_number_t ) 1.0 );
467522} /* ecma_date_make_day */
468523
469524/* *
@@ -475,9 +530,15 @@ ecma_date_make_day (ecma_number_t __attr_unused___ year,
475530 * @return date value
476531 */
477532ecma_number_t __attr_always_inline___
478- ecma_date_make_date (ecma_number_t __attr_unused___ day, ecma_number_t __attr_unused___ time)
533+ ecma_date_make_date (ecma_number_t day, ecma_number_t time)
479534{
480- JERRY_UNIMPLEMENTED (" The ecma_date_make_date is not implemented yet." );
535+ if (ecma_number_is_nan (day) || ecma_number_is_infinity (day)
536+ || ecma_number_is_nan (time) || ecma_number_is_infinity (time))
537+ {
538+ return ecma_number_make_nan ();
539+ }
540+
541+ return day * ECMA_DATE_MS_PER_DAY + time;
481542} /* ecma_date_make_date */
482543
483544/* *
@@ -489,9 +550,15 @@ ecma_date_make_date (ecma_number_t __attr_unused___ day, ecma_number_t __attr_un
489550 * @return number of milliseconds
490551 */
491552ecma_number_t __attr_always_inline___
492- ecma_date_time_clip (ecma_number_t __attr_unused___ year )
553+ ecma_date_time_clip (ecma_number_t time )
493554{
494- JERRY_UNIMPLEMENTED (" The ecma_date_time_clip is not implemented yet." );
555+ if (ecma_number_is_nan (time) || ecma_number_is_infinity (time)
556+ || fabs (time) > ECMA_DATE_MAX_VALUE)
557+ {
558+ return ecma_number_make_nan ();
559+ }
560+
561+ return ecma_number_trunc (time);
495562} /* ecma_date_time_clip */
496563
497564/* *
0 commit comments