4646 * @return NaN if cannot read from string, ToNumber() otherwise
4747 */
4848static 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 */
5250 uint32_t num_of_chars) /* *< number of characters to read and convert */
5351{
5452 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 ;
5755
58- if ((date_str_size - num_of_visited_chars) >= num_of_chars)
56+ while ( num_of_chars-- )
5957 {
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);
6171 ret_value = ecma_string_to_number (str_p);
6272 ecma_deref_ecma_string (str_p);
63-
64- *date_char_p += num_of_chars * sizeof (lit_utf8_byte_t );
6573 }
6674
6775 return ret_value;
@@ -84,43 +92,37 @@ ecma_builtin_date_parse (ecma_value_t this_arg __attr_unused___, /**< this argum
8492 ecma_completion_value_t ret_value = ecma_make_empty_completion_value ();
8593 ecma_number_t *date_num_p = ecma_alloc_number ();
8694 *date_num_p = ecma_number_make_nan ();
87- ecma_number_t time = ECMA_NUMBER_ZERO;
8895
8996 /* Date Time String fromat (ECMA-262 v5, 15.9.1.15) */
90- ecma_string_t *date_str_p;
9197 ECMA_TRY_CATCH (date_str_value,
9298 ecma_op_to_string (arg),
9399 ret_value);
94100
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);
96102
97103 lit_utf8_size_t date_str_size = ecma_string_get_size (date_str_p);
98104 MEM_DEFINE_LOCAL_ARRAY (date_start_p, date_str_size, lit_utf8_byte_t );
99105
100106 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);
111108
112109 /* 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 );
114111
115- if (year >= 0 )
112+ if (!ecma_number_is_nan (year)
113+ && year >= 0 )
116114 {
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+
117119 /* 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) == ' -' )
120122 {
121123 /* 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 );
124126
125127 if (month > 12 || month < 1 )
126128 {
@@ -129,12 +131,12 @@ ecma_builtin_date_parse (ecma_value_t this_arg __attr_unused___, /**< this argum
129131 }
130132
131133 /* 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) == ' -' )
134136 {
135137 /* 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 );
138140
139141 if (day < 1 || day > 31 )
140142 {
@@ -143,19 +145,24 @@ ecma_builtin_date_parse (ecma_value_t this_arg __attr_unused___, /**< this argum
143145 }
144146
145147 /* 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' )
148150 {
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;
151155
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 )
153160 {
154161 /* eat up 'T' */
155- date_char_p += sizeof ( lit_utf8_byte_t );
162+ lit_utf8_iterator_incr (&iter );
156163
157164 /* 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 );
159166
160167 if (hours < 0 || hours > 24 )
161168 {
@@ -167,33 +174,33 @@ ecma_builtin_date_parse (ecma_value_t this_arg __attr_unused___, /**< this argum
167174 }
168175
169176 /* eat up ':' */
170- date_char_p += sizeof ( lit_utf8_byte_t );
177+ lit_utf8_iterator_incr (&iter );
171178
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 );
173180
174181 if (minutes < 0 || minutes > 59 )
175182 {
176183 minutes = ecma_number_make_nan ();
177184 }
178185
179186 /* 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) == ' :' )
181188 {
182189 /* 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 );
185192
186193 if (seconds < 0 || seconds > 59 )
187194 {
188195 seconds = ecma_number_make_nan ();
189196 }
190197
191198 /* 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) == ' .' )
193200 {
194201 /* 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 );
197204
198205 if (milliseconds < 0 )
199206 {
@@ -210,36 +217,37 @@ ecma_builtin_date_parse (ecma_value_t this_arg __attr_unused___, /**< this argum
210217 }
211218
212219 /* 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'
215222 && !ecma_number_is_nan (time))
216223 {
217- date_char_p += sizeof ( lit_utf8_byte_t );
224+ lit_utf8_iterator_incr (&iter );
218225 time = ecma_date_utc (ecma_date_make_time (hours,
219226 minutes,
220227 seconds,
221228 milliseconds));
222229 }
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) == ' -' ))
225233 {
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 ;
228236
229- if ((date_str_size - num_of_visited_chars) >= 6 )
237+ if ((date_str_len - num_of_visited_chars) == 5 )
230238 {
231239 bool is_negative = false ;
232240
233- if (*date_char_p == ' -' )
241+ if (lit_utf8_iterator_peek_next (&iter) == ' -' )
234242 {
235243 is_negative = true ;
236244 }
237245
238246 /* eat up '+/-' */
239- date_char_p += sizeof ( lit_utf8_byte_t );
247+ lit_utf8_iterator_incr (&iter );
240248
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 );
243251
244252 if (hours < 0 || hours > 24 )
245253 {
@@ -251,9 +259,9 @@ ecma_builtin_date_parse (ecma_value_t this_arg __attr_unused___, /**< this argum
251259 }
252260
253261 /* eat up ':' */
254- date_char_p += sizeof ( lit_utf8_byte_t );
262+ lit_utf8_iterator_incr (&iter );
255263
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 );
257265
258266 if (minutes < 0 || minutes > 59 )
259267 {
@@ -272,13 +280,13 @@ ecma_builtin_date_parse (ecma_value_t this_arg __attr_unused___, /**< this argum
272280 }
273281 }
274282
275- if (date_str_size == ( lit_utf8_size_t ) (date_char_p - date_start_p ))
283+ if (lit_utf8_iterator_is_eos (&iter ))
276284 {
277285 ecma_number_t date = ecma_date_make_day (year, month - 1 , day);
278286 *date_num_p = ecma_date_make_date (date, time);
279287 }
280-
281288 }
289+
282290 ret_value = ecma_make_normal_completion_value (ecma_make_number_value (date_num_p));
283291
284292 MEM_FINALIZE_LOCAL_ARRAY (date_start_p);
0 commit comments