Skip to content

Commit 7076e72

Browse files
committed
Improve error message
JerryScript-DCO-1.0-Signed-off-by: Yanhui Shen [email protected]
1 parent b02ef67 commit 7076e72

File tree

8 files changed

+153
-17
lines changed

8 files changed

+153
-17
lines changed

jerry-core/ecma/base/ecma-helpers-string.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -698,6 +698,31 @@ ecma_concat_ecma_strings (ecma_string_t *string1_p, /**< first ecma-string */
698698
return string_desc_p;
699699
} /* ecma_concat_ecma_strings */
700700

701+
/**
702+
* Join an array of ecma-strings and release them.
703+
*
704+
* @return a newly joined ecma-string
705+
*/
706+
ecma_string_t *
707+
ecma_join_ecma_strings (ecma_string_t **string_array, uint32_t n)
708+
{
709+
JERRY_ASSERT (string_array != NULL);
710+
JERRY_ASSERT (n > 0);
711+
712+
uint32_t i = 0;
713+
714+
for (; i < n - 1; ++i)
715+
{
716+
ecma_string_t *string1_p = string_array[i];
717+
ecma_string_t *string2_p = string_array[i + 1];
718+
string_array[i + 1] = ecma_concat_ecma_strings (string1_p, string2_p);
719+
ecma_deref_ecma_string (string1_p);
720+
ecma_deref_ecma_string (string2_p);
721+
}
722+
723+
return string_array[i];
724+
} /* ecma_join_ecma_strings */
725+
701726
/**
702727
* Increase reference counter of ecma-string.
703728
*/

jerry-core/ecma/base/ecma-helpers.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@ ecma_string_t *ecma_new_ecma_string_from_magic_string_id (lit_magic_string_id_t
172172
ecma_string_t *ecma_new_ecma_string_from_magic_string_ex_id (lit_magic_string_ex_id_t id);
173173
ecma_string_t *ecma_new_ecma_length_string ();
174174
ecma_string_t *ecma_concat_ecma_strings (ecma_string_t *string1_p, ecma_string_t *string2_p);
175+
ecma_string_t *ecma_join_ecma_strings (ecma_string_t **string_array, uint32_t n);
175176
void ecma_ref_ecma_string (ecma_string_t *string_p);
176177
void ecma_deref_ecma_string (ecma_string_t *string_p);
177178
ecma_number_t ecma_string_to_number (const ecma_string_t *str_p);

jerry-core/ecma/operations/ecma-exceptions.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,13 @@ ecma_value_t ecma_raise_syntax_error (const char *msg_p);
5959
ecma_value_t ecma_raise_type_error (const char *msg_p);
6060
ecma_value_t ecma_raise_uri_error (const char *msg_p);
6161

62+
#define ECMA_DEFINE_ERROR_VALUE(var_name, error_type, error_msg_p) \
63+
ecma_value_t var_name = ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY); \
64+
do { \
65+
ecma_object_t *error_obj_p = ecma_new_standard_error_with_message (error_type, error_msg_p); \
66+
var_name = ecma_make_error_obj_value (error_obj_p); \
67+
} while (0)
68+
6269
/**
6370
* @}
6471
* @}

jerry-core/ecma/operations/ecma-get-put-value.c

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,22 @@ ecma_op_get_value_lex_env_base (ecma_object_t *ref_base_lex_env_p, /**< referenc
5252
/* 3. */
5353
if (unlikely (is_unresolvable_reference))
5454
{
55-
return ecma_raise_reference_error (ECMA_ERR_MSG ("Cannot resolve reference."));
55+
#ifdef JERRY_ENABLE_ERROR_MESSAGES
56+
ecma_ref_ecma_string (var_name_string_p);
57+
ecma_string_t *string_array[] =
58+
{
59+
var_name_string_p,
60+
ecma_get_magic_string (LIT_MAGIC_STRING_SPACE_CHAR),
61+
ecma_get_magic_string (LIT_MAGIC_STRING_ERROR_IS_NOT_DEFINED),
62+
};
63+
64+
ecma_string_t *msg_str_p = ecma_join_ecma_strings (string_array, JERRY_NUM_OF_ELEMENTS (string_array));
65+
ECMA_DEFINE_ERROR_VALUE (error_value, ECMA_ERROR_REFERENCE, msg_str_p);
66+
ecma_deref_ecma_string (msg_str_p);
67+
#else /* !JERRY_ENABLE_ERROR_MESSAGES */
68+
ecma_value_t error_value = ecma_raise_reference_error (NULL);
69+
#endif /* JERRY_ENABLE_ERROR_MESSAGES */
70+
return error_value;
5671
}
5772

