Skip to content

Commit dad2c22

Browse files
committed
Improve error message
JerryScript-DCO-1.0-Signed-off-by: Yanhui Shen [email protected]
1 parent 24e6c3f commit dad2c22

File tree

4 files changed

+47
-15
lines changed

4 files changed

+47
-15
lines changed

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,16 @@ 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, msg_fmt, ...) \
63+
ecma_value_t var_name = ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY); \
64+
do { \
65+
const int msg_size = snprintf (NULL, 0, msg_fmt, __VA_ARGS__) + 1; \
66+
JMEM_DEFINE_LOCAL_ARRAY (msg_p, msg_size, char); \
67+
snprintf (msg_p, (size_t) msg_size, msg_fmt, __VA_ARGS__); \
68+
var_name = ecma_raise_standard_error (error_type, (const lit_utf8_byte_t *) msg_p); \
69+
JMEM_FINALIZE_LOCAL_ARRAY (msg_p); \
70+
} while (0)
71+
6272
/**
6373
* @}
6474
* @}

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,10 @@ 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+
ECMA_STRING_TO_UTF8_STRING (var_name_string_p, var_name_string_utf8_p, var_name_string_size);
56+
ECMA_DEFINE_ERROR_VALUE (error_value, ECMA_ERROR_REFERENCE, "%s is not defined", var_name_string_utf8_p);
57+
ECMA_FINALIZE_UTF8_STRING (var_name_string_utf8_p, var_name_string_size);
58+
return error_value;
5659
}
5760

5861
/* 5. */
@@ -149,7 +152,10 @@ ecma_op_put_value_lex_env_base (ecma_object_t *ref_base_lex_env_p, /**< referenc
149152
/* 3.a. */
150153
if (is_strict)
151154
{
152-
return ecma_raise_reference_error (ECMA_ERR_MSG ("Cannot resolve reference."));
155+
ECMA_STRING_TO_UTF8_STRING (var_name_string_p, var_name_string_utf8_p, var_name_string_size);
156+
ECMA_DEFINE_ERROR_VALUE (error_value, ECMA_ERROR_REFERENCE, "%s is not defined", var_name_string_utf8_p);
157+
ECMA_FINALIZE_UTF8_STRING (var_name_string_utf8_p, var_name_string_size);
158+
return error_value;
153159
}
154160
else
155161
{

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,10 @@ 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+
ECMA_STRING_TO_UTF8_STRING (name_p, name_utf8_p, name_size);
127+
ECMA_DEFINE_ERROR_VALUE (error_value, ECMA_ERROR_REFERENCE, "%s is not defined", name_utf8_p);
128+
ECMA_FINALIZE_UTF8_STRING (name_utf8_p, name_size);
129+
return error_value;
127130
} /* ecma_op_resolve_reference_value */
128131

129132
/**

jerry-core/vm/vm.c

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,16 @@ 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+
ecma_string_t *property_name_p = ecma_get_string_from_value (property);
100+
ECMA_STRING_TO_UTF8_STRING (property_name_p, property_name_utf8_p, property_name_size);
101+
const char *value_type_p = ecma_is_value_undefined (object) ? "undefined" : "null";
102+
ECMA_DEFINE_ERROR_VALUE (error_value,
103+
ECMA_ERROR_TYPE,
104+
"Cannot read property '%s' of %s",
105+
property_name_utf8_p,
106+
value_type_p);
107+
ECMA_FINALIZE_UTF8_STRING (property_name_utf8_p, property_name_size);
108+
return error_value;
100109
}
101110

102111
ecma_value_t prop_to_string_result = ecma_op_to_string (property);
@@ -137,7 +146,18 @@ vm_op_set_value (ecma_value_t object, /**< base object */
137146
if (ECMA_IS_VALUE_ERROR (to_object))
138147
{
139148
ecma_free_value (property);
140-
return to_object;
149+
ecma_free_value (to_object);
150+
151+
ecma_string_t *property_name_p = ecma_get_string_from_value (property);
152+
ECMA_STRING_TO_UTF8_STRING (property_name_p, property_name_utf8_p, property_name_size);
153+
const char *value_type_p = ecma_is_value_undefined (object) ? "undefined" : "null";
154+
ECMA_DEFINE_ERROR_VALUE (error_value,
155+
ECMA_ERROR_TYPE,
156+
"Cannot set property '%s' of %s",
157+
property_name_utf8_p,
158+
value_type_p);
159+
ECMA_FINALIZE_UTF8_STRING (property_name_utf8_p, property_name_size);
160+
return error_value;
141161
}
142162

143163
object = to_object;
@@ -1076,16 +1096,9 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */
10761096
ref_base_lex_env_p = ecma_op_resolve_reference_base (frame_ctx_p->lex_env_p,
10771097
name_p);
10781098

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-
}
1099+
result = ecma_op_get_value_lex_env_base (ref_base_lex_env_p,
1100+
name_p,
1101+
is_strict);
10891102

10901103
if (ECMA_IS_VALUE_ERROR (result))
10911104
{

0 commit comments

Comments
 (0)