Skip to content

Commit 2684642

Browse files
committed
Fix UTF-8 string iteration in Date.parse after rebase
JerryScript-DCO-1.0-Signed-off-by: László Langó llango.u-szeged@partner.samsung.com
1 parent 5b37779 commit 2684642

File tree

1 file changed

+71
-63
lines changed

1 file changed

+71
-63
lines changed

jerry-core/ecma/builtin-objects/ecma-builtin-date.cpp

Lines changed: 71 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -46,22 +46,30 @@
4646
* @return NaN if cannot read from string, ToNumber() otherwise
4747
*/
4848
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 */
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

Comments
 (0)