5873
/* 5. */
@@ -149,7 +164,22 @@ ecma_op_put_value_lex_env_base (ecma_object_t *ref_base_lex_env_p, /**< referenc
149164
/* 3.a. */
150165
if (is_strict)
151166
{
152-
return ecma_raise_reference_error (ECMA_ERR_MSG ("Cannot resolve reference."));
167+
#ifdef JERRY_ENABLE_ERROR_MESSAGES
168+
ecma_ref_ecma_string (var_name_string_p);
169+
ecma_string_t *string_array[] =
170+
{
171+
var_name_string_p,
172+
ecma_get_magic_string (LIT_MAGIC_STRING_SPACE_CHAR),
173+
ecma_get_magic_string (LIT_MAGIC_STRING_ERROR_IS_NOT_DEFINED),
174+
};
175+
176+
ecma_string_t *msg_str_p = ecma_join_ecma_strings (string_array, JERRY_NUM_OF_ELEMENTS (string_array));
177+
ECMA_DEFINE_ERROR_VALUE (error_value, ECMA_ERROR_REFERENCE, msg_str_p);
178+
ecma_deref_ecma_string (msg_str_p);
179+
#else /* !JERRY_ENABLE_ERROR_MESSAGES */
180+
ecma_value_t error_value = ecma_raise_reference_error (NULL);
181+
#endif /* JERRY_ENABLE_ERROR_MESSAGES */
182+
return error_value;
153183
}
154184
else
155185
{

jerry-core/ecma/operations/ecma-reference.c

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,22 @@ ecma_op_resolve_reference_value (ecma_object_t *lex_env_p, /**< starting lexical
123123
lex_env_p = ecma_get_lex_env_outer_reference (lex_env_p);
124124
}
125125

126-
return ecma_raise_reference_error (ECMA_ERR_MSG ("Cannot resolve reference."));
126+
#ifdef JERRY_ENABLE_ERROR_MESSAGES
127+
ecma_ref_ecma_string (name_p);
128+
ecma_string_t *string_array[] =
129+
{
130+
name_p,
131+
ecma_get_magic_string (LIT_MAGIC_STRING_SPACE_CHAR),
132+
ecma_get_magic_string (LIT_MAGIC_STRING_ERROR_IS_NOT_DEFINED),
133+
};
134+
135+
ecma_string_t *msg_str_p = ecma_join_ecma_strings (string_array, JERRY_NUM_OF_ELEMENTS (string_array));
136+
ECMA_DEFINE_ERROR_VALUE (error_value, ECMA_ERROR_REFERENCE, msg_str_p);
137+
ecma_deref_ecma_string (msg_str_p);
138+
#else /* !JERRY_ENABLE_ERROR_MESSAGES */
139+
ecma_value_t error_value = ecma_raise_reference_error (NULL);
140+
#endif /* JERRY_ENABLE_ERROR_MESSAGES */
141+
return error_value;
127142
} /* ecma_op_resolve_reference_value */
128143

129144
/**

jerry-core/jrt/jrt.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,4 +151,9 @@ void __noreturn jerry_fatal (jerry_fatal_code_t code);
151151
#define JERRY_MIN(v1, v2) (((v1) < (v2)) ? (v1) : (v2))
152152
#define JERRY_MAX(v1, v2) (((v1) < (v2)) ? (v2) : (v1))
153153

154+
/*
155+
* Number of elements in array
156+
*/
157+
#define JERRY_NUM_OF_ELEMENTS(array) (sizeof (array) / sizeof ((array)[0]))
158+
154159
#endif /* !JRT_H */

jerry-core/lit/lit-magic-strings.inc.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (1, LIT_MAGIC_STRING_NEW_LINE_CHAR)
2727
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_NEW_LINE_CHAR, "\n")
2828
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_SPACE_CHAR, " ")
2929
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_DOUBLE_QUOTE_CHAR,"\"")
30+
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_SINGLE_QUOTE_CHAR,"'")
3031
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_LEFT_PARENTHESIS_CHAR, "(")
3132
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_RIGHT_PARENTHESIS_CHAR, ")")
3233
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_COMMA_CHAR, ",")
@@ -262,6 +263,7 @@ LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_DEFINE_PROPERTY_UL, "defineProperty")
262263
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_GET_PROTOTYPE_OF_UL, "getPrototypeOf")
263264
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_GET_UTC_FULL_YEAR_UL, "getUTCFullYear")
264265
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_HAS_OWN_PROPERTY_UL, "hasOwnProperty")
266+
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_ERROR_IS_NOT_DEFINED, "is not defined")
265267
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_SET_UTC_FULL_YEAR_UL, "setUTCFullYear")
266268
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_TO_LOCALE_STRING_UL, "toLocaleString")
267269
LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (15, LIT_MAGIC_STRING_GET_MILLISECONDS_UL)
@@ -285,9 +287,11 @@ LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_GET_UTC_MILLISECONDS_UL, "getUTCMilliseco
285287
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_SET_UTC_MILLISECONDS_UL, "setUTCMilliseconds")
286288
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_TO_LOCALE_DATE_STRING_UL, "toLocaleDateString")
287289
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_TO_LOCALE_TIME_STRING_UL, "toLocaleTimeString")
288-
LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (19, LIT_MAGIC_STRING_GET_OWN_PROPERTY_NAMES_UL)
290+
LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (19, LIT_MAGIC_STRING_ERROR_CANNOT_SET_PROPERTY)
291+
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_ERROR_CANNOT_SET_PROPERTY, "Cannot set property")
289292
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_GET_OWN_PROPERTY_NAMES_UL, "getOwnPropertyNames")
290-
LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (20, LIT_MAGIC_STRING_PROPERTY_IS_ENUMERABLE_UL)
293+
LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (20, LIT_MAGIC_STRING_ERROR_CANNOT_READ_PROPERTY)
294+
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_ERROR_CANNOT_READ_PROPERTY, "Cannot read property")
291295
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_PROPERTY_IS_ENUMERABLE_UL, "propertyIsEnumerable")
292296
LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (21, LIT_MAGIC_STRING_GET_OWN_PROPERTY_DESCRIPTOR_UL)
293297
LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (22, LIT_MAGIC_STRING_GET_OWN_PROPERTY_DESCRIPTOR_UL)

