@@ -69,6 +69,111 @@ ecma_date_parse_date_chars (lit_utf8_iterator_t *iter, /**< iterator of the utf8
69
69
return ecma_utf8_string_to_number (str_start_p, copy_size);
70
70
} /* ecma_date_parse_date_chars */
71
71
72
+ /* *
73
+ * Calculate MakeDate(MakeDay(yr, m, dt), MakeTime(h, min, s, milli)) for Date constructor and UTC
74
+ *
75
+ * See also:
76
+ * ECMA-262 v5, 15.9.3.1
77
+ * ECMA-262 v5, 15.9.4.3
78
+ *
79
+ * @return result of MakeDate(MakeDay(yr, m, dt), MakeTime(h, min, s, milli))
80
+ */
81
+ static ecma_completion_value_t
82
+ ecma_date_construct_helper (const ecma_value_t *args, /* *< arguments passed to the Date constructor */
83
+ ecma_length_t args_len) /* *< number of arguments */
84
+ {
85
+ ecma_completion_value_t ret_value = ecma_make_empty_completion_value ();
86
+ ecma_number_t *prim_value_p = ecma_alloc_number ();
87
+ *prim_value_p = ecma_number_make_nan ();
88
+
89
+ ECMA_TRY_CATCH (year_value, ecma_op_to_number (args[0 ]), ret_value);
90
+ ECMA_TRY_CATCH (month_value, ecma_op_to_number (args[1 ]), ret_value);
91
+
92
+ ecma_number_t year = *ecma_get_number_from_value (year_value);
93
+ ecma_number_t month = *ecma_get_number_from_value (month_value);
94
+ ecma_number_t date = ECMA_NUMBER_ONE;
95
+ ecma_number_t hours = ECMA_NUMBER_ZERO;
96
+ ecma_number_t minutes = ECMA_NUMBER_ZERO;
97
+ ecma_number_t seconds = ECMA_NUMBER_ZERO;
98
+ ecma_number_t milliseconds = ECMA_NUMBER_ZERO;
99
+
100
+ /* 3. */
101
+ if (args_len >= 3 && ecma_is_completion_value_empty (ret_value))
102
+ {
103
+ ECMA_TRY_CATCH (date_value, ecma_op_to_number (args[2 ]), ret_value);
104
+ date = *ecma_get_number_from_value (date_value);
105
+ ECMA_FINALIZE (date_value);
106
+ }
107
+
108
+ /* 4. */
109
+ if (args_len >= 4 && ecma_is_completion_value_empty (ret_value))
110
+ {
111
+ ECMA_TRY_CATCH (hours_value, ecma_op_to_number (args[3 ]), ret_value);
112
+ hours = *ecma_get_number_from_value (hours_value);
113
+ ECMA_FINALIZE (hours_value);
114
+ }
115
+
116
+ /* 5. */
117
+ if (args_len >= 5 && ecma_is_completion_value_empty (ret_value))
118
+ {
119
+ ECMA_TRY_CATCH (minutes_value, ecma_op_to_number (args[4 ]), ret_value);
120
+ minutes = *ecma_get_number_from_value (minutes_value);
121
+ ECMA_FINALIZE (minutes_value);
122
+ }
123
+
124
+ /* 6. */
125
+ if (args_len >= 6 && ecma_is_completion_value_empty (ret_value))
126
+ {
127
+ ECMA_TRY_CATCH (seconds_value, ecma_op_to_number (args[5 ]), ret_value);
128
+ seconds = *ecma_get_number_from_value (seconds_value);
129
+ ECMA_FINALIZE (seconds_value);
130
+ }
131
+
132
+ /* 7. */
133
+ if (args_len >= 7 && ecma_is_completion_value_empty (ret_value))
134
+ {
135
+ ECMA_TRY_CATCH (milliseconds_value, ecma_op_to_number (args[6 ]), ret_value);
136
+ milliseconds = *ecma_get_number_from_value (milliseconds_value);
137
+ ECMA_FINALIZE (milliseconds_value);
138
+ }
139
+
140
+ if (ecma_is_completion_value_empty (ret_value))
141
+ {
142
+ if (!ecma_number_is_nan (year))
143
+ {
144
+ /* 8. */
145
+ int32_t y = ecma_number_to_int32 (year);
146
+
147
+ if (y >= 0 && y <= 99 )
148
+ {
149
+ year = (ecma_number_t ) (1900 + y);
150
+ }
151
+ else
152
+ {
153
+ year = (ecma_number_t ) y;
154
+ }
155
+ }
156
+
157
+ *prim_value_p = ecma_date_make_date (ecma_date_make_day (year,
158
+ month,
159
+ date),
160
+ ecma_date_make_time (hours,
161
+ minutes,
162
+ seconds,
163
+ milliseconds));
164
+ }
165
+
166
+ ECMA_FINALIZE (month_value);
167
+ ECMA_FINALIZE (year_value);
168
+
169
+ if (ecma_is_completion_value_empty (ret_value))
170
+ {
171
+ ret_value = ecma_make_normal_completion_value (ecma_make_number_value (prim_value_p));
172
+ }
173
+
174
+ return ret_value;
175
+ } /* ecma_date_construct_helper */
176
+
72
177
/* *
73
178
* The Date object's 'parse' routine
74
179
*
@@ -299,11 +404,33 @@ ecma_builtin_date_parse (ecma_value_t this_arg __attr_unused___, /**< this argum
299
404
* Returned value must be freed with ecma_free_completion_value.
300
405
*/
301
406
static ecma_completion_value_t
302
- ecma_builtin_date_utc (ecma_value_t this_arg, /* *< this argument */
407
+ ecma_builtin_date_utc (ecma_value_t this_arg __attr_unused___ , /* *< this argument */
303
408
const ecma_value_t args[], /* *< arguments list */
304
409
ecma_length_t args_number) /* *< number of arguments */
305
410
{
306
- ECMA_BUILTIN_CP_UNIMPLEMENTED (this_arg, args, args_number);
411
+ ecma_completion_value_t ret_value = ecma_make_empty_completion_value ();
412
+
413
+ if (args_number < 2 )
414
+ {
415
+ /* Note:
416
+ * When the UTC function is called with fewer than two arguments,
417
+ * the behaviour is implementation-dependent, so just return NaN.
418
+ */
419
+ ecma_number_t *nan_p = ecma_alloc_number ();
420
+ *nan_p = ecma_number_make_nan ();
421
+ return ecma_make_normal_completion_value (ecma_make_number_value (nan_p));
422
+ }
423
+
424
+ ECMA_TRY_CATCH (time_value, ecma_date_construct_helper (args, args_number), ret_value);
425
+
426
+ ecma_number_t *time_p = ecma_get_number_from_completion_value (time_value);
427
+ ecma_number_t *time_clip_p = ecma_alloc_number ();
428
+ *time_clip_p = ecma_date_time_clip (*time_p);
429
+ ret_value = ecma_make_normal_completion_value (ecma_make_number_value (time_clip_p));
430
+
431
+ ECMA_FINALIZE (time_value);
432
+
433
+ return ret_value;
307
434
} /* ecma_builtin_date_utc */
308
435
309
436
/* *
@@ -316,9 +443,16 @@ ecma_builtin_date_utc (ecma_value_t this_arg, /**< this argument */
316
443
* Returned value must be freed with ecma_free_completion_value.
317
444
*/
318
445
static ecma_completion_value_t
319
- ecma_builtin_date_now (ecma_value_t this_arg) /* *< this argument */
446
+ ecma_builtin_date_now (ecma_value_t this_arg __attr_unused___ ) /* *< this argument */
320
447
{
321
- ECMA_BUILTIN_CP_UNIMPLEMENTED (this_arg);
448
+ /*
449
+ * FIXME:
450
+ * Get the real system time. ex: gettimeofday() on Linux
451
+ * Introduce system macros at first.
452
+ */
453
+ ecma_number_t *now_num_p = ecma_alloc_number ();
454
+ *now_num_p = ECMA_NUMBER_ZERO;
455
+ return ecma_make_normal_completion_value (ecma_make_number_value (now_num_p));
322
456
} /* ecma_builtin_date_now */
323
457
324
458
/* *
0 commit comments