Update the name handling of anonymous functions to ES11 (#4279)

JerryScript-DCO-1.0-Signed-off-by: Dániel Bátyai daniel.batyai@h-lab.eu
This commit is contained in:
Dániel Bátyai
2021-01-18 18:20:24 +01:00
committed by GitHub
parent 6ec4455111
commit 8e83638daa
9 changed files with 45 additions and 29 deletions
+13
View File
@@ -340,6 +340,19 @@ ecma_is_value_symbol (ecma_value_t value) /**< ecma value */
#endif /* ENABLED (JERRY_ESNEXT) */
} /* ecma_is_value_symbol */
/**
* Check if the value is a specific magic string.
*
* @return true - if the value the magic string value,
* false - otherwise
*/
extern inline bool JERRY_ATTR_CONST JERRY_ATTR_ALWAYS_INLINE
ecma_is_value_magic_string (ecma_value_t value, /**< ecma value */
lit_magic_string_id_t id) /**< magic string id */
{
return value == ecma_make_magic_string_value (id);
} /* ecma_is_value_magic_string */
/**
* Check if the value is bigint.
*
+1
View File
@@ -234,6 +234,7 @@ bool JERRY_ATTR_CONST ecma_is_value_float_number (ecma_value_t value);
bool JERRY_ATTR_CONST ecma_is_value_number (ecma_value_t value);
bool JERRY_ATTR_CONST ecma_is_value_string (ecma_value_t value);
bool JERRY_ATTR_CONST ecma_is_value_symbol (ecma_value_t value);
bool JERRY_ATTR_CONST ecma_is_value_magic_string (ecma_value_t value, lit_magic_string_id_t id);
bool JERRY_ATTR_CONST ecma_is_value_bigint (ecma_value_t value);
bool JERRY_ATTR_CONST ecma_is_value_prop_name (ecma_value_t value);
bool JERRY_ATTR_CONST ecma_is_value_direct_string (ecma_value_t value);
@@ -1787,19 +1787,16 @@ ecma_op_function_try_to_lazy_instantiate_property (ecma_object_t *object_p, /**<
if (CBC_FUNCTION_GET_TYPE (bytecode_data_p->status_flags) != CBC_FUNCTION_CONSTRUCTOR)
{
ecma_value_t value = *ecma_compiled_code_resolve_function_name (bytecode_data_p);
if (value != ECMA_VALUE_EMPTY)
{
JERRY_ASSERT (ecma_is_value_string (value));
JERRY_ASSERT (ecma_is_value_string (value));
/* Initialize 'name' property */
ecma_property_t *value_prop_p;
ecma_property_value_t *value_p = ecma_create_named_data_property (object_p,
property_name_p,
ECMA_PROPERTY_FLAG_CONFIGURABLE,
&value_prop_p);
value_p->value = ecma_copy_value (value);
return value_prop_p;
}
/* Initialize 'name' property */
ecma_property_t *value_prop_p;
ecma_property_value_t *value_p = ecma_create_named_data_property (object_p,
property_name_p,
ECMA_PROPERTY_FLAG_CONFIGURABLE,
&value_prop_p);
value_p->value = ecma_copy_value (value);
return value_prop_p;
}
}
+6
View File
@@ -277,6 +277,12 @@ void * JERRY_ATTR_PURE jmem_decompress_pointer (uintptr_t compressed_pointer);
#define JMEM_CP_GET_NON_NULL_POINTER_FROM_POINTER_TAG(type, cp_value) \
((type *) (jmem_decompress_pointer ((cp_value & ~JMEM_TAG_MASK) >> JMEM_TAG_SHIFT)))
/**
* Extract tag bits from pointer-tag value
*/
#define JMEM_CP_GET_POINTER_TAG_BITS(cp_value) \
(cp_value & (JMEM_FIRST_TAG_BIT_MASK | JMEM_SECOND_TAG_BIT_MASK | JMEM_THIRD_TAG_BIT_MASK))
/**
* Get value of each tag from specified pointer-tag value
*/
+5 -4
View File
@@ -1358,7 +1358,7 @@ parser_post_processing (parser_context_t *context_p) /**< context */
#if ENABLED (JERRY_ESNEXT)
if (!(context_p->status_flags & PARSER_CLASS_CONSTRUCTOR))
{
*(--base_p) = ECMA_VALUE_EMPTY;
*(--base_p) = ecma_make_magic_string_value (LIT_MAGIC_STRING__EMPTY);
}
if (context_p->argument_length != UINT16_MAX)
@@ -2625,9 +2625,10 @@ parser_check_anonymous_function_declaration (parser_context_t *context_p) /**< c
const ecma_compiled_code_t *bytecode_p;
bytecode_p = (const ecma_compiled_code_t *) (PARSER_GET_LITERAL (literal_index)->u.bytecode_p);
ecma_value_t *func_name_start_p = ecma_compiled_code_resolve_function_name (bytecode_p);
bool is_anon = ecma_is_value_magic_string (*ecma_compiled_code_resolve_function_name (bytecode_p),
LIT_MAGIC_STRING__EMPTY);
return (*func_name_start_p == ECMA_VALUE_EMPTY ? literal_index : PARSER_NAMED_FUNCTION);
return (is_anon ? literal_index : PARSER_NAMED_FUNCTION);
} /* parser_check_anonymous_function_declaration */
/**
@@ -2659,7 +2660,7 @@ parser_compiled_code_set_function_name (parser_context_t *context_p, /**< contex
ecma_value_t *func_name_start_p;
func_name_start_p = ecma_compiled_code_resolve_function_name ((const ecma_compiled_code_t *) bytecode_p);
if (JERRY_UNLIKELY (*func_name_start_p != ECMA_VALUE_EMPTY))
if (JERRY_UNLIKELY (!ecma_is_value_magic_string (*func_name_start_p, LIT_MAGIC_STRING__EMPTY)))
{
return;
}
+4 -1
View File
@@ -1183,7 +1183,10 @@ opfunc_set_home_object (ecma_object_t *func_p, /**< function object */
{
JERRY_ASSERT (!ecma_get_object_is_builtin (func_p));
ECMA_SET_NON_NULL_POINTER_TAG (((ecma_extended_object_t *) func_p)->u.function.scope_cp, parent_env_p, 0);
ecma_extended_object_t *ext_func_p = (ecma_extended_object_t *) func_p;
ECMA_SET_NON_NULL_POINTER_TAG (ext_func_p->u.function.scope_cp,
parent_env_p,
JMEM_CP_GET_POINTER_TAG_BITS (ext_func_p->u.function.scope_cp));
}
} /* opfunc_set_home_object */