2525#include "ecma-objects-general.h"
2626#include "ecma-objects-arguments.h"
2727#include "ecma-proxy-object.h"
28+ #include "ecma-symbol-object.h"
2829#include "ecma-try-catch-macro.h"
2930#include "jcontext.h"
3031
@@ -46,23 +47,77 @@ ecma_op_resource_name (const ecma_compiled_code_t *bytecode_header_p)
4647{
4748 JERRY_ASSERT (bytecode_header_p != NULL );
4849
49- uint8_t * byte_p = (uint8_t * ) bytecode_header_p ;
50- byte_p += ((size_t ) bytecode_header_p -> size ) << JMEM_ALIGNMENT_LOG ;
51-
52- ecma_value_t * resource_name_p = (ecma_value_t * ) byte_p ;
53- resource_name_p -= ecma_compiled_code_get_formal_params (bytecode_header_p );
50+ ecma_value_t * base_p = ecma_compiled_code_resolve_arguments_start (bytecode_header_p );
5451
5552#if ENABLED (JERRY_ES2015 )
5653 if (bytecode_header_p -> status_flags & CBC_CODE_FLAG_HAS_TAGGED_LITERALS )
5754 {
58- resource_name_p -- ;
55+ base_p -- ;
56+ }
57+
58+ if (!(bytecode_header_p -> status_flags & CBC_CODE_FLAGS_CLASS_CONSTRUCTOR ))
59+ {
60+ base_p -- ;
5961 }
6062#endif /* ENABLED (JERRY_ES2015) */
6163
62- return resource_name_p [-1 ];
64+ return base_p [-1 ];
6365} /* ecma_op_resource_name */
6466#endif /* ENABLED (JERRY_LINE_INFO) || ENABLED (JERRY_ES2015_MODULE_SYSTEM) */
6567
68+ #if ENABLED (JERRY_ES2015 )
69+ /**
70+ * SetFunctionName operation
71+ *
72+ * See also: ECMAScript v6, 9.2.1.1
73+ *
74+ * @return resource name as ecma-string
75+ */
76+ ecma_value_t
77+ ecma_op_function_form_name (ecma_value_t prop_name , /**< property name */
78+ char * prefix_p , /**< prefix */
79+ lit_utf8_size_t prefix_size ) /**< prefix length */
80+ {
81+ ecma_string_t * prop_name_p = ecma_get_prop_name_from_value (prop_name );
82+
83+ /* 4. */
84+ if (ecma_prop_name_is_symbol (prop_name_p ))
85+ {
86+ /* .a */
87+ ecma_string_t * string_desc_p = ecma_get_symbol_description (prop_name_p );
88+
89+ /* .b */
90+ if (ecma_string_is_empty (string_desc_p ))
91+ {
92+ prop_name_p = string_desc_p ;
93+ }
94+ /* .c */
95+ else
96+ {
97+ ecma_stringbuilder_t builder = ecma_stringbuilder_create_raw ((lit_utf8_byte_t * ) "[" , 1 );
98+ ecma_stringbuilder_append (& builder , string_desc_p );
99+ ecma_stringbuilder_append_byte (& builder , (lit_utf8_byte_t ) LIT_CHAR_RIGHT_SQUARE );
100+ prop_name_p = ecma_stringbuilder_finalize (& builder );
101+ }
102+ }
103+ else
104+ {
105+ ecma_ref_ecma_string (prop_name_p );
106+ }
107+
108+ /* 5. */
109+ if (JERRY_UNLIKELY (prefix_p != NULL ))
110+ {
111+ ecma_stringbuilder_t builder = ecma_stringbuilder_create_raw ((lit_utf8_byte_t * ) prefix_p , prefix_size );
112+ ecma_stringbuilder_append (& builder , prop_name_p );
113+ ecma_deref_ecma_string (prop_name_p );
114+ prop_name_p = ecma_stringbuilder_finalize (& builder );
115+ }
116+
117+ return ecma_make_string_value (prop_name_p );
118+ } /* ecma_op_function_form_name */
119+ #endif /* ENABLED (JERRY_ES2015) */
120+
66121/**
67122 * IsCallable operation.
68123 *
@@ -345,6 +400,12 @@ ecma_op_create_dynamic_function (const ecma_value_t *arguments_list_p, /**< argu
345400 {
346401 JERRY_ASSERT (ecma_is_value_true (ret_value ));
347402
403+ #if ENABLED (JERRY_ES2015 )
404+ ecma_value_t * func_name_p ;
405+ func_name_p = ecma_compiled_code_resolve_function_name ((const ecma_compiled_code_t * ) bytecode_data_p );
406+ * func_name_p = ecma_make_magic_string_value (LIT_MAGIC_STRING_ANONYMOUS );
407+ #endif /* ENABLED (JERRY_ES2015) */
408+
348409 ecma_object_t * global_env_p = ecma_get_global_environment ();
349410 ecma_builtin_id_t fallback_proto = ECMA_BUILTIN_ID_FUNCTION_PROTOTYPE ;
350411
@@ -1417,6 +1478,34 @@ ecma_op_function_try_to_lazy_instantiate_property (ecma_object_t *object_p, /**<
14171478
14181479 return NULL ;
14191480 }
1481+
1482+ if (ecma_compare_ecma_string_to_magic_id (property_name_p , LIT_MAGIC_STRING_NAME ))
1483+ {
1484+ ecma_extended_object_t * ext_func_p = (ecma_extended_object_t * ) object_p ;
1485+ if (!ECMA_GET_SECOND_BIT_FROM_POINTER_TAG (ext_func_p -> u .function .scope_cp ))
1486+ {
1487+ /* Set tag bit to represent initialized 'name' property */
1488+ ECMA_SET_SECOND_BIT_TO_POINTER_TAG (ext_func_p -> u .function .scope_cp );
1489+ const ecma_compiled_code_t * bytecode_data_p = ecma_op_function_get_compiled_code (ext_func_p );
1490+
1491+ ecma_value_t value = * ecma_compiled_code_resolve_function_name (bytecode_data_p );
1492+ if (value != ECMA_VALUE_ANONYMOUS )
1493+ {
1494+ JERRY_ASSERT (ecma_is_value_string (value ));
1495+
1496+ /* Initialize 'name' property */
1497+ ecma_property_t * value_prop_p ;
1498+ ecma_property_value_t * value_p = ecma_create_named_data_property (object_p ,
1499+ property_name_p ,
1500+ ECMA_PROPERTY_FLAG_CONFIGURABLE ,
1501+ & value_prop_p );
1502+ value_p -> value = ecma_copy_value (value );
1503+ return value_prop_p ;
1504+ }
1505+ }
1506+
1507+ return NULL ;
1508+ }
14201509#endif /* ENABLED (JERRY_ES2015) */
14211510
14221511 if (ecma_compare_ecma_string_to_magic_id (property_name_p , LIT_MAGIC_STRING_PROTOTYPE )
0 commit comments