jerry-core/vm/vm.c

Lines changed: 61 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,33 @@ vm_op_get_value (ecma_value_t object, /**< base object */
9696

9797
if (unlikely (ecma_is_value_undefined (object) || ecma_is_value_null (object)))
9898
{
99-
return ecma_raise_type_error (ECMA_ERR_MSG ("Base object cannot be null or undefined."));
99+
#ifdef JERRY_ENABLE_ERROR_MESSAGES
100+
ecma_value_t obj_to_string_result = ecma_op_to_string (object);
101+
ecma_string_t *obj_name_p = ecma_get_string_from_value (obj_to_string_result);
102+
103+
ecma_value_t prop_to_string_result = ecma_op_to_string (property);
104+
ecma_string_t *property_name_p = ecma_get_string_from_value (prop_to_string_result);
105+
106+
ecma_string_t *string_array[] =
107+
{
108+
ecma_get_magic_string (LIT_MAGIC_STRING_ERROR_CANNOT_READ_PROPERTY),
109+
ecma_get_magic_string (LIT_MAGIC_STRING_SPACE_CHAR),
110+
ecma_get_magic_string (LIT_MAGIC_STRING_SINGLE_QUOTE_CHAR),
111+
property_name_p,
112+
ecma_get_magic_string (LIT_MAGIC_STRING_SINGLE_QUOTE_CHAR),
113+
ecma_get_magic_string (LIT_MAGIC_STRING_SPACE_CHAR),
114+
ecma_get_magic_string (LIT_MAGIC_STRING_OF),
115+
ecma_get_magic_string (LIT_MAGIC_STRING_SPACE_CHAR),
116+
obj_name_p,
117+
};
118+
119+
ecma_string_t *msg_str_p = ecma_join_ecma_strings (string_array, JERRY_NUM_OF_ELEMENTS (string_array));
120+
ECMA_DEFINE_ERROR_VALUE (error_value, ECMA_ERROR_TYPE, msg_str_p);
121+
ecma_deref_ecma_string (msg_str_p);
122+
#else /* !JERRY_ENABLE_ERROR_MESSAGES */
123+
ecma_value_t error_value = ecma_raise_type_error (NULL);
124+
#endif /* JERRY_ENABLE_ERROR_MESSAGES */
125+
return error_value;
100126
}
101127

102128
ecma_value_t prop_to_string_result = ecma_op_to_string (property);
@@ -136,8 +162,38 @@ vm_op_set_value (ecma_value_t object, /**< base object */
136162

137163
if (ECMA_IS_VALUE_ERROR (to_object))
138164
{
165+
ecma_free_value (to_object);
166+
167+
#ifdef JERRY_ENABLE_ERROR_MESSAGES
168+
ecma_value_t obj_to_string_result = ecma_op_to_string (object);
169+
ecma_string_t *obj_name_p = ecma_get_string_from_value (obj_to_string_result);
170+
171+
ecma_value_t prop_to_string_result = ecma_op_to_string (property);
172+
ecma_string_t *property_name_p = ecma_get_string_from_value (prop_to_string_result);
173+
174+
ecma_string_t *string_array[] =
175+
{
176+
ecma_get_magic_string (LIT_MAGIC_STRING_ERROR_CANNOT_SET_PROPERTY),
177+
ecma_get_magic_string (LIT_MAGIC_STRING_SPACE_CHAR),
178+
ecma_get_magic_string (LIT_MAGIC_STRING_SINGLE_QUOTE_CHAR),
179+
property_name_p,
180+
ecma_get_magic_string (LIT_MAGIC_STRING_SINGLE_QUOTE_CHAR),
181+
ecma_get_magic_string (LIT_MAGIC_STRING_SPACE_CHAR),
182+
ecma_get_magic_string (LIT_MAGIC_STRING_OF),
183+
ecma_get_magic_string (LIT_MAGIC_STRING_SPACE_CHAR),
184+
obj_name_p,
185+
};
186+
187+
ecma_string_t *msg_str_p = ecma_join_ecma_strings (string_array, JERRY_NUM_OF_ELEMENTS (string_array));
188+
ECMA_DEFINE_ERROR_VALUE (error_value, ECMA_ERROR_TYPE, msg_str_p);
189+
ecma_deref_ecma_string (msg_str_p);
190+
#else /* !JERRY_ENABLE_ERROR_MESSAGES */
191+
ecma_value_t error_value = ecma_raise_type_error (NULL);
192+
#endif /* JERRY_ENABLE_ERROR_MESSAGES */
193+
139194
ecma_free_value (property);
140-
return to_object;
195+
196+
return error_value;
141197
}
142198

143199
object = to_object;
@@ -1076,16 +1132,9 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */
10761132
ref_base_lex_env_p = ecma_op_resolve_reference_base (frame_ctx_p->lex_env_p,
10771133
name_p);
10781134

1079-
if (ref_base_lex_env_p != NULL)
1080-
{
1081-
result = ecma_op_get_value_lex_env_base (ref_base_lex_env_p,
1082-
name_p,
1083-
is_strict);
1084-
}
1085-
else
1086-
{
1087-
result = ecma_raise_reference_error (ECMA_ERR_MSG ("Cannot resolve reference."));
1088-
}
1135+
result = ecma_op_get_value_lex_env_base (ref_base_lex_env_p,
1136+
name_p,
1137+
is_strict);
10891138

10901139
if (ECMA_IS_VALUE_ERROR (result))
10911140
{

0 commit comments

Comments
 (0)