Implement BigInt literal parsing in the parser. (#4089)

Support octal literals for BigInts.

JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
This commit is contained in:
Zoltan Herczeg
2020-08-04 14:16:38 +02:00
committed by GitHub
parent be9dbeffdb
commit b5a96c9eca
16 changed files with 481 additions and 215 deletions
+3
View File
@@ -477,6 +477,9 @@ jerry_snapshot_set_offsets (uint32_t *buffer_p, /**< buffer */
for (uint32_t i = 0; i < const_literal_end; i++)
{
if (ecma_is_value_string (literal_start_p[i])
#if ENABLED (JERRY_BUILTIN_BIGINT)
|| ecma_is_value_bigint (literal_start_p[i])
#endif /* ENABLED (JERRY_BUILTIN_BIGINT) */
|| ecma_is_value_float_number (literal_start_p[i]))
{
lit_mem_to_snapshot_id_map_entry_t *current_p = lit_map_p;
+7 -10
View File
@@ -1578,11 +1578,17 @@ typedef enum
((ecma_string_container_t) ((string_desc_p)->refs_and_container & ECMA_STRING_CONTAINER_MASK))
/**
* Checks whether the reference counter is 1.
* Checks whether the reference counter is 1 of a string.
*/
#define ECMA_STRING_IS_REF_EQUALS_TO_ONE(string_desc_p) \
(((string_desc_p)->refs_and_container >> 4) == 1)
/**
* Checks whether the reference counter is 1 of an extended primitive.
*/
#define ECMA_EXTENDED_PRIMITIVE_IS_REF_EQUALS_TO_ONE(extended_primitive_p) \
(((extended_primitive_p)->refs_and_type >> 3) == 1)
/**
* ECMA string-value descriptor
*/
@@ -1780,15 +1786,6 @@ typedef struct
jmem_cpointer_t values[ECMA_LIT_STORAGE_VALUE_COUNT]; /**< list of values */
} ecma_lit_storage_item_t;
/**
* Number storage item
*/
typedef struct
{
jmem_cpointer_t next_cp; /**< cpointer ot next item */
jmem_cpointer_t values[ECMA_LIT_STORAGE_VALUE_COUNT]; /**< list of values */
} ecma_number_storage_item_t;
#if ENABLED (JERRY_LCACHE)
/**
* Container of an LCache entry identifier
+178 -16
View File
@@ -14,6 +14,8 @@
*/
#include "ecma-alloc.h"
#include "ecma-bigint.h"
#include "ecma-big-uint.h"
#include "ecma-literal-storage.h"
#include "ecma-helpers.h"
#include "jcontext.h"
@@ -87,28 +89,59 @@ ecma_free_string_list (jmem_cpointer_t string_list_cp) /**< string list */
* Free number list
*/
static void
ecma_free_number_list (jmem_cpointer_t number_list_cp) /**< string list */
ecma_free_number_list (jmem_cpointer_t number_list_cp) /**< number list */
{
while (number_list_cp != JMEM_CP_NULL)
{
ecma_number_storage_item_t *number_list_p = JMEM_CP_GET_NON_NULL_POINTER (ecma_number_storage_item_t,
number_list_cp);
ecma_lit_storage_item_t *number_list_p = JMEM_CP_GET_NON_NULL_POINTER (ecma_lit_storage_item_t,
number_list_cp);
for (int i = 0; i < ECMA_LIT_STORAGE_VALUE_COUNT; i++)
{
if (number_list_p->values[i] != JMEM_CP_NULL)
{
ecma_number_t *num_p = JMEM_CP_GET_NON_NULL_POINTER (ecma_number_t, number_list_p->values[i]);
ecma_dealloc_number (num_p);
ecma_dealloc_number (JMEM_CP_GET_NON_NULL_POINTER (ecma_number_t, number_list_p->values[i]));
}
}
jmem_cpointer_t next_item_cp = number_list_p->next_cp;
jmem_pools_free (number_list_p, sizeof (ecma_number_storage_item_t));
jmem_pools_free (number_list_p, sizeof (ecma_lit_storage_item_t));
number_list_cp = next_item_cp;
}
} /* ecma_free_number_list */
#if ENABLED (JERRY_BUILTIN_BIGINT)
/**
* Free bigint list
*/
static void
ecma_free_bigint_list (jmem_cpointer_t bigint_list_cp) /**< bigint list */
{
while (bigint_list_cp != JMEM_CP_NULL)
{
ecma_lit_storage_item_t *bigint_list_p = JMEM_CP_GET_NON_NULL_POINTER (ecma_lit_storage_item_t,
bigint_list_cp);
for (int i = 0; i < ECMA_LIT_STORAGE_VALUE_COUNT; i++)
{
if (bigint_list_p->values[i] != JMEM_CP_NULL)
{
ecma_extended_primitive_t *bigint_p = JMEM_CP_GET_NON_NULL_POINTER (ecma_extended_primitive_t,
bigint_list_p->values[i]);
JERRY_ASSERT (ECMA_EXTENDED_PRIMITIVE_IS_REF_EQUALS_TO_ONE (bigint_p));
ecma_deref_bigint (bigint_p);
}
}
jmem_cpointer_t next_item_cp = bigint_list_p->next_cp;
jmem_pools_free (bigint_list_p, sizeof (ecma_lit_storage_item_t));
bigint_list_cp = next_item_cp;
}
} /* ecma_free_bigint_list */
#endif /* ENABLED (JERRY_BUILTIN_BIGINT) */
/**
* Finalize literal storage
*/
@@ -120,6 +153,9 @@ ecma_finalize_lit_storage (void)
#endif /* ENABLED (JERRY_ESNEXT) */
ecma_free_string_list (JERRY_CONTEXT (string_list_first_cp));
ecma_free_number_list (JERRY_CONTEXT (number_list_first_cp));
#if ENABLED (JERRY_BUILTIN_BIGINT)
ecma_free_bigint_list (JERRY_CONTEXT (bigint_list_first_cp));
#endif /* ENABLED (JERRY_BUILTIN_BIGINT) */
} /* ecma_finalize_lit_storage */
/**
@@ -199,7 +235,7 @@ ecma_find_or_create_literal_string (const lit_utf8_byte_t *chars_p, /**< string
/**
* Find or create a literal number.
*
* @return ecma_string_t compressed pointer
* @return ecma value
*/
ecma_value_t
ecma_find_or_create_literal_number (ecma_number_t number_arg) /**< number to be searched */
@@ -218,8 +254,8 @@ ecma_find_or_create_literal_number (ecma_number_t number_arg) /**< number to be
while (number_list_cp != JMEM_CP_NULL)
{
ecma_number_storage_item_t *number_list_p = JMEM_CP_GET_NON_NULL_POINTER (ecma_number_storage_item_t,
number_list_cp);
ecma_lit_storage_item_t *number_list_p = JMEM_CP_GET_NON_NULL_POINTER (ecma_lit_storage_item_t,
number_list_cp);
for (int i = 0; i < ECMA_LIT_STORAGE_VALUE_COUNT; i++)
{
@@ -246,10 +282,8 @@ ecma_find_or_create_literal_number (ecma_number_t number_arg) /**< number to be
number_list_cp = number_list_p->next_cp;
}
ecma_number_t *num_p = ecma_get_pointer_from_float_value (num);
jmem_cpointer_t result;
JMEM_CP_SET_NON_NULL_POINTER (result, num_p);
JMEM_CP_SET_NON_NULL_POINTER (result, ecma_get_pointer_from_float_value (num));
if (empty_cpointer_p != NULL)
{
@@ -257,8 +291,8 @@ ecma_find_or_create_literal_number (ecma_number_t number_arg) /**< number to be
return num;
}
ecma_number_storage_item_t *new_item_p;
new_item_p = (ecma_number_storage_item_t *) jmem_pools_alloc (sizeof (ecma_number_storage_item_t));
ecma_lit_storage_item_t *new_item_p;
new_item_p = (ecma_lit_storage_item_t *) jmem_pools_alloc (sizeof (ecma_lit_storage_item_t));
new_item_p->values[0] = result;
for (int i = 1; i < ECMA_LIT_STORAGE_VALUE_COUNT; i++)
@@ -272,6 +306,78 @@ ecma_find_or_create_literal_number (ecma_number_t number_arg) /**< number to be
return num;
} /* ecma_find_or_create_literal_number */
#if ENABLED (JERRY_BUILTIN_BIGINT)
/**
* Find or create a literal BigInt.
*
* @return BigInt value
*/
ecma_value_t
ecma_find_or_create_literal_bigint (ecma_value_t bigint) /**< bigint to be searched */
{
JERRY_ASSERT (ecma_is_value_bigint (bigint));
jmem_cpointer_t bigint_list_cp = JERRY_CONTEXT (bigint_list_first_cp);
jmem_cpointer_t *empty_cpointer_p = NULL;
while (bigint_list_cp != JMEM_CP_NULL)
{
ecma_lit_storage_item_t *bigint_list_p = JMEM_CP_GET_NON_NULL_POINTER (ecma_lit_storage_item_t,
bigint_list_cp);
for (int i = 0; i < ECMA_LIT_STORAGE_VALUE_COUNT; i++)
{
if (bigint_list_p->values[i] == JMEM_CP_NULL)
{
if (empty_cpointer_p == NULL)
{
empty_cpointer_p = bigint_list_p->values + i;
}
}
else
{
ecma_extended_primitive_t *other_bigint_p = JMEM_CP_GET_NON_NULL_POINTER (ecma_extended_primitive_t,
bigint_list_p->values[i]);
ecma_value_t other_bigint = ecma_make_extended_primitive_value (other_bigint_p, ECMA_TYPE_BIGINT);
if (ecma_bigint_is_equal_to_bigint (bigint, other_bigint))
{
ecma_free_value (bigint);
return other_bigint;
}
}
}
bigint_list_cp = bigint_list_p->next_cp;
}
jmem_cpointer_t result;
JMEM_CP_SET_NON_NULL_POINTER (result, ecma_get_extended_primitive_from_value (bigint));
if (empty_cpointer_p != NULL)
{
*empty_cpointer_p = result;
return bigint;
}
ecma_lit_storage_item_t *new_item_p;
new_item_p = (ecma_lit_storage_item_t *) jmem_pools_alloc (sizeof (ecma_lit_storage_item_t));
new_item_p->values[0] = result;
for (int i = 1; i < ECMA_LIT_STORAGE_VALUE_COUNT; i++)
{
new_item_p->values[i] = JMEM_CP_NULL;
}
new_item_p->next_cp = JERRY_CONTEXT (bigint_list_first_cp);
JMEM_CP_SET_NON_NULL_POINTER (JERRY_CONTEXT (bigint_list_first_cp), new_item_p);
return bigint;
} /* ecma_find_or_create_literal_bigint */
#endif /* ENABLED (JERRY_BUILTIN_BIGINT) */
/**
* Log2 of snapshot literal alignment.
*/
@@ -285,13 +391,20 @@ ecma_find_or_create_literal_number (ecma_number_t number_arg) /**< number to be
/**
* Literal offset shift.
*/
#define JERRY_SNAPSHOT_LITERAL_SHIFT (ECMA_VALUE_SHIFT + 1)
#define JERRY_SNAPSHOT_LITERAL_SHIFT (ECMA_VALUE_SHIFT + 2)
/**
* Literal value is number.
*/
#define JERRY_SNAPSHOT_LITERAL_IS_NUMBER (1u << ECMA_VALUE_SHIFT)
#if ENABLED (JERRY_BUILTIN_BIGINT)
/**
* Literal value is BigInt.
*/
#define JERRY_SNAPSHOT_LITERAL_IS_BIGINT (2u << ECMA_VALUE_SHIFT)
#endif /* ENABLED (JERRY_BUILTIN_BIGINT) */
#if ENABLED (JERRY_SNAPSHOT_SAVE)
/**
@@ -301,7 +414,11 @@ void ecma_save_literals_append_value (ecma_value_t value, /**< value to be appen
ecma_collection_t *lit_pool_p) /**< list of known values */
{
/* Unlike direct numbers, direct strings are converted to character literals. */
if (!ecma_is_value_string (value) && !ecma_is_value_float_number (value))
if (!ecma_is_value_string (value)
#if ENABLED (JERRY_BUILTIN_BIGINT)
&& !ecma_is_value_bigint (value)
#endif /* ENABLED (JERRY_BUILTIN_BIGINT) */
&& !ecma_is_value_float_number (value))
{
return;
}
@@ -436,6 +553,15 @@ ecma_save_literals_for_snapshot (ecma_collection_t *lit_pool_p, /**< list of kno
{
lit_table_size += (uint32_t) sizeof (ecma_number_t);
}
#if ENABLED (JERRY_BUILTIN_BIGINT)
else if (ecma_is_value_bigint (lit_buffer_p[i]))
{
ecma_extended_primitive_t *bigint_p = ecma_get_extended_primitive_from_value (lit_buffer_p[i]);
lit_table_size += (uint32_t) JERRY_ALIGNUP (sizeof (uint32_t) + ECMA_BIGINT_GET_SIZE (bigint_p),
JERRY_SNAPSHOT_LITERAL_ALIGNMENT);
}
#endif /* ENABLED (JERRY_BUILTIN_BIGINT) */
else
{
ecma_string_t *string_p = ecma_get_string_from_value (lit_buffer_p[i]);
@@ -486,6 +612,20 @@ ecma_save_literals_for_snapshot (ecma_collection_t *lit_pool_p, /**< list of kno
length = JERRY_ALIGNUP (sizeof (ecma_number_t), JERRY_SNAPSHOT_LITERAL_ALIGNMENT);
}
#if ENABLED (JERRY_BUILTIN_BIGINT)
else if (ecma_is_value_bigint (lit_buffer_p[i]))
{
map_p->literal_offset |= JERRY_SNAPSHOT_LITERAL_IS_BIGINT;
ecma_extended_primitive_t *bigint_p = ecma_get_extended_primitive_from_value (lit_buffer_p[i]);
uint32_t size = ECMA_BIGINT_GET_SIZE (bigint_p);
memcpy (destination_p, &bigint_p->u.bigint_sign_and_size, sizeof (uint32_t));
memcpy (destination_p + sizeof (uint32_t), ECMA_BIGINT_GET_DIGITS (bigint_p, 0), size);
length = JERRY_ALIGNUP (sizeof (uint32_t) + size, JERRY_SNAPSHOT_LITERAL_ALIGNMENT);
}
#endif /* ENABLED (JERRY_BUILTIN_BIGINT) */
else
{
ecma_string_t *string_p = ecma_get_string_from_value (lit_buffer_p[i]);
@@ -533,6 +673,28 @@ ecma_snapshot_get_literal (const uint8_t *literal_base_p, /**< literal start */
return ecma_find_or_create_literal_number (num);
}
#if ENABLED (JERRY_BUILTIN_BIGINT)
if (literal_value & JERRY_SNAPSHOT_LITERAL_IS_BIGINT)
{
uint32_t bigint_sign_and_size = *(uint32_t *) literal_p;
uint32_t size = bigint_sign_and_size & ~(uint32_t) (sizeof (ecma_bigint_digit_t) - 1);
ecma_extended_primitive_t *bigint_p = ecma_bigint_create (size);
if (bigint_p == NULL)
{
jerry_fatal (ERR_OUT_OF_MEMORY);
}
/* Only the sign bit can differ. */
JERRY_ASSERT (bigint_p->u.bigint_sign_and_size == (bigint_sign_and_size & ~(uint32_t) ECMA_BIGINT_SIGN));
bigint_p->u.bigint_sign_and_size = bigint_sign_and_size;
memcpy (ECMA_BIGINT_GET_DIGITS (bigint_p, 0), literal_p + sizeof (uint32_t), size);
return ecma_find_or_create_literal_bigint (ecma_make_extended_primitive_value (bigint_p, ECMA_TYPE_BIGINT));
}
#endif /* ENABLED (JERRY_BUILTIN_BIGINT) */
uint16_t length = *(const uint16_t *) literal_p;
return ecma_find_or_create_literal_string (literal_p + sizeof (uint16_t), length);
@@ -42,6 +42,9 @@ void ecma_finalize_lit_storage (void);
ecma_value_t ecma_find_or_create_literal_string (const lit_utf8_byte_t *chars_p, lit_utf8_size_t size);
ecma_value_t ecma_find_or_create_literal_number (ecma_number_t number_arg);
#if ENABLED (JERRY_BUILTIN_BIGINT)
ecma_value_t ecma_find_or_create_literal_bigint (ecma_value_t bigint);
#endif /* ENABLED (JERRY_BUILTIN_BIGINT) */
#if ENABLED (JERRY_SNAPSHOT_SAVE)
void ecma_save_literals_append_value (ecma_value_t value, ecma_collection_t *lit_pool_p);
+19 -10
View File
@@ -36,17 +36,16 @@ ecma_bigint_raise_memory_error (void)
/**
* Parse a string and create a BigInt value
*
* @return ecma BigInt value or ECMA_VALUE_ERROR
* @return ecma BigInt value or a special value allowed by the option flags
* Returned value must be freed with ecma_free_value.
*/
ecma_value_t
ecma_bigint_parse_string (const lit_utf8_byte_t *string_p, /**< string represenation of the BigInt */
lit_utf8_size_t size, /**< string size */
bool throw_syntax_error) /**< true, if syntax errors should be thrown
* otherwise ECMA_VALUE_FALSE is returned on syntax error */
uint32_t options) /**< ecma_bigint_parse_string_options_t option bits */
{
ecma_bigint_digit_t radix = 10;
uint32_t sign = 0;
uint32_t sign = (options & ECMA_BIGINT_PARSE_SET_NEGATIVE) ? ECMA_BIGINT_SIGN : 0;
if (size >= 3 && string_p[0] == LIT_CHAR_0)
{
@@ -56,6 +55,12 @@ ecma_bigint_parse_string (const lit_utf8_byte_t *string_p, /**< string represena
string_p += 2;
size -= 2;
}
else if (string_p[1] == LIT_CHAR_LOWERCASE_O || string_p[1] == LIT_CHAR_UPPERCASE_O)
{
radix = 8;
string_p += 2;
size -= 2;
}
else if (string_p[1] == LIT_CHAR_LOWERCASE_B || string_p[1] == LIT_CHAR_UPPERCASE_B)
{
radix = 2;
@@ -79,7 +84,7 @@ ecma_bigint_parse_string (const lit_utf8_byte_t *string_p, /**< string represena
}
else if (size == 0)
{
if (!throw_syntax_error)
if (options & ECMA_BIGINT_PARSE_DISALLOW_SYNTAX_ERROR)
{
return ECMA_VALUE_FALSE;
}
@@ -97,6 +102,7 @@ ecma_bigint_parse_string (const lit_utf8_byte_t *string_p, /**< string represena
if (string_p == string_end_p)
{
sign = 0;
result_p = ecma_bigint_create (0);
}
else
@@ -126,7 +132,7 @@ ecma_bigint_parse_string (const lit_utf8_byte_t *string_p, /**< string represena
ecma_deref_bigint (result_p);
}
if (!throw_syntax_error)
if (options & ECMA_BIGINT_PARSE_DISALLOW_SYNTAX_ERROR)
{
return ECMA_VALUE_FALSE;
}
@@ -145,6 +151,10 @@ ecma_bigint_parse_string (const lit_utf8_byte_t *string_p, /**< string represena
if (JERRY_UNLIKELY (result_p == NULL))
{
if (options & ECMA_BIGINT_PARSE_DISALLOW_MEMORY_ERROR)
{
return ECMA_VALUE_NULL;
}
return ecma_bigint_raise_memory_error ();
}
@@ -160,13 +170,12 @@ ecma_bigint_parse_string (const lit_utf8_byte_t *string_p, /**< string represena
*/
ecma_value_t
ecma_bigint_parse_string_value (ecma_value_t string, /**< ecma string */
bool throw_syntax_error) /**< true, if syntax errors should be thrown
* otherwise ECMA_VALUE_FALSE is returned on syntax error */
uint32_t options) /**< ecma_bigint_parse_string_options_t option bits */
{
JERRY_ASSERT (ecma_is_value_string (string));
ECMA_STRING_TO_UTF8_STRING (ecma_get_string_from_value (string), string_buffer_p, string_buffer_size);
ecma_value_t result = ecma_bigint_parse_string (string_buffer_p, string_buffer_size, throw_syntax_error);
ecma_value_t result = ecma_bigint_parse_string (string_buffer_p, string_buffer_size, options);
ECMA_FINALIZE_UTF8_STRING (string_buffer_p, string_buffer_size);
return result;
@@ -415,7 +424,7 @@ ecma_bigint_to_bigint (ecma_value_t value) /**< any value */
return ecma_raise_type_error (ECMA_ERR_MSG ("Value cannot be converted to BigInt"));
}
return ecma_bigint_parse_string_value (value, true);
return ecma_bigint_parse_string_value (value, ECMA_BIGINT_PARSE_NO_OPTIONS);
} /* ecma_bigint_to_bigint */
/**
+15 -2
View File
@@ -25,9 +25,22 @@
*/
#define ECMA_BIGINT_SIGN 0x1
/**
* Flags for ecma_bigint_parse_string.
*/
typedef enum
{
ECMA_BIGINT_PARSE_NO_OPTIONS = 0, /**< no options */
ECMA_BIGINT_PARSE_SET_NEGATIVE = (1 << 0), /**< return with a negative BigInt value */
ECMA_BIGINT_PARSE_DISALLOW_SYNTAX_ERROR = (1 << 1), /**< don't throw SyntaxError,
* return with ECMA_VALUE_FALSE */
ECMA_BIGINT_PARSE_DISALLOW_MEMORY_ERROR = (1 << 2), /**< don't throw out-of-memory error,
* return with ECMA_VALUE_NULL instead */
} ecma_bigint_parse_string_options_t;
ecma_value_t ecma_bigint_parse_string (const lit_utf8_byte_t *string_p, lit_utf8_size_t size,
bool throw_syntax_error);
ecma_value_t ecma_bigint_parse_string_value (ecma_value_t string, bool throw_syntax_error);
uint32_t options);
ecma_value_t ecma_bigint_parse_string_value (ecma_value_t string, uint32_t options);
ecma_string_t *ecma_bigint_to_string (ecma_value_t value, ecma_bigint_digit_t radix);
ecma_value_t ecma_bigint_number_to_bigint (ecma_number_t number);
ecma_value_t ecma_bigint_to_bigint (ecma_value_t value);
+2 -2
View File
@@ -171,7 +171,7 @@ ecma_op_abstract_equality_compare (ecma_value_t x, /**< first operand */
if (ecma_is_value_string (y))
{
ecma_value_t bigint = ecma_bigint_parse_string_value (y, false);
ecma_value_t bigint = ecma_bigint_parse_string_value (y, ECMA_BIGINT_PARSE_DISALLOW_SYNTAX_ERROR);
if (ECMA_IS_VALUE_ERROR (bigint)
|| bigint == ECMA_VALUE_FALSE)
@@ -483,7 +483,7 @@ ecma_op_abstract_relational_compare (ecma_value_t x, /**< first operand */
}
else if (ecma_is_value_string (py))
{
ret_value = ecma_bigint_parse_string_value (py, false);
ret_value = ecma_bigint_parse_string_value (py, ECMA_BIGINT_PARSE_DISALLOW_SYNTAX_ERROR);
if (!ECMA_IS_VALUE_ERROR (ret_value))
{
+1 -1
View File
@@ -30,7 +30,7 @@ extern "C"
/**
* Jerry snapshot format version.
*/
#define JERRY_SNAPSHOT_VERSION (54u)
#define JERRY_SNAPSHOT_VERSION (55u)
/**
* Flags for jerry_generate_snapshot and jerry_generate_function_snapshot.
+3
View File
@@ -142,6 +142,9 @@ struct jerry_context_t
jmem_cpointer_t symbol_list_first_cp; /**< first item of the global symbol list */
#endif /* ENABLED (JERRY_ESNEXT) */
jmem_cpointer_t number_list_first_cp; /**< first item of the literal number list */
#if ENABLED (JERRY_BUILTIN_BIGINT)
jmem_cpointer_t bigint_list_first_cp; /**< first item of the literal bigint list */
#endif /* ENABLED (JERRY_BUILTIN_BIGINT) */
jmem_cpointer_t ecma_global_env_cp; /**< global lexical environment */
#if ENABLED (JERRY_ESNEXT)
jmem_cpointer_t ecma_global_scope_cp; /**< global lexical scope */
+83 -28
View File
@@ -15,6 +15,9 @@
#include "common.h"
#include "ecma-helpers.h"
#include "ecma-big-uint.h"
#include "ecma-bigint.h"
#include "lit-char-helpers.h"
#if ENABLED (JERRY_PARSER)
@@ -77,41 +80,93 @@ util_print_number (ecma_number_t num_p) /**< number to print */
JERRY_DEBUG_MSG ("%s", str_buf);
} /* util_print_number */
#if ENABLED (JERRY_BUILTIN_BIGINT)
/**
* Debug utility to print a bigint.
*/
static void
util_print_bigint (ecma_value_t bigint) /**< bigint to print */
{
ecma_extended_primitive_t *bigint_p = ecma_get_extended_primitive_from_value (bigint);
if (ECMA_BIGINT_GET_SIZE (bigint_p) == 0)
{
JERRY_DEBUG_MSG ("0");
return;
}
uint32_t char_start_p, char_size_p;
lit_utf8_byte_t *string_buffer_p = ecma_big_uint_to_string (bigint_p, 10, &char_start_p, &char_size_p);
if (JERRY_UNLIKELY (string_buffer_p == NULL))
{
JERRY_DEBUG_MSG ("<out-of-memory>");
return;
}
JERRY_ASSERT (char_start_p > 0);
if (bigint_p->u.bigint_sign_and_size & ECMA_BIGINT_SIGN)
{
string_buffer_p[--char_start_p] = LIT_CHAR_MINUS;
}
util_print_chars (string_buffer_p + char_start_p, char_size_p - char_start_p);
jmem_heap_free_block (string_buffer_p, char_size_p);
} /* util_print_bigint */
#endif /* ENABLED (JERRY_BUILTIN_BIGINT) */
/**
* Print literal.
*/
void
util_print_literal (lexer_literal_t *literal_p) /**< literal */
{
if (literal_p->type == LEXER_IDENT_LITERAL)
switch (literal_p->type)
{
JERRY_DEBUG_MSG ("ident(");
util_print_chars (literal_p->u.char_p, literal_p->prop.length);
}
else if (literal_p->type == LEXER_FUNCTION_LITERAL)
{
JERRY_DEBUG_MSG ("function");
return;
}
else if (literal_p->type == LEXER_STRING_LITERAL)
{
JERRY_DEBUG_MSG ("string(");
util_print_chars (literal_p->u.char_p, literal_p->prop.length);
}
else if (literal_p->type == LEXER_NUMBER_LITERAL)
{
JERRY_DEBUG_MSG ("number(");
util_print_number (ecma_get_number_from_value (literal_p->u.value));
}
else if (literal_p->type == LEXER_REGEXP_LITERAL)
{
JERRY_DEBUG_MSG ("regexp");
return;
}
else
{
JERRY_DEBUG_MSG ("unknown");
return;
case LEXER_IDENT_LITERAL:
{
JERRY_DEBUG_MSG ("ident(");
util_print_chars (literal_p->u.char_p, literal_p->prop.length);
break;
}
case LEXER_FUNCTION_LITERAL:
{
JERRY_DEBUG_MSG ("function");
return;
}
case LEXER_STRING_LITERAL:
{
JERRY_DEBUG_MSG ("string(");
util_print_chars (literal_p->u.char_p, literal_p->prop.length);
break;
}
case LEXER_NUMBER_LITERAL:
{
#if ENABLED (JERRY_BUILTIN_BIGINT)
if (ecma_is_value_bigint (literal_p->u.value))
{
JERRY_DEBUG_MSG ("bigint(");
util_print_bigint (literal_p->u.value);
break;
}
#endif /* ENABLED (JERRY_BUILTIN_BIGINT) */
JERRY_DEBUG_MSG ("number(");
util_print_number (ecma_get_number_from_value (literal_p->u.value));
break;
}
case LEXER_REGEXP_LITERAL:
{
JERRY_DEBUG_MSG ("regexp");
return;
}
default:
{
JERRY_DEBUG_MSG ("unknown");
return;
}
}
JERRY_DEBUG_MSG (")");
+98 -38
View File
@@ -14,6 +14,7 @@
*/
#include "ecma-alloc.h"
#include "ecma-bigint.h"
#include "ecma-helpers.h"
#include "ecma-function-object.h"
#include "ecma-literal-storage.h"
@@ -1303,6 +1304,9 @@ lexer_parse_number (parser_context_t *context_p) /**< context */
const uint8_t *source_p = context_p->source_p;
const uint8_t *source_end_p = context_p->source_end_p;
bool can_be_float = false;
#if ENABLED (JERRY_BUILTIN_BIGINT)
bool can_be_bigint = true;
#endif /* ENABLED (JERRY_BUILTIN_BIGINT) */
size_t length;
context_p->token.type = LEXER_LITERAL;
@@ -1337,8 +1341,6 @@ lexer_parse_number (parser_context_t *context_p) /**< context */
else if (LEXER_TO_ASCII_LOWERCASE (source_p[1]) == LIT_CHAR_LOWERCASE_O)
{
context_p->token.extra_value = LEXER_NUMBER_OCTAL;
context_p->token.lit_location.char_p++;
context_p->source_p++;
source_p += 2;
if (source_p >= source_end_p
@@ -1354,6 +1356,9 @@ lexer_parse_number (parser_context_t *context_p) /**< context */
&& source_p[1] <= LIT_CHAR_7)
{
context_p->token.extra_value = LEXER_NUMBER_OCTAL;
#if ENABLED (JERRY_BUILTIN_BIGINT)
can_be_bigint = false;
#endif /* ENABLED (JERRY_BUILTIN_BIGINT) */
if (context_p->status_flags & PARSER_IS_STRICT)
{
@@ -1371,8 +1376,6 @@ lexer_parse_number (parser_context_t *context_p) /**< context */
else if (LEXER_TO_ASCII_LOWERCASE (source_p[1]) == LIT_CHAR_LOWERCASE_B)
{
context_p->token.extra_value = LEXER_NUMBER_BINARY;
context_p->token.lit_location.char_p++;
context_p->source_p++;
source_p += 2;
if (source_p >= source_end_p
@@ -1413,6 +1416,10 @@ lexer_parse_number (parser_context_t *context_p) /**< context */
&& source_p[0] == LIT_CHAR_DOT)
{
source_p++;
#if ENABLED (JERRY_BUILTIN_BIGINT)
can_be_bigint = false;
#endif /* ENABLED (JERRY_BUILTIN_BIGINT) */
while (source_p < source_end_p
&& source_p[0] >= LIT_CHAR_0
&& source_p[0] <= LIT_CHAR_9)
@@ -1425,6 +1432,9 @@ lexer_parse_number (parser_context_t *context_p) /**< context */
&& LEXER_TO_ASCII_LOWERCASE (source_p[0]) == LIT_CHAR_LOWERCASE_E)
{
source_p++;
#if ENABLED (JERRY_BUILTIN_BIGINT)
can_be_bigint = false;
#endif /* ENABLED (JERRY_BUILTIN_BIGINT) */
if (source_p < source_end_p
&& (source_p[0] == LIT_CHAR_PLUS || source_p[0] == LIT_CHAR_MINUS))
@@ -1449,6 +1459,18 @@ lexer_parse_number (parser_context_t *context_p) /**< context */
}
}
#if ENABLED (JERRY_BUILTIN_BIGINT)
if (source_p < source_end_p && source_p[0] == LIT_CHAR_LOWERCASE_N)
{
if (!can_be_bigint)
{
parser_raise_error (context_p, PARSER_ERR_INVALID_BIGINT);
}
context_p->token.extra_value = LEXER_NUMBER_BIGINT;
source_p++;
}
#endif /* ENABLED (JERRY_BUILTIN_BIGINT) */
length = (size_t) (source_p - context_p->source_p);
if (length > PARSER_MAXIMUM_IDENT_LENGTH)
{
@@ -2515,56 +2537,94 @@ lexer_construct_number_object (parser_context_t *context_p, /**< context */
{
parser_list_iterator_t literal_iterator;
lexer_literal_t *literal_p;
ecma_value_t lit_value;
ecma_number_t num;
uint32_t literal_index = 0;
prop_length_t length = context_p->token.lit_location.length;
if (context_p->token.extra_value < LEXER_NUMBER_OCTAL)
#if ENABLED (JERRY_BUILTIN_BIGINT)
if (JERRY_LIKELY (context_p->token.extra_value != LEXER_NUMBER_BIGINT))
{
num = ecma_utf8_string_to_number (context_p->token.lit_location.char_p,
length);
#endif /* ENABLED (JERRY_BUILTIN_BIGINT) */
if (context_p->token.extra_value < LEXER_NUMBER_OCTAL)
{
num = ecma_utf8_string_to_number (context_p->token.lit_location.char_p,
length);
}
else
{
const uint8_t *src_p = context_p->token.lit_location.char_p;
const uint8_t *src_end_p = src_p + length - 1;
ecma_number_t multiplier = 8.0;
JERRY_ASSERT (src_p[0] == LIT_CHAR_0);
#if ENABLED (JERRY_ESNEXT)
if (context_p->token.extra_value == LEXER_NUMBER_BINARY)
{
src_p++;
multiplier = 2.0;
}
else if (LEXER_TO_ASCII_LOWERCASE (src_p[1]) == LIT_CHAR_LOWERCASE_O)
{
src_p++;
}
#endif /* ENABLED (JERRY_ESNEXT) */
num = 0;
do
{
num = num * multiplier + (ecma_number_t) (*(++src_p) - LIT_CHAR_0);
}
while (src_p < src_end_p);
}
if (is_expr)
{
int32_t int_num = (int32_t) num;
if (int_num == num
&& int_num <= CBC_PUSH_NUMBER_BYTE_RANGE_END
&& (int_num != 0 || !is_negative_number))
{
context_p->lit_object.index = (uint16_t) int_num;
return true;
}
}
if (is_negative_number)
{
num = -num;
}
lit_value = ecma_find_or_create_literal_number (num);
#if ENABLED (JERRY_BUILTIN_BIGINT)
}
else
{
const uint8_t *src_p = context_p->token.lit_location.char_p;
const uint8_t *src_end_p = src_p + length - 1;
ecma_number_t multiplier = 8.0;
uint32_t options = ECMA_BIGINT_PARSE_DISALLOW_SYNTAX_ERROR | ECMA_BIGINT_PARSE_DISALLOW_MEMORY_ERROR;
#if ENABLED (JERRY_ESNEXT)
if (context_p->token.extra_value == LEXER_NUMBER_BINARY)
if (is_negative_number)
{
multiplier = 2.0;
options |= ECMA_BIGINT_PARSE_SET_NEGATIVE;
}
#endif /* ENABLED (JERRY_ESNEXT) */
num = 0;
do
JERRY_ASSERT (length >= 2);
lit_value = ecma_bigint_parse_string (context_p->token.lit_location.char_p,
(lit_utf8_size_t) (length - 1),
options);
JERRY_ASSERT (lit_value != ECMA_VALUE_FALSE && !ECMA_IS_VALUE_ERROR (lit_value));
if (lit_value == ECMA_VALUE_NULL)
{
src_p++;
num = num * multiplier + (ecma_number_t) (*src_p - LIT_CHAR_0);
parser_raise_error (context_p, PARSER_ERR_OUT_OF_MEMORY);
}
while (src_p < src_end_p);
lit_value = ecma_find_or_create_literal_bigint (lit_value);
}
#endif /* ENABLED (JERRY_BUILTIN_BIGINT) */
if (is_expr)
{
int32_t int_num = (int32_t) num;
if (int_num == num
&& int_num <= CBC_PUSH_NUMBER_BYTE_RANGE_END
&& (int_num != 0 || !is_negative_number))
{
context_p->lit_object.index = (uint16_t) int_num;
return true;
}
}
if (is_negative_number)
{
num = -num;
}
ecma_value_t lit_value = ecma_find_or_create_literal_number (num);
parser_list_iterator_init (&context_p->literal_pool, &literal_iterator);
while ((literal_p = (lexer_literal_t *) parser_list_iterator_next (&literal_iterator)) != NULL)
+3
View File
@@ -279,6 +279,9 @@ typedef enum
LEXER_NUMBER_HEXADECIMAL, /**< hexadecimal number */
LEXER_NUMBER_OCTAL, /**< octal number */
LEXER_NUMBER_BINARY, /**< binary number */
#if ENABLED (JERRY_BUILTIN_BIGINT)
LEXER_NUMBER_BIGINT, /**< bigint number */
#endif /* ENABLED (JERRY_BUILTIN_BIGINT) */
} lexer_number_type_t;
/**
+6
View File
@@ -869,6 +869,12 @@ parser_error_to_string (parser_error_t error) /**< error code */
{
return "Identifier cannot start after a number.";
}
#if ENABLED (JERRY_BUILTIN_BIGINT)
case PARSER_ERR_INVALID_BIGINT:
{
return "Number is not a valid BigInt.";
}
#endif /* ENABLED (JERRY_BUILTIN_BIGINT) */
case PARSER_ERR_INVALID_REGEXP:
{
return "Invalid regular expression.";
+3
View File
@@ -56,6 +56,9 @@ typedef enum
PARSER_ERR_INVALID_NUMBER, /**< invalid number literal */
PARSER_ERR_MISSING_EXPONENT, /**< missing exponent */
PARSER_ERR_IDENTIFIER_AFTER_NUMBER, /**< identifier start after number */
#if ENABLED (JERRY_BUILTIN_BIGINT)
PARSER_ERR_INVALID_BIGINT, /**< number is not a valid BigInt */
#endif /* ENABLED (JERRY_BUILTIN_BIGINT) */
PARSER_ERR_INVALID_REGEXP, /**< invalid regular expression */
PARSER_ERR_UNKNOWN_REGEXP_FLAG, /**< unknown regexp flag */
+57
View File
@@ -0,0 +1,57 @@
/* Copyright JS Foundation and other contributors, http://js.foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
function check_syntax_error(code)
{
try {
eval(code)
assert(false)
} catch (e) {
assert(e instanceof SyntaxError)
}
}
check_syntax_error("1N")
check_syntax_error("3.5n")
check_syntax_error("3e10n")
check_syntax_error("3e+10n")
check_syntax_error("0xn")
check_syntax_error("0on")
check_syntax_error("0bn")
check_syntax_error("0777n")
check_syntax_error("00777n")
check_syntax_error("0x1 n")
assert(0n == 0n)
assert(0n == -0n)
assert(12n == 12n)
assert(123456789012345678901234567890123456789012345678901234567890n == 123456789012345678901234567890123456789012345678901234567890n)
assert(12n != -12n)
assert(123456789012345678901234567890123456789012345678901234567890n != -123456789012345678901234567890123456789012345678901234567890n)
assert(0xffn == 255n)
assert(0o77777n == 0x7fffn)
assert(255n.toString(16) == "ff")
var o = { 12n : "data" }
assert(o[12] === "data")
var c = class C { static 19n () { return "BigInt" } }
assert(c[19]() === "BigInt")
function f(p, q) {
assert(p + q === 5000n)
}
f(-1000n, 6000n)
-108
View File
@@ -699,24 +699,13 @@
<test id="built-ins/BigInt/asUintN/length.js"><reason></reason></test>
<test id="built-ins/BigInt/asUintN/name.js"><reason></reason></test>
<test id="built-ins/BigInt/asUintN/order-of-steps.js"><reason></reason></test>
<test id="built-ins/BigInt/call-value-of-when-to-string-present.js"><reason></reason></test>
<test id="built-ins/BigInt/constructor-empty-string.js"><reason></reason></test>
<test id="built-ins/BigInt/constructor-from-binary-string.js"><reason></reason></test>
<test id="built-ins/BigInt/constructor-from-decimal-string.js"><reason></reason></test>
<test id="built-ins/BigInt/constructor-from-hex-string.js"><reason></reason></test>
<test id="built-ins/BigInt/constructor-from-octal-string.js"><reason></reason></test>
<test id="built-ins/BigInt/constructor-integer.js"><reason></reason></test>
<test id="built-ins/BigInt/constructor-trailing-leading-spaces.js"><reason></reason></test>
<test id="built-ins/BigInt/non-integer-rangeerror.js"><reason></reason></test>
<test id="built-ins/BigInt/prototype/toString/a-z.js"><reason></reason></test>
<test id="built-ins/BigInt/prototype/toString/default-radix.js"><reason></reason></test>
<test id="built-ins/BigInt/prototype/toString/length.js"><reason></reason></test>
<test id="built-ins/BigInt/prototype/toString/radix-2-to-36.js"><reason></reason></test>
<test id="built-ins/BigInt/prototype/toString/radix-err.js"><reason></reason></test>
<test id="built-ins/BigInt/prototype/toString/string-is-code-units-of-decimal-digits-only.js"><reason></reason></test>
<test id="built-ins/BigInt/prototype/toString/thisbigintvalue-not-valid-throws.js"><reason></reason></test>
<test id="built-ins/BigInt/prototype/valueOf/cross-realm.js"><reason></reason></test>
<test id="built-ins/BigInt/prototype/valueOf/return.js"><reason></reason></test>
<test id="built-ins/Boolean/proto-from-ctor-realm.js"><reason></reason></test>
<test id="built-ins/DataView/buffer-does-not-have-arraybuffer-data-throws-sab.js"><reason></reason></test>
<test id="built-ins/DataView/buffer-reference-sab.js"><reason></reason></test>
@@ -826,7 +815,6 @@
<test id="built-ins/DataView/prototype/setBigInt64/negative-byteoffset-throws.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setBigInt64/range-check-after-value-conversion.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setBigInt64/return-abrupt-from-tobigint-value.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setBigInt64/return-abrupt-from-tonumber-byteoffset-symbol.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setBigInt64/return-abrupt-from-tonumber-byteoffset.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setBigInt64/set-values-little-endian-order.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setBigInt64/set-values-return-undefined.js"><reason></reason></test>
@@ -1087,7 +1075,6 @@
<test id="built-ins/JSON/stringify/replacer-array-proxy-revoked-realm.js"><reason></reason></test>
<test id="built-ins/JSON/stringify/value-bigint-cross-realm.js"><reason></reason></test>
<test id="built-ins/JSON/stringify/value-bigint-order.js"><reason></reason></test>
<test id="built-ins/JSON/stringify/value-bigint-replacer.js"><reason></reason></test>
<test id="built-ins/JSON/stringify/value-bigint-tojson-receiver.js"><reason></reason></test>
<test id="built-ins/JSON/stringify/value-bigint-tojson.js"><reason></reason></test>
<test id="built-ins/JSON/stringify/value-bigint.js"><reason></reason></test>
@@ -1128,8 +1115,6 @@
<test id="built-ins/Number/prototype/toExponential/return-values.js"><reason></reason></test>
<test id="built-ins/Number/prototype/toFixed/exactness.js"><reason></reason></test>
<test id="built-ins/Number/prototype/toPrecision/exponential.js"><reason></reason></test>
<test id="built-ins/Object/bigint.js"><reason></reason></test>
<test id="built-ins/Object/create/properties-arg-to-object-bigint.js"><reason></reason></test>
<test id="built-ins/Object/entries/order-after-define-property.js"><reason></reason></test>
<test id="built-ins/Object/fromEntries/empty-iterable.js"><reason></reason></test>
<test id="built-ins/Object/fromEntries/evaluation-order.js"><reason></reason></test>
@@ -1162,7 +1147,6 @@
<test id="built-ins/Object/prototype/toString/symbol-tag-non-str-bigint.js"><reason></reason></test>
<test id="built-ins/Object/prototype/toString/symbol-tag-non-str-builtin.js"><reason></reason></test>
<test id="built-ins/Object/prototype/toString/symbol-tag-non-str-proxy-function.js"><reason></reason></test>
<test id="built-ins/Object/setPrototypeOf/bigint.js"><reason></reason></test>
<test id="built-ins/Object/subclass-object-arg.js"><reason></reason></test>
<test id="built-ins/Object/values/order-after-define-property.js"><reason></reason></test>
<test id="built-ins/Promise/all/invoke-resolve-get-error.js"><reason></reason></test>
@@ -2027,8 +2011,6 @@
<test id="built-ins/SharedArrayBuffer/undefined-newtarget-throws.js"><reason></reason></test>
<test id="built-ins/SharedArrayBuffer/zero-length.js"><reason></reason></test>
<test id="built-ins/String/proto-from-ctor-realm.js"><reason></reason></test>
<test id="built-ins/String/prototype/indexOf/position-tointeger-bigint.js"><reason></reason></test>
<test id="built-ins/String/prototype/indexOf/searchstring-tostring-bigint.js"><reason></reason></test>
<test id="built-ins/String/prototype/matchAll/length.js"><reason></reason></test>
<test id="built-ins/String/prototype/matchAll/name.js"><reason></reason></test>
<test id="built-ins/String/prototype/matchAll/prop-desc.js"><reason></reason></test>
@@ -3164,7 +3146,6 @@
<test id="built-ins/global/property-descriptor.js"><reason></reason></test>
<test id="built-ins/parseFloat/S15.1.2.3_A2_T10.js"><reason></reason></test>
<test id="built-ins/parseInt/S15.1.2.2_A2_T10.js"><reason></reason></test>
<test id="harness/deepEqual-primitives-bigint.js"><reason></reason></test>
<test id="harness/isConstructor.js"><reason></reason></test>
<test id="intl402/BigInt/prototype/toLocaleString/de-DE.js"><reason></reason></test>
<test id="intl402/BigInt/prototype/toLocaleString/default-options-object-prototype.js"><reason></reason></test>
@@ -4136,12 +4117,6 @@
<test id="language/eval-code/indirect/var-env-func-init-global-update-configurable.js"><reason></reason></test>
<test id="language/eval-code/indirect/var-env-global-lex-non-strict.js"><reason></reason></test>
<test id="language/eval-code/indirect/var-env-var-init-global-new.js"><reason></reason></test>
<test id="language/expressions/addition/bigint-and-number.js"><reason></reason></test>
<test id="language/expressions/addition/bigint-arithmetic.js"><reason></reason></test>
<test id="language/expressions/addition/bigint-errors.js"><reason></reason></test>
<test id="language/expressions/addition/bigint-toprimitive.js"><reason></reason></test>
<test id="language/expressions/addition/bigint-wrapped-values.js"><reason></reason></test>
<test id="language/expressions/addition/coerce-bigint-to-string.js"><reason></reason></test>
<test id="language/expressions/array/spread-obj-spread-order.js"><reason></reason></test>
<test id="language/expressions/array/spread-obj-symbol-property.js"><reason></reason></test>
<test id="language/expressions/arrow-function/dflt-params-trailing-comma.js"><reason></reason></test>
@@ -4318,22 +4293,16 @@
<test id="language/expressions/async-generator/yield-thenable-create-resolving-functions-reject.js"><reason></reason></test>
<test id="language/expressions/async-generator/yield-thenable-create-resolving-functions-resolve.js"><reason></reason></test>
<test id="language/expressions/await/for-await-of-interleaved.js"><reason></reason></test>
<test id="language/expressions/bitwise-and/bigint-and-number.js"><reason></reason></test>
<test id="language/expressions/bitwise-and/bigint-errors.js"><reason></reason></test>
<test id="language/expressions/bitwise-and/bigint-non-primitive.js"><reason></reason></test>
<test id="language/expressions/bitwise-and/bigint-toprimitive.js"><reason></reason></test>
<test id="language/expressions/bitwise-and/bigint-wrapped-values.js"><reason></reason></test>
<test id="language/expressions/bitwise-and/bigint.js"><reason></reason></test>
<test id="language/expressions/bitwise-not/bigint-non-primitive.js"><reason></reason></test>
<test id="language/expressions/bitwise-not/bigint.js"><reason></reason></test>
<test id="language/expressions/bitwise-or/bigint-and-number.js"><reason></reason></test>
<test id="language/expressions/bitwise-or/bigint-errors.js"><reason></reason></test>
<test id="language/expressions/bitwise-or/bigint-non-primitive.js"><reason></reason></test>
<test id="language/expressions/bitwise-or/bigint-toprimitive.js"><reason></reason></test>
<test id="language/expressions/bitwise-or/bigint-wrapped-values.js"><reason></reason></test>
<test id="language/expressions/bitwise-or/bigint.js"><reason></reason></test>
<test id="language/expressions/bitwise-xor/bigint-and-number.js"><reason></reason></test>
<test id="language/expressions/bitwise-xor/bigint-errors.js"><reason></reason></test>
<test id="language/expressions/bitwise-xor/bigint-non-primitive.js"><reason></reason></test>
<test id="language/expressions/bitwise-xor/bigint-toprimitive.js"><reason></reason></test>
<test id="language/expressions/bitwise-xor/bigint-wrapped-values.js"><reason></reason></test>
@@ -6270,16 +6239,6 @@
<test id="language/expressions/compound-assignment/S11.13.2_A7.9_T4.js"><reason></reason></test>
<test id="language/expressions/conditional/tco-cond.js"><reason></reason></test>
<test id="language/expressions/conditional/tco-pos.js"><reason></reason></test>
<test id="language/expressions/division/bigint-and-number.js"><reason></reason></test>
<test id="language/expressions/division/bigint-arithmetic.js"><reason></reason></test>
<test id="language/expressions/division/bigint-complex-infinity.js"><reason></reason></test>
<test id="language/expressions/division/bigint-errors.js"><reason></reason></test>
<test id="language/expressions/division/bigint-toprimitive.js"><reason></reason></test>
<test id="language/expressions/division/bigint-wrapped-values.js"><reason></reason></test>
<test id="language/expressions/does-not-equals/bigint-and-bigint.js"><reason></reason></test>
<test id="language/expressions/does-not-equals/bigint-and-boolean.js"><reason></reason></test>
<test id="language/expressions/does-not-equals/bigint-and-incomparable-primitive.js"><reason></reason></test>
<test id="language/expressions/does-not-equals/bigint-and-non-finite.js"><reason></reason></test>
<test id="language/expressions/does-not-equals/bigint-and-number-extremes.js"><reason></reason></test>
<test id="language/expressions/does-not-equals/bigint-and-number.js"><reason></reason></test>
<test id="language/expressions/does-not-equals/bigint-and-object.js"><reason></reason></test>
@@ -6694,18 +6653,12 @@
<test id="language/expressions/dynamic-import/usage/top-level-import-then-is-call-expression-square-brackets.js"><reason></reason></test>
<test id="language/expressions/dynamic-import/usage/top-level-import-then-returns-thenable.js"><reason></reason></test>
<test id="language/expressions/dynamic-import/usage/top-level-import-then-specifier-tostring.js"><reason></reason></test>
<test id="language/expressions/equals/bigint-and-bigint.js"><reason></reason></test>
<test id="language/expressions/equals/bigint-and-boolean.js"><reason></reason></test>
<test id="language/expressions/equals/bigint-and-incomparable-primitive.js"><reason></reason></test>
<test id="language/expressions/equals/bigint-and-non-finite.js"><reason></reason></test>
<test id="language/expressions/equals/bigint-and-number-extremes.js"><reason></reason></test>
<test id="language/expressions/equals/bigint-and-number.js"><reason></reason></test>
<test id="language/expressions/equals/bigint-and-object.js"><reason></reason></test>
<test id="language/expressions/equals/bigint-and-string.js"><reason></reason></test>
<test id="language/expressions/equals/coerce-symbol-to-prim-return-prim.js"><reason></reason></test>
<test id="language/expressions/exponentiation/bigint-and-number.js"><reason></reason></test>
<test id="language/expressions/exponentiation/bigint-arithmetic.js"><reason></reason></test>
<test id="language/expressions/exponentiation/bigint-errors.js"><reason></reason></test>
<test id="language/expressions/exponentiation/bigint-negative-exponent-throws.js"><reason></reason></test>
<test id="language/expressions/exponentiation/bigint-toprimitive.js"><reason></reason></test>
<test id="language/expressions/exponentiation/bigint-wrapped-values.js"><reason></reason></test>
@@ -6746,44 +6699,23 @@
<test id="language/expressions/generators/named-yield-identifier-spread-non-strict.js"><reason></reason></test>
<test id="language/expressions/generators/yield-identifier-spread-non-strict.js"><reason></reason></test>
<test id="language/expressions/greater-than-or-equal/bigint-and-bigint.js"><reason></reason></test>
<test id="language/expressions/greater-than-or-equal/bigint-and-incomparable-string.js"><reason></reason></test>
<test id="language/expressions/greater-than-or-equal/bigint-and-non-finite.js"><reason></reason></test>
<test id="language/expressions/greater-than-or-equal/bigint-and-number-extremes.js"><reason></reason></test>
<test id="language/expressions/greater-than-or-equal/bigint-and-number.js"><reason></reason></test>
<test id="language/expressions/greater-than-or-equal/bigint-and-string.js"><reason></reason></test>
<test id="language/expressions/greater-than/bigint-and-bigint.js"><reason></reason></test>
<test id="language/expressions/greater-than/bigint-and-boolean.js"><reason></reason></test>
<test id="language/expressions/greater-than/bigint-and-incomparable-string.js"><reason></reason></test>
<test id="language/expressions/greater-than/bigint-and-non-finite.js"><reason></reason></test>
<test id="language/expressions/greater-than/bigint-and-number-extremes.js"><reason></reason></test>
<test id="language/expressions/greater-than/bigint-and-number.js"><reason></reason></test>
<test id="language/expressions/greater-than/bigint-and-string.js"><reason></reason></test>
<test id="language/expressions/greater-than/bigint-and-symbol.js"><reason></reason></test>
<test id="language/expressions/import.meta/distinct-for-each-module.js"><reason></reason></test>
<test id="language/expressions/import.meta/import-meta-is-an-ordinary-object.js"><reason></reason></test>
<test id="language/expressions/import.meta/same-object-returned.js"><reason></reason></test>
<test id="language/expressions/import.meta/syntax/goal-module-nested-function.js"><reason></reason></test>
<test id="language/expressions/import.meta/syntax/goal-module.js"><reason></reason></test>
<test id="language/expressions/left-shift/bigint-and-number.js"><reason></reason></test>
<test id="language/expressions/left-shift/bigint-errors.js"><reason></reason></test>
<test id="language/expressions/left-shift/bigint-non-primitive.js"><reason></reason></test>
<test id="language/expressions/left-shift/bigint-toprimitive.js"><reason></reason></test>
<test id="language/expressions/left-shift/bigint-wrapped-values.js"><reason></reason></test>
<test id="language/expressions/left-shift/bigint.js"><reason></reason></test>
<test id="language/expressions/less-than-or-equal/bigint-and-bigint.js"><reason></reason></test>
<test id="language/expressions/less-than-or-equal/bigint-and-incomparable-string.js"><reason></reason></test>
<test id="language/expressions/less-than-or-equal/bigint-and-non-finite.js"><reason></reason></test>
<test id="language/expressions/less-than-or-equal/bigint-and-number-extremes.js"><reason></reason></test>
<test id="language/expressions/less-than-or-equal/bigint-and-number.js"><reason></reason></test>
<test id="language/expressions/less-than-or-equal/bigint-and-string.js"><reason></reason></test>
<test id="language/expressions/less-than/bigint-and-bigint.js"><reason></reason></test>
<test id="language/expressions/less-than/bigint-and-boolean.js"><reason></reason></test>
<test id="language/expressions/less-than/bigint-and-incomparable-string.js"><reason></reason></test>
<test id="language/expressions/less-than/bigint-and-non-finite.js"><reason></reason></test>
<test id="language/expressions/less-than/bigint-and-number-extremes.js"><reason></reason></test>
<test id="language/expressions/less-than/bigint-and-number.js"><reason></reason></test>
<test id="language/expressions/less-than/bigint-and-string.js"><reason></reason></test>
<test id="language/expressions/less-than/bigint-and-symbol.js"><reason></reason></test>
<test id="language/expressions/logical-and/tco-right.js"><reason></reason></test>
<test id="language/expressions/logical-assignment/lgcl-and-assignment-operator-bigint.js"><reason></reason></test>
<test id="language/expressions/logical-assignment/lgcl-and-assignment-operator-lhs-before-rhs.js"><reason></reason></test>
@@ -6832,17 +6764,6 @@
<test id="language/expressions/logical-assignment/lgcl-or-whitespace.js"><reason></reason></test>
<test id="language/expressions/logical-not/bigint.js"><reason></reason></test>
<test id="language/expressions/logical-or/tco-right.js"><reason></reason></test>
<test id="language/expressions/modulus/bigint-and-number.js"><reason></reason></test>
<test id="language/expressions/modulus/bigint-arithmetic.js"><reason></reason></test>
<test id="language/expressions/modulus/bigint-errors.js"><reason></reason></test>
<test id="language/expressions/modulus/bigint-modulo-zero.js"><reason></reason></test>
<test id="language/expressions/modulus/bigint-toprimitive.js"><reason></reason></test>
<test id="language/expressions/modulus/bigint-wrapped-values.js"><reason></reason></test>
<test id="language/expressions/multiplication/bigint-and-number.js"><reason></reason></test>
<test id="language/expressions/multiplication/bigint-arithmetic.js"><reason></reason></test>
<test id="language/expressions/multiplication/bigint-errors.js"><reason></reason></test>
<test id="language/expressions/multiplication/bigint-toprimitive.js"><reason></reason></test>
<test id="language/expressions/multiplication/bigint-wrapped-values.js"><reason></reason></test>
<test id="language/expressions/new/non-ctor-err-realm.js"><reason></reason></test>
<test id="language/expressions/new/spread-obj-spread-order.js"><reason></reason></test>
<test id="language/expressions/new/spread-obj-symbol-property.js"><reason></reason></test>
@@ -6887,7 +6808,6 @@
<test id="language/expressions/object/dstr/meth-obj-ptrn-rest-skip-non-enumerable.js"><reason></reason></test>
<test id="language/expressions/object/dstr/meth-obj-ptrn-rest-val-obj.js"><reason></reason></test>
<test id="language/expressions/object/dstr/object-rest-proxy-ownkeys-returned-keys-order.js"><reason></reason></test>
<test id="language/expressions/object/literal-property-name-bigint.js"><reason></reason></test>
<test id="language/expressions/object/method-definition/async-gen-meth-dflt-params-trailing-comma.js"><reason></reason></test>
<test id="language/expressions/object/method-definition/async-gen-meth-eval-var-scope-syntax-err.js"><reason></reason></test>
<test id="language/expressions/object/method-definition/async-gen-yield-identifier-spread-non-strict.js"><reason></reason></test>
@@ -6971,33 +6891,9 @@
<test id="language/expressions/prefix-increment/S11.4.4_A5_T5.js"><reason></reason></test>
<test id="language/expressions/prefix-increment/S11.4.4_A6_T3.js"><reason></reason></test>
<test id="language/expressions/prefix-increment/bigint.js"><reason></reason></test>
<test id="language/expressions/right-shift/bigint-and-number.js"><reason></reason></test>
<test id="language/expressions/right-shift/bigint-errors.js"><reason></reason></test>
<test id="language/expressions/right-shift/bigint-non-primitive.js"><reason></reason></test>
<test id="language/expressions/right-shift/bigint-toprimitive.js"><reason></reason></test>
<test id="language/expressions/right-shift/bigint-wrapped-values.js"><reason></reason></test>
<test id="language/expressions/right-shift/bigint.js"><reason></reason></test>
<test id="language/expressions/strict-does-not-equals/bigint-and-bigint.js"><reason></reason></test>
<test id="language/expressions/strict-does-not-equals/bigint-and-boolean.js"><reason></reason></test>
<test id="language/expressions/strict-does-not-equals/bigint-and-incomparable-primitive.js"><reason></reason></test>
<test id="language/expressions/strict-does-not-equals/bigint-and-non-finite.js"><reason></reason></test>
<test id="language/expressions/strict-does-not-equals/bigint-and-number-extremes.js"><reason></reason></test>
<test id="language/expressions/strict-does-not-equals/bigint-and-number.js"><reason></reason></test>
<test id="language/expressions/strict-does-not-equals/bigint-and-object.js"><reason></reason></test>
<test id="language/expressions/strict-does-not-equals/bigint-and-string.js"><reason></reason></test>
<test id="language/expressions/strict-equals/bigint-and-bigint.js"><reason></reason></test>
<test id="language/expressions/strict-equals/bigint-and-boolean.js"><reason></reason></test>
<test id="language/expressions/strict-equals/bigint-and-incomparable-primitive.js"><reason></reason></test>
<test id="language/expressions/strict-equals/bigint-and-non-finite.js"><reason></reason></test>
<test id="language/expressions/strict-equals/bigint-and-number-extremes.js"><reason></reason></test>
<test id="language/expressions/strict-equals/bigint-and-number.js"><reason></reason></test>
<test id="language/expressions/strict-equals/bigint-and-object.js"><reason></reason></test>
<test id="language/expressions/strict-equals/bigint-and-string.js"><reason></reason></test>
<test id="language/expressions/subtraction/bigint-and-number.js"><reason></reason></test>
<test id="language/expressions/subtraction/bigint-arithmetic.js"><reason></reason></test>
<test id="language/expressions/subtraction/bigint-errors.js"><reason></reason></test>
<test id="language/expressions/subtraction/bigint-toprimitive.js"><reason></reason></test>
<test id="language/expressions/subtraction/bigint-wrapped-values.js"><reason></reason></test>
<test id="language/expressions/super/call-proto-not-ctor.js"><reason></reason></test>
<test id="language/expressions/super/call-spread-obj-spread-order.js"><reason></reason></test>
<test id="language/expressions/super/call-spread-obj-symbol-property.js"><reason></reason></test>
@@ -7019,11 +6915,7 @@
<test id="language/expressions/template-literal/invalid-legacy-octal-escape-sequence.js"><reason></reason></test>
<test id="language/expressions/typeof/bigint.js"><reason></reason></test>
<test id="language/expressions/typeof/proxy.js"><reason></reason></test>
<test id="language/expressions/unary-minus/bigint-non-primitive.js"><reason></reason></test>
<test id="language/expressions/unary-minus/bigint.js"><reason></reason></test>
<test id="language/expressions/unary-plus/bigint-throws.js"><reason></reason></test>
<test id="language/expressions/unsigned-right-shift/bigint-and-number.js"><reason></reason></test>
<test id="language/expressions/unsigned-right-shift/bigint-errors.js"><reason></reason></test>
<test id="language/expressions/unsigned-right-shift/bigint-non-primitive.js"><reason></reason></test>
<test id="language/expressions/unsigned-right-shift/bigint-toprimitive.js"><reason></reason></test>
<test id="language/expressions/unsigned-right-shift/bigint-wrapped-values.js"><reason></reason></test>