Skip to content

Commit d7915bb

Browse files
committed
Implement missing functions in ecma-helpers-date.cpp
JerryScript-DCO-1.0-Signed-off-by: Szilard Ledan [email protected]
1 parent f28cf1a commit d7915bb

File tree

3 files changed

+104
-32
lines changed

3 files changed

+104
-32
lines changed

jerry-core/ecma/base/ecma-helpers-date.cpp

Lines changed: 97 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,17 @@
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.
@@ -41,7 +50,7 @@
4150
int __attr_always_inline___
4251
ecma_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 */
5564
ecma_number_t __attr_always_inline___
5665
ecma_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 */
115124
ecma_number_t __attr_always_inline___
116125
ecma_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
*/
360369
ecma_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
*/
374383
ecma_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
*/
388398
ecma_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
*/
402413
ecma_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
*/
416428
ecma_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
*/
430443
ecma_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
*/
444457
ecma_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
*/
461492
ecma_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
*/
477532
ecma_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
*/
491552
ecma_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
/**

jerry-core/ecma/base/ecma-helpers.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -351,7 +351,7 @@ extern ecma_number_t ecma_date_make_day (ecma_number_t year,
351351
ecma_number_t month,
352352
ecma_number_t date);
353353
extern ecma_number_t ecma_date_make_date (ecma_number_t day, ecma_number_t time);
354-
extern ecma_number_t ecma_date_time_clip (ecma_number_t year);
354+
extern ecma_number_t ecma_date_time_clip (ecma_number_t time);
355355

356356
/* ecma-helpers-char.cpp */
357357
extern bool ecma_char_is_new_line (ecma_char_t c);

tests/unit/test-date-helpers.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,12 @@ main (int __attr_unused___ argc,
123123

124124
/* ecma_number_t ecma_date_make_day (year, month, date) */
125125

126-
/* FIXME: Implement */
126+
JERRY_ASSERT (ecma_date_make_day (1970, 0, 1) == 0);
127+
JERRY_ASSERT (ecma_date_make_day (1970, 0, 2.5) == 1);
128+
JERRY_ASSERT (ecma_date_make_day (1970, 1, 35) == 65);
129+
JERRY_ASSERT (ecma_date_make_day (1970, 13, 35) == 430);
130+
JERRY_ASSERT (ecma_date_make_day (2016, 2, 1) == 16861);
131+
/* FIXME: More testcase */
127132

128133
/* ecma_number_t ecma_date_make_date (day, time) */
129134

0 commit comments

Comments
 (0)