15
15
*/
16
16
17
17
#include " ecma-alloc.h"
18
+ #include " ecma-builtin-helpers.h"
19
+ #include " ecma-conversion.h"
18
20
#include " ecma-globals.h"
19
21
#include " ecma-helpers.h"
22
+ #include " ecma-try-catch-macro.h"
20
23
21
24
#ifndef CONFIG_ECMA_COMPACT_PROFILE_DISABLE_DATE_BUILTIN
22
25
37
40
* @{
38
41
*/
39
42
43
+ /* *
44
+ * Calculate MakeDate(MakeDay(yr, m, dt), MakeTime(h, min, s, milli)) for Date constructor and UTC
45
+ *
46
+ * See also:
47
+ * ECMA-262 v5, 15.9.3.1
48
+ * ECMA-262 v5, 15.9.4.3
49
+ *
50
+ * @return result of MakeDate(MakeDay(yr, m, dt), MakeTime(h, min, s, milli))
51
+ */
52
+ static ecma_completion_value_t
53
+ ecma_date_construct_helper (const ecma_value_t *args, /* *< arguments passed to the Date constructor */
54
+ ecma_length_t args_len) /* *< number of arguments */
55
+ {
56
+ ecma_completion_value_t ret_value = ecma_make_empty_completion_value ();
57
+ ecma_number_t *prim_value_p = ecma_alloc_number ();
58
+ *prim_value_p = ecma_number_make_nan ();
59
+
60
+ ECMA_TRY_CATCH (year_value, ecma_op_to_number (args[0 ]), ret_value);
61
+ ECMA_TRY_CATCH (month_value, ecma_op_to_number (args[1 ]), ret_value);
62
+
63
+ ecma_number_t year = *ecma_get_number_from_value (year_value);
64
+ ecma_number_t month = *ecma_get_number_from_value (month_value);
65
+ ecma_number_t date = ECMA_NUMBER_ONE;
66
+ ecma_number_t hours = ECMA_NUMBER_ZERO;
67
+ ecma_number_t minutes = ECMA_NUMBER_ZERO;
68
+ ecma_number_t seconds = ECMA_NUMBER_ZERO;
69
+ ecma_number_t milliseconds = ECMA_NUMBER_ZERO;
70
+
71
+ if (args_len >= 3 && ecma_is_completion_value_empty (ret_value))
72
+ {
73
+ ECMA_TRY_CATCH (date_value, ecma_op_to_number (args[2 ]), ret_value);
74
+ date = *ecma_get_number_from_value (date_value);
75
+ ECMA_FINALIZE (date_value);
76
+ }
77
+
78
+ if (args_len >= 4 && ecma_is_completion_value_empty (ret_value))
79
+ {
80
+ ECMA_TRY_CATCH (hours_value, ecma_op_to_number (args[3 ]), ret_value);
81
+ hours = *ecma_get_number_from_value (hours_value);
82
+ ECMA_FINALIZE (hours_value);
83
+ }
84
+
85
+ if (args_len >= 5 && ecma_is_completion_value_empty (ret_value))
86
+ {
87
+ ECMA_TRY_CATCH (minutes_value, ecma_op_to_number (args[4 ]), ret_value);
88
+ minutes = *ecma_get_number_from_value (minutes_value);
89
+ ECMA_FINALIZE (minutes_value);
90
+ }
91
+
92
+ if (args_len >= 6 && ecma_is_completion_value_empty (ret_value))
93
+ {
94
+ ECMA_TRY_CATCH (seconds_value, ecma_op_to_number (args[5 ]), ret_value);
95
+ seconds = *ecma_get_number_from_value (seconds_value);
96
+ ECMA_FINALIZE (seconds_value);
97
+ }
98
+
99
+ if (args_len >= 7 && ecma_is_completion_value_empty (ret_value))
100
+ {
101
+ ECMA_TRY_CATCH (milliseconds_value, ecma_op_to_number (args[6 ]), ret_value);
102
+ milliseconds = *ecma_get_number_from_value (milliseconds_value);
103
+ ECMA_FINALIZE (milliseconds_value);
104
+ }
105
+
106
+ if (ecma_is_completion_value_empty (ret_value))
107
+ {
108
+ if (!ecma_number_is_nan (year))
109
+ {
110
+ int32_t y = ecma_number_to_int32 (year);
111
+ if (y >= 0 && y <= 99 )
112
+ {
113
+ year = (ecma_number_t ) (1900 + y);
114
+ }
115
+ else
116
+ {
117
+ year = (ecma_number_t ) y;
118
+ }
119
+ }
120
+
121
+ *prim_value_p = ecma_date_make_date (ecma_date_make_day (year,
122
+ month,
123
+ date),
124
+ ecma_date_make_time (hours,
125
+ minutes,
126
+ seconds,
127
+ milliseconds));
128
+ }
129
+
130
+ ECMA_FINALIZE (month_value);
131
+ ECMA_FINALIZE (year_value);
132
+
133
+ if (ecma_is_completion_value_empty (ret_value))
134
+ {
135
+ ret_value = ecma_make_normal_completion_value (ecma_make_number_value (prim_value_p));
136
+ }
137
+
138
+ return ret_value;
139
+ }
140
+
40
141
/* *
41
142
* The Date object's 'parse' routine
42
143
*
43
144
* See also:
44
145
* ECMA-262 v5, 15.9.4.2
146
+ * ECMA-262 v5, 15.9.1.15
45
147
*
46
148
* @return completion value
47
149
* Returned value must be freed with ecma_free_completion_value.
@@ -63,11 +165,33 @@ ecma_builtin_date_parse (ecma_value_t this_arg, /**< this argument */
63
165
* Returned value must be freed with ecma_free_completion_value.
64
166
*/
65
167
static ecma_completion_value_t
66
- ecma_builtin_date_utc (ecma_value_t this_arg, /* *< this argument */
168
+ ecma_builtin_date_utc (ecma_value_t this_arg __attr_unused___ , /* *< this argument */
67
169
const ecma_value_t args[], /* *< arguments list */
68
170
ecma_length_t args_number) /* *< number of arguments */
69
171
{
70
- ECMA_BUILTIN_CP_UNIMPLEMENTED (this_arg, args, args_number);
172
+ ecma_completion_value_t ret_value = ecma_make_empty_completion_value ();
173
+
174
+ if (args_number < 2 )
175
+ {
176
+ /* Note:
177
+ * When the UTC function is called with fewer than two arguments,
178
+ * the behaviour is implementation-dependent, so just return NaN.
179
+ */
180
+ ecma_number_t *nan = ecma_alloc_number ();
181
+ *nan = ecma_number_make_nan ();
182
+ return ecma_make_normal_completion_value (ecma_make_number_value (nan));
183
+ }
184
+
185
+ ECMA_TRY_CATCH (time_value, ecma_date_construct_helper (args, args_number), ret_value);
186
+
187
+ ecma_number_t *time_p = ecma_get_number_from_completion_value (time_value);
188
+ ecma_number_t *time_clip = ecma_alloc_number ();
189
+ *time_clip = ecma_date_time_clip (*time_p);
190
+ ret_value = ecma_make_normal_completion_value (ecma_make_number_value (time_clip));
191
+
192
+ ECMA_FINALIZE (time_value);
193
+
194
+ return ret_value;
71
195
} /* ecma_builtin_date_utc */
72
196
73
197
/* *
@@ -80,9 +204,16 @@ ecma_builtin_date_utc (ecma_value_t this_arg, /**< this argument */
80
204
* Returned value must be freed with ecma_free_completion_value.
81
205
*/
82
206
static ecma_completion_value_t
83
- ecma_builtin_date_now (ecma_value_t this_arg) /* *< this argument */
207
+ ecma_builtin_date_now (ecma_value_t this_arg __attr_unused___ ) /* *< this argument */
84
208
{
85
- ECMA_BUILTIN_CP_UNIMPLEMENTED (this_arg);
209
+ /*
210
+ * FIXME:
211
+ * Get the real system time. ex: gettimeofday() on Linux
212
+ * Introduce system macros at first.
213
+ */
214
+ ecma_number_t *now_num_p = ecma_alloc_number ();
215
+ *now_num_p = ECMA_NUMBER_ZERO;
216
+ return ecma_make_normal_completion_value (ecma_make_number_value (now_num_p));
86
217
} /* ecma_builtin_date_now */
87
218
88
219
/* *
0 commit comments