23
23
#include " ecma-globals.h"
24
24
#include " ecma-helpers.h"
25
25
#include " jrt-libc-includes.h"
26
+ #include " lit-magic-strings.h"
26
27
27
28
/*
28
29
* \addtogroup ecmahelpersbigintegers Helpers for operations intermediate 128-bit integers
325
326
*/
326
327
327
328
/* *
328
- * ECMA-defined conversion of string (zero-terminated) to Number.
329
+ * ECMA-defined conversion of string to Number.
329
330
*
330
331
* See also:
331
332
* ECMA-262 v5, 9.3.1
332
333
*
333
334
* @return ecma-number
334
335
*/
335
336
ecma_number_t
336
- ecma_zt_string_to_number (const ecma_char_t *str_p) /* *< zero-terminated string */
337
+ ecma_utf8_string_to_number (const lit_utf8_byte_t *str_p, /* *< utf-8 string */
338
+ lit_utf8_size_t str_size) /* *< string size */
337
339
{
338
340
TODO (Check license issues);
339
341
340
- const ecma_char_t dec_digits_range[10 ] = { ' 0' , ' 9' };
341
- const ecma_char_t hex_lower_digits_range[10 ] = { ' a' , ' f' };
342
- const ecma_char_t hex_upper_digits_range[10 ] = { ' A' , ' F' };
343
- const ecma_char_t hex_x_chars[2 ] = { ' x' , ' X' };
344
- const ecma_char_t white_space[2 ] = { ' ' , ' \n ' };
345
- const ecma_char_t e_chars[2 ] = { ' e' , ' E' };
346
- const ecma_char_t plus_char = ' +' ;
347
- const ecma_char_t minus_char = ' -' ;
348
- const ecma_char_t dot_char = ' .' ;
349
-
350
- const ecma_char_t *begin_p = str_p;
351
- const ecma_char_t *end_p = begin_p;
352
-
353
- while (*end_p != ECMA_CHAR_NULL)
342
+ const lit_utf8_byte_t dec_digits_range[10 ] = { ' 0' , ' 9' };
343
+ const lit_utf8_byte_t hex_lower_digits_range[10 ] = { ' a' , ' f' };
344
+ const lit_utf8_byte_t hex_upper_digits_range[10 ] = { ' A' , ' F' };
345
+ const lit_utf8_byte_t hex_x_chars[2 ] = { ' x' , ' X' };
346
+ const lit_utf8_byte_t white_space[2 ] = { ' ' , ' \n ' };
347
+ const lit_utf8_byte_t e_chars[2 ] = { ' e' , ' E' };
348
+ const lit_utf8_byte_t plus_char = ' +' ;
349
+ const lit_utf8_byte_t minus_char = ' -' ;
350
+ const lit_utf8_byte_t dot_char = ' .' ;
351
+
352
+ if (str_size == 0 )
354
353
{
355
- end_p++ ;
354
+ return ECMA_NUMBER_ZERO ;
356
355
}
357
- end_p--;
356
+
357
+ const lit_utf8_byte_t *begin_p = str_p;
358
+ const lit_utf8_byte_t *end_p = begin_p + str_size - 1 ;
358
359
359
360
while (begin_p <= end_p
360
361
&& (*begin_p == white_space[0 ]
@@ -387,7 +388,7 @@ ecma_zt_string_to_number (const ecma_char_t *str_p) /**< zero-terminated string
387
388
388
389
ecma_number_t num = 0 ;
389
390
390
- for (const ecma_char_t * iter_p = begin_p;
391
+ for (const lit_utf8_byte_t * iter_p = begin_p;
391
392
iter_p <= end_p;
392
393
iter_p++)
393
394
{
@@ -438,9 +439,9 @@ ecma_zt_string_to_number (const ecma_char_t *str_p) /**< zero-terminated string
438
439
}
439
440
440
441
/* Checking if significant part of parse string is equal to "Infinity" */
441
- const ecma_char_t *infinity_zt_str_p = lit_get_magic_string_zt (LIT_MAGIC_STRING_INFINITY_UL);
442
+ const lit_utf8_byte_t *infinity_zt_str_p = lit_get_magic_string_utf8 (LIT_MAGIC_STRING_INFINITY_UL);
442
443
443
- for (const ecma_char_t *iter_p = begin_p, *iter_infinity_p = infinity_zt_str_p;
444
+ for (const lit_utf8_byte_t *iter_p = begin_p, *iter_infinity_p = infinity_zt_str_p;
444
445
;
445
446
iter_infinity_p++, iter_p++)
446
447
{
@@ -750,7 +751,7 @@ ecma_zt_string_to_number (const ecma_char_t *str_p) /**< zero-terminated string
750
751
751
752
return num;
752
753
#endif /* CONFIG_ECMA_NUMBER_TYPE == CONFIG_ECMA_NUMBER_FLOAT32 */
753
- } /* ecma_zt_string_to_number */
754
+ } /* ecma_utf8_string_to_number */
754
755
755
756
/* *
756
757
* ECMA-defined conversion of UInt32 to String (zero-terminated).
@@ -761,16 +762,14 @@ ecma_zt_string_to_number (const ecma_char_t *str_p) /**< zero-terminated string
761
762
* @return number of bytes copied to buffer
762
763
*/
763
764
ssize_t
764
- ecma_uint32_to_string (uint32_t value, /* *< value to convert */
765
- ecma_char_t *out_buffer_p, /* *< buffer for zero-terminated string */
766
- ssize_t buffer_size) /* *< size of buffer */
765
+ ecma_uint32_to_utf8_string (uint32_t value, /* *< value to convert */
766
+ lit_utf8_byte_t *out_buffer_p, /* *< buffer for string */
767
+ ssize_t buffer_size) /* *< size of buffer */
767
768
{
768
- const ecma_char_t digits[10 ] = { ' 0' , ' 1' , ' 2' , ' 3' , ' 4' , ' 5' , ' 6' , ' 7' , ' 8' , ' 9' };
769
+ const lit_utf8_byte_t digits[10 ] = { ' 0' , ' 1' , ' 2' , ' 3' , ' 4' , ' 5' , ' 6' , ' 7' , ' 8' , ' 9' };
769
770
770
- ecma_char_t *p = (ecma_char_t *) ((uint8_t *) out_buffer_p + buffer_size) - 1 ;
771
- *p-- = ECMA_CHAR_NULL;
772
-
773
- size_t bytes_copied = sizeof (ecma_char_t );
771
+ lit_utf8_byte_t *p = out_buffer_p + buffer_size - 1 ;
772
+ size_t bytes_copied = 0 ;
774
773
775
774
do
776
775
{
@@ -779,7 +778,7 @@ ecma_uint32_to_string (uint32_t value, /**< value to convert */
779
778
*p-- = digits[value % 10 ];
780
779
value /= 10 ;
781
780
782
- bytes_copied += sizeof ( ecma_char_t ) ;
781
+ bytes_copied ++ ;
783
782
}
784
783
while (value != 0 );
785
784
@@ -789,12 +788,12 @@ ecma_uint32_to_string (uint32_t value, /**< value to convert */
789
788
790
789
if (likely (p != out_buffer_p))
791
790
{
792
- ssize_t bytes_to_move = (( uint8_t *) out_buffer_p + buffer_size) - ( uint8_t *) p;
791
+ ssize_t bytes_to_move = out_buffer_p + buffer_size - p;
793
792
memmove (out_buffer_p, p, (size_t ) bytes_to_move);
794
793
}
795
794
796
795
return (ssize_t ) bytes_copied;
797
- } /* ecma_uint32_to_string */
796
+ } /* ecma_uint32_to_utf8_string */
798
797
799
798
/* *
800
799
* ECMA-defined conversion of UInt32 value to Number value
@@ -1299,51 +1298,50 @@ ecma_number_to_decimal (ecma_number_t num, /**< ecma-number */
1299
1298
* ECMA-262 v5, 9.8.1
1300
1299
*
1301
1300
*
1302
- * @return length of zt- string
1301
+ * @return size of utf-8 string
1303
1302
*/
1304
- ecma_length_t
1305
- ecma_number_to_zt_string (ecma_number_t num, /* *< ecma-number */
1306
- ecma_char_t *buffer_p, /* *< buffer for zt- string */
1307
- ssize_t buffer_size) /* *< size of buffer */
1303
+ lit_utf8_size_t
1304
+ ecma_number_to_utf8_string (ecma_number_t num, /* *< ecma-number */
1305
+ lit_utf8_byte_t *buffer_p, /* *< buffer for utf-8 string */
1306
+ ssize_t buffer_size) /* *< size of buffer */
1308
1307
{
1309
- const ecma_char_t digits[10 ] = { ' 0' , ' 1' , ' 2' , ' 3' , ' 4' , ' 5' , ' 6' , ' 7' , ' 8' , ' 9' };
1310
- const ecma_char_t e_chars[2 ] = { ' e' , ' E' };
1311
- const ecma_char_t plus_char = ' +' ;
1312
- const ecma_char_t minus_char = ' -' ;
1313
- const ecma_char_t dot_char = ' .' ;
1308
+ const lit_utf8_byte_t digits[10 ] = { ' 0' , ' 1' , ' 2' , ' 3' , ' 4' , ' 5' , ' 6' , ' 7' , ' 8' , ' 9' };
1309
+ const lit_utf8_byte_t e_chars[2 ] = { ' e' , ' E' };
1310
+ const lit_utf8_byte_t plus_char = ' +' ;
1311
+ const lit_utf8_byte_t minus_char = ' -' ;
1312
+ const lit_utf8_byte_t dot_char = ' .' ;
1313
+ lit_utf8_size_t size;
1314
1314
1315
1315
if (ecma_number_is_nan (num))
1316
1316
{
1317
1317
// 1.
1318
- ecma_copy_zt_string_to_buffer (lit_get_magic_string_zt (LIT_MAGIC_STRING_NAN),
1319
- buffer_p,
1320
- buffer_size);
1318
+ lit_copy_magic_string_to_buffer (LIT_MAGIC_STRING_NAN, buffer_p, buffer_size);
1319
+ size = lit_get_magic_string_size (LIT_MAGIC_STRING_NAN);
1321
1320
}
1322
1321
else
1323
1322
{
1324
- ecma_char_t *dst_p = buffer_p;
1323
+ lit_utf8_byte_t *dst_p = buffer_p;
1325
1324
1326
1325
if (ecma_number_is_zero (num))
1327
1326
{
1328
1327
// 2.
1329
1328
*dst_p++ = digits[0 ];
1330
- *dst_p++ = ECMA_CHAR_NULL;
1331
1329
1332
- JERRY_ASSERT ((uint8_t *)dst_p - (uint8_t *)buffer_p <= (ssize_t ) buffer_size);
1330
+ JERRY_ASSERT (dst_p - buffer_p <= (ssize_t ) buffer_size);
1331
+ size = (lit_utf8_size_t ) (dst_p - buffer_p);
1333
1332
}
1334
1333
else if (ecma_number_is_negative (num))
1335
1334
{
1336
1335
// 3.
1337
1336
*dst_p++ = minus_char;
1338
- ssize_t new_buffer_size = (buffer_size - (( uint8_t *) dst_p - ( uint8_t *) buffer_p));
1339
- ecma_number_to_zt_string (ecma_number_negate (num), dst_p, new_buffer_size);
1337
+ ssize_t new_buffer_size = (buffer_size - (dst_p - buffer_p));
1338
+ size = 1 + ecma_number_to_utf8_string (ecma_number_negate (num), dst_p, new_buffer_size);
1340
1339
}
1341
1340
else if (ecma_number_is_infinity (num))
1342
1341
{
1343
1342
// 4.
1344
- ecma_copy_zt_string_to_buffer (lit_get_magic_string_zt (LIT_MAGIC_STRING_INFINITY_UL),
1345
- buffer_p,
1346
- buffer_size);
1343
+ dst_p = lit_copy_magic_string_to_buffer (LIT_MAGIC_STRING_INFINITY_UL, buffer_p, buffer_size);
1344
+ size = (lit_utf8_size_t ) (dst_p - buffer_p);
1347
1345
}
1348
1346
else
1349
1347
{
@@ -1355,7 +1353,7 @@ ecma_number_to_zt_string (ecma_number_t num, /**< ecma-number */
1355
1353
uint32_t num_uint32 = ecma_number_to_uint32 (num);
1356
1354
if (ecma_uint32_to_number (num_uint32) == num)
1357
1355
{
1358
- ecma_uint32_to_string (num_uint32, dst_p, buffer_size);
1356
+ size = ( lit_utf8_size_t ) ecma_uint32_to_utf8_string (num_uint32, dst_p, buffer_size);
1359
1357
}
1360
1358
else
1361
1359
{
@@ -1372,9 +1370,9 @@ ecma_number_to_zt_string (ecma_number_t num, /**< ecma-number */
1372
1370
if (k <= n && n <= 21 )
1373
1371
{
1374
1372
dst_p += n;
1375
- JERRY_ASSERT ((ssize_t ) sizeof ( ecma_char_t ) * (( dst_p - buffer_p) + 1 ) <= buffer_size);
1373
+ JERRY_ASSERT ((ssize_t ) ( dst_p - buffer_p) <= buffer_size);
1376
1374
1377
- *dst_p = ECMA_CHAR_NULL ;
1375
+ size = ( lit_utf8_size_t ) (dst_p - buffer_p) ;
1378
1376
1379
1377
for (int32_t i = 0 ; i < n - k; i++)
1380
1378
{
@@ -1391,9 +1389,9 @@ ecma_number_to_zt_string (ecma_number_t num, /**< ecma-number */
1391
1389
{
1392
1390
// 7.
1393
1391
dst_p += k + 1 ;
1394
- JERRY_ASSERT ((ssize_t ) sizeof ( ecma_char_t ) * (( dst_p - buffer_p) + 1 ) <= buffer_size);
1392
+ JERRY_ASSERT ((ssize_t ) ( dst_p - buffer_p) <= buffer_size);
1395
1393
1396
- *dst_p = ECMA_CHAR_NULL ;
1394
+ size = ( lit_utf8_size_t ) (dst_p - buffer_p) ;
1397
1395
1398
1396
for (int32_t i = 0 ; i < k - n; i++)
1399
1397
{
@@ -1413,9 +1411,9 @@ ecma_number_to_zt_string (ecma_number_t num, /**< ecma-number */
1413
1411
{
1414
1412
// 8.
1415
1413
dst_p += k - n + 1 + 1 ;
1416
- JERRY_ASSERT ((ssize_t ) sizeof ( ecma_char_t ) * (( dst_p - buffer_p) + 1 ) <= buffer_size);
1414
+ JERRY_ASSERT ((ssize_t ) ( dst_p - buffer_p) <= buffer_size);
1417
1415
1418
- *dst_p = ECMA_CHAR_NULL ;
1416
+ size = ( lit_utf8_size_t ) (dst_p - buffer_p) ;
1419
1417
1420
1418
for (int32_t i = 0 ; i < k; i++)
1421
1419
{
@@ -1436,7 +1434,9 @@ ecma_number_to_zt_string (ecma_number_t num, /**< ecma-number */
1436
1434
if (k == 1 )
1437
1435
{
1438
1436
// 9.
1439
- JERRY_ASSERT ((ssize_t ) sizeof (ecma_char_t ) <= buffer_size);
1437
+ JERRY_ASSERT (1 <= buffer_size);
1438
+
1439
+ size = 1 ;
1440
1440
1441
1441
*dst_p++ = digits[s % 10 ];
1442
1442
s /= 10 ;
@@ -1445,7 +1445,7 @@ ecma_number_to_zt_string (ecma_number_t num, /**< ecma-number */
1445
1445
{
1446
1446
// 10.
1447
1447
dst_p += k + 1 ;
1448
- JERRY_ASSERT ((ssize_t ) sizeof ( ecma_char_t ) * (dst_p - buffer_p) <= buffer_size);
1448
+ JERRY_ASSERT ((ssize_t ) (dst_p - buffer_p) <= buffer_size);
1449
1449
1450
1450
for (int32_t i = 0 ; i < k - 1 ; i++)
1451
1451
{
@@ -1461,14 +1461,14 @@ ecma_number_to_zt_string (ecma_number_t num, /**< ecma-number */
1461
1461
}
1462
1462
1463
1463
// 9., 10.
1464
- JERRY_ASSERT ((ssize_t ) sizeof ( ecma_char_t ) * (dst_p - buffer_p + 2 ) <= buffer_size);
1464
+ JERRY_ASSERT ((ssize_t ) (dst_p - buffer_p + 2 ) <= buffer_size);
1465
1465
*dst_p++ = e_chars[0 ];
1466
1466
*dst_p++ = (n >= 1 ) ? plus_char : minus_char;
1467
1467
int32_t t = (n >= 1 ) ? (n - 1 ) : -(n - 1 );
1468
1468
1469
1469
if (t == 0 )
1470
1470
{
1471
- JERRY_ASSERT ((ssize_t ) sizeof ( ecma_char_t ) * ( dst_p - buffer_p + 1 ) <= buffer_size);
1471
+ JERRY_ASSERT ((ssize_t ) ( dst_p - buffer_p) <= buffer_size);
1472
1472
*dst_p++ = digits[0 ];
1473
1473
}
1474
1474
else
@@ -1484,27 +1484,25 @@ ecma_number_to_zt_string (ecma_number_t num, /**< ecma-number */
1484
1484
1485
1485
while (t_mod != 0 )
1486
1486
{
1487
- JERRY_ASSERT ((ssize_t ) sizeof ( ecma_char_t ) * (dst_p - buffer_p + 1 ) <= buffer_size);
1487
+ JERRY_ASSERT ((ssize_t ) (dst_p - buffer_p + 1 ) <= buffer_size);
1488
1488
*dst_p++ = digits[t / t_mod];
1489
1489
1490
1490
t -= (t / t_mod) * t_mod;
1491
1491
t_mod /= 10 ;
1492
1492
}
1493
1493
}
1494
1494
1495
- JERRY_ASSERT ((ssize_t ) sizeof ( ecma_char_t ) * ( dst_p - buffer_p + 1 ) <= buffer_size);
1496
- *dst_p++ = ECMA_CHAR_NULL ;
1495
+ JERRY_ASSERT ((ssize_t ) ( dst_p - buffer_p) <= buffer_size);
1496
+ size = ( lit_utf8_size_t ) (dst_p - buffer_p) ;
1497
1497
}
1498
1498
1499
1499
JERRY_ASSERT (s == 0 );
1500
1500
}
1501
1501
}
1502
1502
}
1503
1503
1504
- ecma_length_t length = ecma_zt_string_length (buffer_p);
1505
-
1506
- return length;
1507
- } /* ecma_number_to_zt_string */
1504
+ return size;
1505
+ } /* ecma_number_to_utf8_string */
1508
1506
1509
1507
/* *
1510
1508
* @}
0 commit comments