46
46
* @return NaN if cannot read from string, ToNumber() otherwise
47
47
*/
48
48
static ecma_number_t
49
- ecma_date_parse_date_chars (lit_utf8_byte_t *date_start_p, /* *< start pointer of the utf8 string */
50
- lit_utf8_byte_t **date_char_p, /* *< current pointer of the utf8 string */
51
- lit_utf8_size_t date_str_size, /* *< size of the utf8 string */
49
+ ecma_date_parse_date_chars (lit_utf8_iterator_t *iter, /* *< iterator of the utf8 string */
52
50
uint32_t num_of_chars) /* *< number of characters to read and convert */
53
51
{
54
52
ecma_number_t ret_value = ecma_number_make_nan ();
55
- JERRY_ASSERT ((*date_char_p - date_start_p) > = 0 ) ;
56
- uint32_t num_of_visited_chars = ( uint32_t ) (*date_char_p - date_start_p) ;
53
+ lit_utf8_size_t copy_size = 0 ;
54
+ const lit_utf8_byte_t *str_start_p = iter-> buf_p + iter-> buf_pos . offset ;
57
55
58
- if ((date_str_size - num_of_visited_chars) >= num_of_chars)
56
+ while ( num_of_chars-- )
59
57
{
60
- ecma_string_t *str_p = ecma_new_ecma_string_from_utf8 (*date_char_p, num_of_chars);
58
+ if (lit_utf8_iterator_is_eos (iter))
59
+ {
60
+ copy_size = 0 ;
61
+ break ;
62
+ }
63
+
64
+ copy_size += lit_get_unicode_char_size_by_utf8_first_byte (*iter->buf_p );
65
+ lit_utf8_iterator_incr (iter);
66
+ }
67
+
68
+ if (copy_size > 0 )
69
+ {
70
+ ecma_string_t *str_p = ecma_new_ecma_string_from_utf8 (str_start_p, copy_size);
61
71
ret_value = ecma_string_to_number (str_p);
62
72
ecma_deref_ecma_string (str_p);
63
-
64
- *date_char_p += num_of_chars * sizeof (lit_utf8_byte_t );
65
73
}
66
74
67
75
return ret_value;
@@ -84,43 +92,37 @@ ecma_builtin_date_parse (ecma_value_t this_arg __attr_unused___, /**< this argum
84
92
ecma_completion_value_t ret_value = ecma_make_empty_completion_value ();
85
93
ecma_number_t *date_num_p = ecma_alloc_number ();
86
94
*date_num_p = ecma_number_make_nan ();
87
- ecma_number_t time = ECMA_NUMBER_ZERO;
88
95
89
96
/* Date Time String fromat (ECMA-262 v5, 15.9.1.15) */
90
- ecma_string_t *date_str_p;
91
97
ECMA_TRY_CATCH (date_str_value,
92
98
ecma_op_to_string (arg),
93
99
ret_value);
94
100
95
- date_str_p = ecma_get_string_from_value (date_str_value);
101
+ ecma_string_t * date_str_p = ecma_get_string_from_value (date_str_value);
96
102
97
103
lit_utf8_size_t date_str_size = ecma_string_get_size (date_str_p);
98
104
MEM_DEFINE_LOCAL_ARRAY (date_start_p, date_str_size, lit_utf8_byte_t );
99
105
100
106
ecma_string_to_utf8_string (date_str_p, date_start_p, (ssize_t ) date_str_size);
101
-
102
- lit_utf8_byte_t *date_char_p = date_start_p;
103
-
104
- ecma_number_t year;
105
- ecma_number_t month = ECMA_NUMBER_ONE;
106
- ecma_number_t day = ECMA_NUMBER_ONE;
107
- ecma_number_t hours = ECMA_NUMBER_ZERO;
108
- ecma_number_t minutes = ECMA_NUMBER_ZERO;
109
- ecma_number_t seconds = ECMA_NUMBER_ZERO;
110
- ecma_number_t milliseconds = ECMA_NUMBER_ZERO;
107
+ lit_utf8_iterator_t iter = lit_utf8_iterator_create (date_start_p, date_str_size);
111
108
112
109
/* 1. read year */
113
- year = ecma_date_parse_date_chars (date_start_p, &date_char_p, date_str_size , 4 );
110
+ ecma_number_t year = ecma_date_parse_date_chars (&iter , 4 );
114
111
115
- if (year >= 0 )
112
+ if (!ecma_number_is_nan (year)
113
+ && year >= 0 )
116
114
{
115
+ ecma_number_t month = ECMA_NUMBER_ONE;
116
+ ecma_number_t day = ECMA_NUMBER_ONE;
117
+ ecma_number_t time = ECMA_NUMBER_ZERO;
118
+
117
119
/* 2. read month if any */
118
- if (date_str_size != ( lit_utf8_size_t ) (date_char_p - date_start_p )
119
- && *date_char_p == ' -' )
120
+ if (! lit_utf8_iterator_is_eos (&iter )
121
+ && lit_utf8_iterator_peek_next (&iter) == ' -' )
120
122
{
121
123
/* eat up '-' */
122
- date_char_p += sizeof ( lit_utf8_byte_t );
123
- month = ecma_date_parse_date_chars (date_start_p, &date_char_p, date_str_size , 2 );
124
+ lit_utf8_iterator_incr (&iter );
125
+ month = ecma_date_parse_date_chars (&iter , 2 );
124
126
125
127
if (month > 12 || month < 1 )
126
128
{
@@ -129,12 +131,12 @@ ecma_builtin_date_parse (ecma_value_t this_arg __attr_unused___, /**< this argum
129
131
}
130
132
131
133
/* 3. read day if any */
132
- if (date_str_size != ( lit_utf8_size_t ) (date_char_p - date_start_p )
133
- && *date_char_p == ' -' )
134
+ if (! lit_utf8_iterator_is_eos (&iter )
135
+ && lit_utf8_iterator_peek_next (&iter) == ' -' )
134
136
{
135
137
/* eat up '-' */
136
- date_char_p += sizeof ( lit_utf8_byte_t );
137
- day = ecma_date_parse_date_chars (date_start_p, &date_char_p, date_str_size , 2 );
138
+ lit_utf8_iterator_incr (&iter );
139
+ day = ecma_date_parse_date_chars (&iter , 2 );
138
140
139
141
if (day < 1 || day > 31 )
140
142
{
@@ -143,19 +145,24 @@ ecma_builtin_date_parse (ecma_value_t this_arg __attr_unused___, /**< this argum
143
145
}
144
146
145
147
/* 4. read time if any */
146
- if (date_str_size != ( lit_utf8_size_t ) (date_char_p - date_start_p )
147
- && *date_char_p == ' T' )
148
+ if (! lit_utf8_iterator_is_eos (&iter )
149
+ && lit_utf8_iterator_peek_next (&iter) == ' T' )
148
150
{
149
- JERRY_ASSERT ((date_char_p - date_start_p) >= 0 );
150
- uint32_t num_of_visited_chars = (uint32_t ) (date_char_p - date_start_p);
151
+ ecma_number_t hours = ECMA_NUMBER_ZERO;
152
+ ecma_number_t minutes = ECMA_NUMBER_ZERO;
153
+ ecma_number_t seconds = ECMA_NUMBER_ZERO;
154
+ ecma_number_t milliseconds = ECMA_NUMBER_ZERO;
151
155
152
- if ((date_str_size - num_of_visited_chars) >= 5 )
156
+ ecma_length_t num_of_visited_chars = lit_utf8_iterator_get_index (&iter);
157
+ ecma_length_t date_str_len = lit_utf8_string_length (iter.buf_p , iter.buf_size ) - 1 ;
158
+
159
+ if ((date_str_len - num_of_visited_chars) >= 5 )
153
160
{
154
161
/* eat up 'T' */
155
- date_char_p += sizeof ( lit_utf8_byte_t );
162
+ lit_utf8_iterator_incr (&iter );
156
163
157
164
/* 4.1 read hours and minutes */
158
- hours = ecma_date_parse_date_chars (date_start_p, &date_char_p, date_str_size , 2 );
165
+ hours = ecma_date_parse_date_chars (&iter , 2 );
159
166
160
167
if (hours < 0 || hours > 24 )
161
168
{
@@ -167,33 +174,33 @@ ecma_builtin_date_parse (ecma_value_t this_arg __attr_unused___, /**< this argum
167
174
}
168
175
169
176
/* eat up ':' */
170
- date_char_p += sizeof ( lit_utf8_byte_t );
177
+ lit_utf8_iterator_incr (&iter );
171
178
172
- minutes = ecma_date_parse_date_chars (date_start_p, &date_char_p, date_str_size , 2 );
179
+ minutes = ecma_date_parse_date_chars (&iter , 2 );
173
180
174
181
if (minutes < 0 || minutes > 59 )
175
182
{
176
183
minutes = ecma_number_make_nan ();
177
184
}
178
185
179
186
/* 4.2 read seconds if any */
180
- if (date_str_size != ( lit_utf8_size_t ) (date_char_p - date_start_p) && *date_char_p == ' :' )
187
+ if (! lit_utf8_iterator_is_eos (&iter) && lit_utf8_iterator_peek_next (&iter) == ' :' )
181
188
{
182
189
/* eat up ':' */
183
- date_char_p += sizeof ( lit_utf8_byte_t );
184
- seconds = ecma_date_parse_date_chars (date_start_p, &date_char_p, date_str_size , 2 );
190
+ lit_utf8_iterator_incr (&iter );
191
+ seconds = ecma_date_parse_date_chars (&iter , 2 );
185
192
186
193
if (seconds < 0 || seconds > 59 )
187
194
{
188
195
seconds = ecma_number_make_nan ();
189
196
}
190
197
191
198
/* 4.3 read milliseconds if any */
192
- if (date_str_size != ( lit_utf8_size_t ) (date_char_p - date_start_p) && *date_char_p == ' .' )
199
+ if (! lit_utf8_iterator_is_eos (&iter) && lit_utf8_iterator_peek_next (&iter) == ' .' )
193
200
{
194
201
/* eat up '.' */
195
- date_char_p += sizeof ( lit_utf8_byte_t );
196
- milliseconds = ecma_date_parse_date_chars (date_start_p, &date_char_p, date_str_size , 3 );
202
+ lit_utf8_iterator_incr (&iter );
203
+ milliseconds = ecma_date_parse_date_chars (&iter , 3 );
197
204
198
205
if (milliseconds < 0 )
199
206
{
@@ -210,36 +217,37 @@ ecma_builtin_date_parse (ecma_value_t this_arg __attr_unused___, /**< this argum
210
217
}
211
218
212
219
/* 4.4 read timezone if any */
213
- if (date_str_size != ( lit_utf8_size_t ) (date_char_p - date_start_p )
214
- && *date_char_p == ' Z'
220
+ if (! lit_utf8_iterator_is_eos (&iter )
221
+ && lit_utf8_iterator_peek_next (&iter) == ' Z'
215
222
&& !ecma_number_is_nan (time))
216
223
{
217
- date_char_p += sizeof ( lit_utf8_byte_t );
224
+ lit_utf8_iterator_incr (&iter );
218
225
time = ecma_date_utc (ecma_date_make_time (hours,
219
226
minutes,
220
227
seconds,
221
228
milliseconds));
222
229
}
223
- else if (date_str_size != (lit_utf8_size_t ) (date_char_p - date_start_p)
224
- && (*date_char_p == ' +' || *date_char_p == ' -' ))
230
+ else if (!lit_utf8_iterator_is_eos (&iter)
231
+ && (lit_utf8_iterator_peek_next (&iter) == ' +'
232
+ || lit_utf8_iterator_peek_next (&iter) == ' -' ))
225
233
{
226
- JERRY_ASSERT ((date_char_p - date_start_p) >= 0 );
227
- uint32_t num_of_visited_chars = ( uint32_t ) (date_char_p - date_start_p) ;
234
+ ecma_length_t num_of_visited_chars = lit_utf8_iterator_get_index (&iter );
235
+ ecma_length_t date_str_len = lit_utf8_string_length (iter. buf_p , iter. buf_size ) - 1 ;
228
236
229
- if ((date_str_size - num_of_visited_chars) >= 6 )
237
+ if ((date_str_len - num_of_visited_chars) == 5 )
230
238
{
231
239
bool is_negative = false ;
232
240
233
- if (*date_char_p == ' -' )
241
+ if (lit_utf8_iterator_peek_next (&iter) == ' -' )
234
242
{
235
243
is_negative = true ;
236
244
}
237
245
238
246
/* eat up '+/-' */
239
- date_char_p += sizeof ( lit_utf8_byte_t );
247
+ lit_utf8_iterator_incr (&iter );
240
248
241
- /* 4.1 read hours and minutes */
242
- hours = ecma_date_parse_date_chars (date_start_p, &date_char_p, date_str_size , 2 );
249
+ /* read hours and minutes */
250
+ hours = ecma_date_parse_date_chars (&iter , 2 );
243
251
244
252
if (hours < 0 || hours > 24 )
245
253
{
@@ -251,9 +259,9 @@ ecma_builtin_date_parse (ecma_value_t this_arg __attr_unused___, /**< this argum
251
259
}
252
260
253
261
/* eat up ':' */
254
- date_char_p += sizeof ( lit_utf8_byte_t );
262
+ lit_utf8_iterator_incr (&iter );
255
263
256
- minutes = ecma_date_parse_date_chars (date_start_p, &date_char_p, date_str_size , 2 );
264
+ minutes = ecma_date_parse_date_chars (&iter , 2 );
257
265
258
266
if (minutes < 0 || minutes > 59 )
259
267
{
@@ -272,13 +280,13 @@ ecma_builtin_date_parse (ecma_value_t this_arg __attr_unused___, /**< this argum
272
280
}
273
281
}
274
282
275
- if (date_str_size == ( lit_utf8_size_t ) (date_char_p - date_start_p ))
283
+ if (lit_utf8_iterator_is_eos (&iter ))
276
284
{
277
285
ecma_number_t date = ecma_date_make_day (year, month - 1 , day);
278
286
*date_num_p = ecma_date_make_date (date, time);
279
287
}
280
-
281
288
}
289
+
282
290
ret_value = ecma_make_normal_completion_value (ecma_make_number_value (date_num_p));
283
291
284
292
MEM_FINALIZE_LOCAL_ARRAY (date_start_p);
0 commit comments