@@ -69,14 +69,18 @@ const ecma_error_mapping_t ecma_error_mappings[] =
6969 * Standard ecma-error object constructor.
7070 *
7171 * Note:
72+ * message_string_p can be NULL.
73+ *
74+ * Note:
7275 * calling with ECMA_ERROR_NONE does not make sense thus it will
7376 * cause a fault in the system.
7477 *
7578 * @return pointer to ecma-object representing specified error
7679 * with reference counter set to one.
7780 */
7881ecma_object_t *
79- ecma_new_standard_error (ecma_standard_error_t error_type ) /**< native error type */
82+ ecma_new_standard_error (ecma_standard_error_t error_type , /**< native error type */
83+ ecma_string_t * message_string_p ) /**< message string */
8084{
8185#if ENABLED (JERRY_BUILTIN_ERRORS )
8286 ecma_builtin_id_t prototype_id = ECMA_BUILTIN_ID__COUNT ;
@@ -140,23 +144,45 @@ ecma_new_standard_error (ecma_standard_error_t error_type) /**< native error typ
140144
141145 ((ecma_extended_object_t * ) new_error_obj_p )-> u .class_prop .class_id = LIT_MAGIC_STRING_ERROR_UL ;
142146
143- #if ENABLED (JERRY_LINE_INFO )
144- /* The "stack" identifier is not a magic string. */
145- const char * const stack_id_p = "stack" ;
147+ if (message_string_p != NULL )
148+ {
149+ ecma_property_value_t * prop_value_p ;
150+ prop_value_p = ecma_create_named_data_property (new_error_obj_p ,
151+ ecma_get_magic_string (LIT_MAGIC_STRING_MESSAGE ),
152+ ECMA_PROPERTY_CONFIGURABLE_WRITABLE ,
153+ NULL );
154+
155+ ecma_ref_ecma_string (message_string_p );
156+ prop_value_p -> value = ecma_make_string_value (message_string_p );
157+ }
146158
147- ecma_string_t * stack_str_p = ecma_new_ecma_string_from_utf8 ((const lit_utf8_byte_t * ) stack_id_p , 5 );
159+ /* Avoid calling the decorator function recursively. */
160+ if (JERRY_CONTEXT (error_object_created_callback_p ) != NULL
161+ && !(JERRY_CONTEXT (status_flags ) & ECMA_STATUS_ERROR_UPDATE ))
162+ {
163+ JERRY_CONTEXT (status_flags ) |= ECMA_STATUS_ERROR_UPDATE ;
164+ JERRY_CONTEXT (error_object_created_callback_p ) (ecma_make_object_value (new_error_obj_p ),
165+ JERRY_CONTEXT (error_object_created_callback_user_p ));
166+ JERRY_CONTEXT (status_flags ) &= (uint32_t ) ~ECMA_STATUS_ERROR_UPDATE ;
167+ }
168+ else
169+ {
170+ #if ENABLED (JERRY_LINE_INFO )
171+ /* Default decorator when line info is enabled. */
172+ ecma_string_t * stack_str_p = ecma_get_magic_string (LIT_MAGIC_STRING_STACK );
148173
149- ecma_property_value_t * prop_value_p = ecma_create_named_data_property (new_error_obj_p ,
150- stack_str_p ,
151- ECMA_PROPERTY_CONFIGURABLE_WRITABLE ,
152- NULL );
153- ecma_deref_ecma_string (stack_str_p );
174+ ecma_property_value_t * prop_value_p = ecma_create_named_data_property (new_error_obj_p ,
175+ stack_str_p ,
176+ ECMA_PROPERTY_CONFIGURABLE_WRITABLE ,
177+ NULL );
178+ ecma_deref_ecma_string (stack_str_p );
154179
155- ecma_value_t backtrace_value = vm_get_backtrace (0 , NULL );
180+ ecma_value_t backtrace_value = vm_get_backtrace (0 , NULL );
156181
157- prop_value_p -> value = backtrace_value ;
158- ecma_deref_object (ecma_get_object_from_value (backtrace_value ));
182+ prop_value_p -> value = backtrace_value ;
183+ ecma_deref_object (ecma_get_object_from_value (backtrace_value ));
159184#endif /* ENABLED (JERRY_LINE_INFO) */
185+ }
160186
161187 return new_error_obj_p ;
162188} /* ecma_new_standard_error */
@@ -190,30 +216,6 @@ ecma_get_error_type (ecma_object_t *error_object) /**< possible error object */
190216 return ECMA_ERROR_NONE ;
191217} /* ecma_get_error_type */
192218
193- /**
194- * Standard ecma-error object constructor.
195- *
196- * @return pointer to ecma-object representing specified error
197- * with reference counter set to one.
198- */
199- ecma_object_t *
200- ecma_new_standard_error_with_message (ecma_standard_error_t error_type , /**< native error type */
201- ecma_string_t * message_string_p ) /**< message string */
202- {
203- ecma_object_t * new_error_obj_p = ecma_new_standard_error (error_type );
204-
205- ecma_property_value_t * prop_value_p ;
206- prop_value_p = ecma_create_named_data_property (new_error_obj_p ,
207- ecma_get_magic_string (LIT_MAGIC_STRING_MESSAGE ),
208- ECMA_PROPERTY_CONFIGURABLE_WRITABLE ,
209- NULL );
210-
211- ecma_ref_ecma_string (message_string_p );
212- prop_value_p -> value = ecma_make_string_value (message_string_p );
213-
214- return new_error_obj_p ;
215- } /* ecma_new_standard_error_with_message */
216-
217219/**
218220 * Raise a standard ecma-error with the given type and message.
219221 *
@@ -230,12 +232,12 @@ ecma_raise_standard_error (ecma_standard_error_t error_type, /**< error type */
230232 {
231233 ecma_string_t * error_msg_p = ecma_new_ecma_string_from_utf8 (msg_p ,
232234 lit_zt_utf8_string_size (msg_p ));
233- error_obj_p = ecma_new_standard_error_with_message (error_type , error_msg_p );
235+ error_obj_p = ecma_new_standard_error (error_type , error_msg_p );
234236 ecma_deref_ecma_string (error_msg_p );
235237 }
236238 else
237239 {
238- error_obj_p = ecma_new_standard_error (error_type );
240+ error_obj_p = ecma_new_standard_error (error_type , NULL );
239241 }
240242
241243 jcontext_raise_exception (ecma_make_object_value (error_obj_p ));
@@ -320,7 +322,7 @@ ecma_raise_standard_error_with_format (ecma_standard_error_t error_type, /**< er
320322
321323 ecma_string_t * builder_str_p = ecma_stringbuilder_finalize (& builder );
322324
323- ecma_object_t * error_obj_p = ecma_new_standard_error_with_message (error_type , builder_str_p );
325+ ecma_object_t * error_obj_p = ecma_new_standard_error (error_type , builder_str_p );
324326
325327 ecma_deref_ecma_string (builder_str_p );
326328
0 commit comments