Implement numeric-separator (#4158)

JerryScript-DCO-1.0-Signed-off-by: bence gabor kis kisbg@inf.u-szeged.hu
This commit is contained in:
kisbg
2020-10-12 11:33:03 +02:00
committed by GitHub
parent d1f73752ff
commit da1a4bbd44
14 changed files with 184 additions and 98 deletions
+35 -4
View File
@@ -295,7 +295,12 @@ ecma_utf8_string_to_number_by_radix (const lit_utf8_byte_t *str_p, /**< utf-8 st
const lit_utf8_byte_t *end_p, /**< end of utf-8 string */
uint32_t radix) /**< radix */
{
#if ENABLED (JERRY_ESNEXT)
bool allow_underscore = (radix & ECMA_CONVERSION_ALLOW_UNDERSCORE);
radix &= (uint32_t) ~ECMA_CONVERSION_ALLOW_UNDERSCORE;
#endif /* ENABLED (JERRY_ESNEXT) */
JERRY_ASSERT (radix == 2 || radix == 8 || radix == 16);
ecma_number_t num = ECMA_NUMBER_ZERO;
#if ENABLED (JERRY_ESNEXT)
@@ -342,6 +347,12 @@ ecma_utf8_string_to_number_by_radix (const lit_utf8_byte_t *str_p, /**< utf-8 st
{
digit_value = 10 + (*iter_p - LIT_CHAR_UPPERCASE_A);
}
#if ENABLED (JERRY_ESNEXT)
else if (*iter_p == LIT_CHAR_UNDERSCORE && allow_underscore)
{
continue;
}
#endif /* ENABLED (JERRY_ESNEXT) */
else
{
return ecma_number_make_nan ();
@@ -364,7 +375,8 @@ ecma_utf8_string_to_number_by_radix (const lit_utf8_byte_t *str_p, /**< utf-8 st
*/
ecma_number_t
ecma_utf8_string_to_number (const lit_utf8_byte_t *str_p, /**< utf-8 string */
lit_utf8_size_t str_size) /**< string size */
lit_utf8_size_t str_size, /**< string size */
uint32_t options) /**< allowing underscore option bit */
{
/* TODO: Check license issues */
@@ -388,15 +400,15 @@ ecma_utf8_string_to_number (const lit_utf8_byte_t *str_p, /**< utf-8 string */
{
case LIT_CHAR_LOWERCASE_X :
{
return ecma_utf8_string_to_number_by_radix (str_p + 2, end_p, 16);
return ecma_utf8_string_to_number_by_radix (str_p + 2, end_p, 16 | options);
}
case LIT_CHAR_LOWERCASE_O :
{
return ecma_utf8_string_to_number_by_radix (str_p + 2, end_p, 8);
return ecma_utf8_string_to_number_by_radix (str_p + 2, end_p, 8 | options);
}
case LIT_CHAR_LOWERCASE_B :
{
return ecma_utf8_string_to_number_by_radix (str_p + 2, end_p, 2);
return ecma_utf8_string_to_number_by_radix (str_p + 2, end_p, 2 | options);
}
default:
{
@@ -449,6 +461,13 @@ ecma_utf8_string_to_number (const lit_utf8_byte_t *str_p, /**< utf-8 string */
digit_seen = true;
digit_value = (*str_p - LIT_CHAR_0);
}
#if ENABLED (JERRY_ESNEXT)
else if (*str_p == LIT_CHAR_UNDERSCORE && (options & ECMA_CONVERSION_ALLOW_UNDERSCORE))
{
str_p++;
continue;
}
#endif /* ENABLED (JERRY_ESNEXT) */
else
{
break;
@@ -491,6 +510,11 @@ ecma_utf8_string_to_number (const lit_utf8_byte_t *str_p, /**< utf-8 string */
digit_seen = true;
digit_value = (*str_p - LIT_CHAR_0);
}
else if (*str_p == LIT_CHAR_UNDERSCORE && (options & ECMA_CONVERSION_ALLOW_UNDERSCORE))
{
str_p++;
continue;
}
else
{
break;
@@ -550,6 +574,13 @@ ecma_utf8_string_to_number (const lit_utf8_byte_t *str_p, /**< utf-8 string */
{
digit_value = (*str_p - LIT_CHAR_0);
}
#if ENABLED (JERRY_ESNEXT)
else if (*str_p == LIT_CHAR_UNDERSCORE && (options & ECMA_CONVERSION_ALLOW_UNDERSCORE))
{
str_p++;
continue;
}
#endif /* ENABLED (JERRY_ESNEXT) */
else
{
return ecma_number_make_nan ();
+1 -1
View File
@@ -1059,7 +1059,7 @@ ecma_number_parse_float (const lit_utf8_byte_t *string_buff, /**< routine's firs
}
/* 5. */
ecma_number_t ret_num = ecma_utf8_string_to_number (start_p, (lit_utf8_size_t) (end_p - start_p));
ecma_number_t ret_num = ecma_utf8_string_to_number (start_p, (lit_utf8_size_t) (end_p - start_p), 0);
if (sign)
{
+1 -1
View File
@@ -985,7 +985,7 @@ ecma_string_to_number (const ecma_string_t *string_p) /**< ecma-string */
return ECMA_NUMBER_ZERO;
}
return ecma_utf8_string_to_number (chars_p, size);
return ecma_utf8_string_to_number (chars_p, size, 0);
} /* ecma_string_to_number */
/**
+7 -1
View File
@@ -96,6 +96,11 @@ typedef enum
ECMA_STRING_FLAG_MUST_BE_FREED = (1 << 3), /**< The returned buffer must be freed */
} ecma_string_flag_t;
/**
* Underscore is ignored when this option is passed.
*/
#define ECMA_CONVERSION_ALLOW_UNDERSCORE 0x1
/**
* Convert ecma-string's contents to a cesu-8 string and put it into a buffer.
*/
@@ -525,7 +530,8 @@ ecma_native_pointer_t *ecma_get_native_pointer_value (ecma_object_t *obj_p, void
bool ecma_delete_native_pointer_property (ecma_object_t *obj_p, void *info_p);
/* ecma-helpers-conversion.c */
ecma_number_t ecma_utf8_string_to_number (const lit_utf8_byte_t *str_p, lit_utf8_size_t str_size);
ecma_number_t ecma_utf8_string_to_number (const lit_utf8_byte_t *str_p, lit_utf8_size_t str_size,
uint32_t option);
lit_utf8_size_t ecma_uint32_to_utf8_string (uint32_t value, lit_utf8_byte_t *out_buffer_p, lit_utf8_size_t buffer_size);
uint32_t ecma_number_to_uint32 (ecma_number_t num);
int32_t ecma_number_to_int32 (ecma_number_t num);