Skip to content

Commit c304b9a

Browse files
dbatyaifbmrk
andauthored
Include file path in Syntax error messages (#2941)
When using ES6 modules it was not possible to identify which module an error originates from. This PR changes the error message to also include the file path using the file:line:column format, and updates the source context printing for unhandled exceptions to use the correct file. Co-authored-by: Marko Fabo <mfabo@inf.u-szeged.hu> JerryScript-DCO-1.0-Signed-off-by: Dániel Bátyai dbatyai@inf.u-szeged.hu
1 parent 3f47e1b commit c304b9a

File tree

12 files changed

+198
-117
lines changed

12 files changed

+198
-117
lines changed

jerry-core/api/jerry.c

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -396,10 +396,17 @@ jerry_parse (const jerry_char_t *resource_name_p, /**< resource name (usually a
396396
#if ENABLED (JERRY_PARSER)
397397
jerry_assert_api_available ();
398398

399-
#if ENABLED (JERRY_LINE_INFO)
400-
JERRY_CONTEXT (resource_name) = ecma_find_or_create_literal_string (resource_name_p,
401-
(lit_utf8_size_t) resource_name_length);
402-
#endif /* ENABLED (JERRY_LINE_INFO) */
399+
#if ENABLED (JERRY_LINE_INFO) || ENABLED (JERRY_ERROR_MESSAGES)
400+
if (resource_name_length == 0)
401+
{
402+
JERRY_CONTEXT (resource_name) = ecma_make_magic_string_value (LIT_MAGIC_STRING_RESOURCE_ANON);
403+
}
404+
else
405+
{
406+
JERRY_CONTEXT (resource_name) = ecma_find_or_create_literal_string (resource_name_p,
407+
(lit_utf8_size_t) resource_name_length);
408+
}
409+
#endif /* ENABLED (JERRY_LINE_INFO) || ENABLED (JERRY_ERROR_MESSAGES) */
403410

404411
ecma_compiled_code_t *bytecode_data_p;
405412
ecma_value_t parse_status;
@@ -468,10 +475,17 @@ jerry_parse_function (const jerry_char_t *resource_name_p, /**< resource name (u
468475
ecma_compiled_code_t *bytecode_data_p;
469476
ecma_value_t parse_status;
470477

471-
#if ENABLED (JERRY_LINE_INFO)
472-
JERRY_CONTEXT (resource_name) = ecma_find_or_create_literal_string (resource_name_p,
473-
(lit_utf8_size_t) resource_name_length);
474-
#endif /* ENABLED (JERRY_LINE_INFO) */
478+
#if ENABLED (JERRY_LINE_INFO) || ENABLED (JERRY_ERROR_MESSAGES)
479+
if (resource_name_length == 0)
480+
{
481+
JERRY_CONTEXT (resource_name) = ecma_make_magic_string_value (LIT_MAGIC_STRING_RESOURCE_ANON);
482+
}
483+
else
484+
{
485+
JERRY_CONTEXT (resource_name) = ecma_find_or_create_literal_string (resource_name_p,
486+
(lit_utf8_size_t) resource_name_length);
487+
}
488+
#endif /* ENABLED (JERRY_LINE_INFO) || ENABLED (JERRY_ERROR_MESSAGES) */
475489

476490
if (arg_list_p == NULL)
477491
{

jerry-core/ecma/base/ecma-module.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -695,6 +695,21 @@ ecma_module_parse (ecma_module_t *module_p) /**< module */
695695
module_p->context_p->parent_p = JERRY_CONTEXT (module_top_context_p);
696696
JERRY_CONTEXT (module_top_context_p) = module_p->context_p;
697697

698+
#if ENABLED (JERRY_DEBUGGER) && ENABLED (JERRY_PARSER)
699+
if (JERRY_CONTEXT (debugger_flags) & JERRY_DEBUGGER_CONNECTED)
700+
{
701+
jerry_debugger_send_string (JERRY_DEBUGGER_SOURCE_CODE_NAME,
702+
JERRY_DEBUGGER_NO_SUBTYPE,
703+
script_path_p,
704+
script_path_size - 1);
705+
}
706+
#endif /* ENABLED (JERRY_DEBUGGER) && ENABLED (JERRY_PARSER) */
707+
708+
#if ENABLED (JERRY_LINE_INFO) || ENABLED (JERRY_ERROR_MESSAGES)
709+
JERRY_CONTEXT (resource_name) = ecma_make_string_value (ecma_new_ecma_string_from_utf8 (script_path_p,
710+
script_path_size - 1));
711+
#endif /* ENABLED (JERRY_LINE_INFO) || ENABLED (JERRY_ERROR_MESSAGES) */
712+
698713
ecma_compiled_code_t *bytecode_data_p;
699714
ecma_value_t ret_value = parser_parse_script (NULL,
700715
0,

jerry-core/ecma/builtin-objects/ecma-builtin-function.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@
2424
#include "js-parser.h"
2525
#include "lit-magic-strings.h"
2626

27-
#if ENABLED (JERRY_LINE_INFO)
27+
#if ENABLED (JERRY_LINE_INFO) || ENABLED (JERRY_ERROR_MESSAGES)
2828
#include "jcontext.h"
29-
#endif /* ENABLED (JERRY_LINE_INFO) */
29+
#endif /* ENABLED (JERRY_LINE_INFO) || ENABLED (JERRY_ERROR_MESSAGES) */
3030

3131
#define ECMA_BUILTINS_INTERNAL
3232
#include "ecma-builtins-internal.h"
@@ -159,9 +159,9 @@ ecma_builtin_function_dispatch_construct (const ecma_value_t *arguments_list_p,
159159
ECMA_STRING_TO_UTF8_STRING (arguments_str_p, arguments_buffer_p, arguments_buffer_size);
160160
ECMA_STRING_TO_UTF8_STRING (function_body_str_p, function_body_buffer_p, function_body_buffer_size);
161161

162-
#if ENABLED (JERRY_LINE_INFO)
163-
JERRY_CONTEXT (resource_name) = ecma_make_magic_string_value (LIT_MAGIC_STRING__EMPTY);
164-
#endif /* ENABLED (JERRY_LINE_INFO) */
162+
#if ENABLED (JERRY_LINE_INFO) || ENABLED (JERRY_ERROR_MESSAGES)
163+
JERRY_CONTEXT (resource_name) = ecma_make_magic_string_value (LIT_MAGIC_STRING_RESOURCE_ANON);
164+
#endif /* ENABLED (JERRY_LINE_INFO) || ENABLED (JERRY_ERROR_MESSAGES) */
165165

166166
ecma_compiled_code_t *bytecode_data_p = NULL;
167167

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,9 @@ ecma_op_eval_chars_buffer (const lit_utf8_byte_t *code_p, /**< code characters b
9191
parse_opts &= (uint32_t) ~ECMA_PARSE_STRICT_MODE;
9292
}
9393

94-
#if ENABLED (JERRY_LINE_INFO)
95-
JERRY_CONTEXT (resource_name) = ecma_make_magic_string_value (LIT_MAGIC_STRING__EMPTY);
96-
#endif /* ENABLED (JERRY_LINE_INFO) */
94+
#if ENABLED (JERRY_LINE_INFO) || ENABLED (JERRY_ERROR_MESSAGES)
95+
JERRY_CONTEXT (resource_name) = ecma_make_magic_string_value (LIT_MAGIC_STRING_RESOURCE_EVAL);
96+
#endif /* ENABLED (JERRY_LINE_INFO) || ENABLED (JERRY_ERROR_MESSAGES) */
9797

9898
#if ENABLED (JERRY_ES2015_CLASS)
9999
ECMA_CLEAR_SUPER_EVAL_PARSER_OPTS ();

jerry-core/jcontext/jcontext.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,9 +191,9 @@ struct jerry_context_t
191191
uint8_t debugger_max_receive_size; /**< maximum amount of data that can be received */
192192
#endif /* ENABLED (JERRY_DEBUGGER) */
193193

194-
#if ENABLED (JERRY_LINE_INFO)
194+
#if ENABLED (JERRY_LINE_INFO) || ENABLED (JERRY_ERROR_MESSAGES)
195195
ecma_value_t resource_name; /**< resource name (usually a file name) */
196-
#endif /* ENABLED (JERRY_LINE_INFO) */
196+
#endif /* ENABLED (JERRY_LINE_INFO) || ENABLED (JERRY_ERROR_MESSAGES) */
197197

198198
#if ENABLED (JERRY_MEM_STATS)
199199
jmem_heap_stats_t jmem_heap_stats; /**< heap's memory usage statistics */

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

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,9 @@ LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_SLICE, "slice")
239239
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_SPLIT, "split")
240240
#endif
241241
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_VALUE, "value")
242+
#if ENABLED (JERRY_LINE_INFO) || ENABLED (JERRY_ERROR_MESSAGES) && ENABLED (JERRY_PARSER)
243+
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_RESOURCE_EVAL, "<eval>")
244+
#endif
242245
#if ENABLED (JERRY_BUILTIN_MATH)
243246
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_LOG10E_U, "LOG10E")
244247
#endif
@@ -566,6 +569,9 @@ LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_SET_UTC_DATE_UL, "setUTCDate")
566569
#if ENABLED (JERRY_BUILTIN_STRING) && ENABLED (JERRY_ES2015_BUILTIN)
567570
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_STARTS_WITH, "startsWith")
568571
#endif
572+
#if ENABLED (JERRY_LINE_INFO) || ENABLED (JERRY_ERROR_MESSAGES)
573+
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_RESOURCE_ANON, "<anonymous>")
574+
#endif
569575
#if ENABLED (JERRY_ES2015_BUILTIN_DATAVIEW) \
570576
|| ENABLED (JERRY_ES2015_BUILTIN_TYPEDARRAY)
571577
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_ARRAY_BUFFER_UL, "ArrayBuffer")
@@ -757,7 +763,9 @@ LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (4, LIT_MAGIC_STRING_EMPTY_NON_CAPTURE_G
757763
LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (4, LIT_MAGIC_STRING_DATE_UL)
758764
#endif
759765
LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (5, LIT_MAGIC_STRING_ARRAY_UL)
760-
#if ENABLED (JERRY_BUILTIN_MATH)
766+
#if ENABLED (JERRY_LINE_INFO) || ENABLED (JERRY_ERROR_MESSAGES) && ENABLED (JERRY_PARSER)
767+
LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (6, LIT_MAGIC_STRING_RESOURCE_EVAL)
768+
#elif ENABLED (JERRY_BUILTIN_MATH)
761769
LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (6, LIT_MAGIC_STRING_LOG10E_U)
762770
#else
763771
LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (6, LIT_MAGIC_STRING_NUMBER_UL)
@@ -783,7 +791,9 @@ LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (10, LIT_MAGIC_STRING_CHAR_CODE_AT_UL)
783791
#else
784792
LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (10, LIT_MAGIC_STRING_ENUMERABLE)
785793
#endif
786-
#if ENABLED (JERRY_ES2015_BUILTIN_DATAVIEW) \
794+
#if ENABLED (JERRY_LINE_INFO) || ENABLED (JERRY_ERROR_MESSAGES)
795+
LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (11, LIT_MAGIC_STRING_RESOURCE_ANON)
796+
#elif ENABLED (JERRY_ES2015_BUILTIN_DATAVIEW) \
787797
|| ENABLED (JERRY_ES2015_BUILTIN_TYPEDARRAY)
788798
LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (11, LIT_MAGIC_STRING_ARRAY_BUFFER_UL)
789799
#elif ENABLED (JERRY_BUILTIN_ERRORS)

jerry-core/lit/lit-magic-strings.ini

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ LIT_MAGIC_STRING_SHIFT = "shift"
112112
LIT_MAGIC_STRING_SLICE = "slice"
113113
LIT_MAGIC_STRING_SPLIT = "split"
114114
LIT_MAGIC_STRING_VALUE = "value"
115+
LIT_MAGIC_STRING_RESOURCE_EVAL = "<eval>"
115116
LIT_MAGIC_STRING_LOG10E_U = "LOG10E"
116117
LIT_MAGIC_STRING_NUMBER_UL = "Number"
117118
LIT_MAGIC_STRING_OBJECT_UL = "Object"
@@ -247,6 +248,7 @@ LIT_MAGIC_STRING_SET_MINUTES_UL = "setMinutes"
247248
LIT_MAGIC_STRING_SET_SECONDS_UL = "setSeconds"
248249
LIT_MAGIC_STRING_SET_UTC_DATE_UL = "setUTCDate"
249250
LIT_MAGIC_STRING_STARTS_WITH = "startsWith"
251+
LIT_MAGIC_STRING_RESOURCE_ANON = "<anonymous>"
250252
LIT_MAGIC_STRING_ARRAY_BUFFER_UL = "ArrayBuffer"
251253
LIT_MAGIC_STRING_SYNTAX_ERROR_UL = "SyntaxError"
252254
LIT_MAGIC_STRING_UINT16_ARRAY_UL = "Uint16Array"

jerry-core/parser/js/js-parser.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2962,8 +2962,9 @@ parser_parse_script (const uint8_t *arg_list_p, /**< function argument list */
29622962
ecma_value_t col_str_val = ecma_make_uint32_value (parser_error.column);
29632963

29642964
ecma_value_t error_value = ecma_raise_standard_error_with_format (ECMA_ERROR_SYNTAX,
2965-
"% [line: %, column: %]",
2965+
"% [%:%:%]",
29662966
err_str_val,
2967+
JERRY_CONTEXT (resource_name),
29672968
line_str_val,
29682969
col_str_val);
29692970

jerry-main/main-unix.c

Lines changed: 27 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -158,46 +158,37 @@ print_unhandled_exception (jerry_value_t error_value) /**< error value */
158158
if (jerry_is_feature_enabled (JERRY_FEATURE_ERROR_MESSAGES)
159159
&& jerry_get_error_type (error_value) == JERRY_ERROR_SYNTAX)
160160
{
161+
jerry_char_t *string_end_p = err_str_buf + string_end;
161162
unsigned int err_line = 0;
162163
unsigned int err_col = 0;
164+
char *path_str_p = NULL;
165+
char *path_str_end_p = NULL;
163166

164167
/* 1. parse column and line information */
165-
for (jerry_size_t i = 0; i < string_end; i++)
168+
for (jerry_char_t *current_p = err_str_buf; current_p < string_end_p; current_p++)
166169
{
167-
if (!strncmp ((char *) (err_str_buf + i), "[line: ", 7))
170+
if (*current_p == '[')
168171
{
169-
i += 7;
172+
current_p++;
170173

171-
char num_str[8];
172-
unsigned int j = 0;
173-
174-
while (i < string_end && err_str_buf[i] != ',')
174+
if (*current_p == '<')
175175
{
176-
num_str[j] = (char) err_str_buf[i];
177-
j++;
178-
i++;
176+
break;
179177
}
180-
num_str[j] = '\0';
181-
182-
err_line = (unsigned int) strtol (num_str, NULL, 10);
183178

184-
if (strncmp ((char *) (err_str_buf + i), ", column: ", 10))
179+
path_str_p = (char *) current_p;
180+
while (current_p < string_end_p && *current_p != ':')
185181
{
186-
break; /* wrong position info format */
182+
current_p++;
187183
}
188184

189-
i += 10;
190-
j = 0;
185+
path_str_end_p = (char *) current_p++;
191186

192-
while (i < string_end && err_str_buf[i] != ']')
193-
{
194-
num_str[j] = (char) err_str_buf[i];
195-
j++;
196-
i++;
197-
}
198-
num_str[j] = '\0';
187+
err_line = (unsigned int) strtol ((char *) current_p, (char **) &current_p, 10);
188+
189+
current_p++;
199190

200-
err_col = (unsigned int) strtol (num_str, NULL, 10);
191+
err_col = (unsigned int) strtol ((char *) current_p, NULL, 10);
201192
break;
202193
}
203194
} /* for */
@@ -209,8 +200,18 @@ print_unhandled_exception (jerry_value_t error_value) /**< error value */
209200
bool is_printing_context = false;
210201
unsigned int pos = 0;
211202

203+
size_t source_size;
204+
205+
/* Temporarily modify the error message, so we can use the path. */
206+
*path_str_end_p = '\0';
207+
208+
read_file (path_str_p, &source_size);
209+
210+
/* Revert the error message. */
211+
*path_str_end_p = ':';
212+
212213
/* 2. seek and print */
213-
while ((pos < JERRY_BUFFER_SIZE) && (buffer[pos] != '\0'))
214+
while ((pos < source_size) && (buffer[pos] != '\0'))
214215
{
215216
if (buffer[pos] == '\n')
216217
{

0 commit comments

Comments
 (0)