Skip to content

Commit 8805d4e

Browse files
dbatyaifbmrk
andcommitted
Include file path in Syntax error messages
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 eef1efa commit 8805d4e

File tree

12 files changed

+162
-80
lines changed

12 files changed

+162
-80
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: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ 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) */
196196
#endif /* ENABLED (JERRY_LINE_INFO) */
197197

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

Lines changed: 14 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
@@ -557,6 +560,10 @@ LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_SET_MINUTES_UL, "setMinutes")
557560
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_SET_SECONDS_UL, "setSeconds")
558561
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_SET_UTC_DATE_UL, "setUTCDate")
559562
#endif
563+
#if ENABLED (JERRY_LINE_INFO) \
564+
|| ENABLED (JERRY_LINE_INFO) || ENABLED (JERRY_ERROR_MESSAGES) && ENABLED (JERRY_PARSER)
565+
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_RESOURCE_ANON, "<anonymous>")
566+
#endif
560567
#if ENABLED (JERRY_ES2015_BUILTIN_DATAVIEW) \
561568
|| ENABLED (JERRY_ES2015_BUILTIN_TYPEDARRAY)
562569
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_ARRAY_BUFFER_UL, "ArrayBuffer")
@@ -748,7 +755,9 @@ LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (4, LIT_MAGIC_STRING_EMPTY_NON_CAPTURE_G
748755
LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (4, LIT_MAGIC_STRING_DATE_UL)
749756
#endif
750757
LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (5, LIT_MAGIC_STRING_ARRAY_UL)
751-
#if ENABLED (JERRY_BUILTIN_MATH)
758+
#if ENABLED (JERRY_LINE_INFO) || ENABLED (JERRY_ERROR_MESSAGES) && ENABLED (JERRY_PARSER)
759+
LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (6, LIT_MAGIC_STRING_RESOURCE_EVAL)
760+
#elif ENABLED (JERRY_BUILTIN_MATH)
752761
LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (6, LIT_MAGIC_STRING_LOG10E_U)
753762
#else
754763
LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (6, LIT_MAGIC_STRING_NUMBER_UL)
@@ -774,7 +783,10 @@ LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (10, LIT_MAGIC_STRING_CHAR_CODE_AT_UL)
774783
#else
775784
LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (10, LIT_MAGIC_STRING_ENUMERABLE)
776785
#endif
777-
#if ENABLED (JERRY_ES2015_BUILTIN_DATAVIEW) \
786+
#if ENABLED (JERRY_LINE_INFO) \
787+
|| ENABLED (JERRY_LINE_INFO) || ENABLED (JERRY_ERROR_MESSAGES) && ENABLED (JERRY_PARSER)
788+
LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (11, LIT_MAGIC_STRING_RESOURCE_ANON)
789+
#elif ENABLED (JERRY_ES2015_BUILTIN_DATAVIEW) \
778790
|| ENABLED (JERRY_ES2015_BUILTIN_TYPEDARRAY)
779791
LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (11, LIT_MAGIC_STRING_ARRAY_BUFFER_UL)
780792
#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"
@@ -244,6 +245,7 @@ LIT_MAGIC_STRING_SET_FLOAT_64_UL = "setFloat64"
244245
LIT_MAGIC_STRING_SET_MINUTES_UL = "setMinutes"
245246
LIT_MAGIC_STRING_SET_SECONDS_UL = "setSeconds"
246247
LIT_MAGIC_STRING_SET_UTC_DATE_UL = "setUTCDate"
248+
LIT_MAGIC_STRING_RESOURCE_ANON = "<anonymous>"
247249
LIT_MAGIC_STRING_ARRAY_BUFFER_UL = "ArrayBuffer"
248250
LIT_MAGIC_STRING_SYNTAX_ERROR_UL = "SyntaxError"
249251
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: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -160,40 +160,46 @@ print_unhandled_exception (jerry_value_t error_value) /**< error value */
160160
{
161161
unsigned int err_line = 0;
162162
unsigned int err_col = 0;
163+
char *path_str_p = NULL;
164+
size_t path_str_end = 0;
163165

164166
/* 1. parse column and line information */
165167
for (jerry_size_t i = 0; i < string_end; i++)
166168
{
167-
if (!strncmp ((char *) (err_str_buf + i), "[line: ", 7))
169+
if (err_str_buf[i] == '[')
168170
{
169-
i += 7;
171+
i++;
170172

171-
char num_str[8];
172-
unsigned int j = 0;
173+
if (err_str_buf[i] == '<')
174+
{
175+
break;
176+
}
173177

174-
while (i < string_end && err_str_buf[i] != ',')
178+
path_str_p = (char *) (err_str_buf + i);
179+
while (i < string_end && err_str_buf[i] != ':')
175180
{
176-
num_str[j] = (char) err_str_buf[i];
177-
j++;
178181
i++;
179182
}
180-
num_str[j] = '\0';
181183

182-
err_line = (unsigned int) strtol (num_str, NULL, 10);
184+
path_str_end = i++;
185+
186+
char num_str[8];
187+
unsigned int j = 0;
183188

184-
if (strncmp ((char *) (err_str_buf + i), ", column: ", 10))
189+
while (i < string_end && err_str_buf[i] != ':')
185190
{
186-
break; /* wrong position info format */
191+
num_str[j++] = (char) err_str_buf[i++];
187192
}
193+
num_str[j] = '\0';
194+
195+
err_line = (unsigned int) strtol (num_str, NULL, 10);
188196

189-
i += 10;
197+
i++;
190198
j = 0;
191199

192200
while (i < string_end && err_str_buf[i] != ']')
193201
{
194-
num_str[j] = (char) err_str_buf[i];
195-
j++;
196-
i++;
202+
num_str[j++] = (char) err_str_buf[i++];
197203
}
198204
num_str[j] = '\0';
199205

@@ -209,8 +215,18 @@ print_unhandled_exception (jerry_value_t error_value) /**< error value */
209215
bool is_printing_context = false;
210216
unsigned int pos = 0;
211217

218+
size_t source_size;
219+
220+
/* Temporarily modify the error message, so we can use the path. */
221+
err_str_buf[path_str_end] = '\0';
222+
223+
read_file (path_str_p, &source_size);
224+
225+
/* Revert the error message. */
226+
err_str_buf[path_str_end] = ':';
227+
212228
/* 2. seek and print */
213-
while ((pos < JERRY_BUFFER_SIZE) && (buffer[pos] != '\0'))
229+
while ((pos < source_size) && (buffer[pos] != '\0'))
214230
{
215231
if (buffer[pos] == '\n')
216232
{

targets/nuttx-stm32f4/jerry_main.c

Lines changed: 33 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -150,8 +150,7 @@ str_to_uint (const char *num_str_p) /**< string to convert */
150150
* Print error value
151151
*/
152152
static void
153-
print_unhandled_exception (jerry_value_t error_value, /**< error value */
154-
const jerry_char_t *source_p) /**< source_p */
153+
print_unhandled_exception (jerry_value_t error_value) /**< error value */
155154
{
156155
assert (jerry_value_is_error (error_value));
157156

@@ -179,40 +178,46 @@ print_unhandled_exception (jerry_value_t error_value, /**< error value */
179178
{
180179
uint32_t err_line = 0;
181180
uint32_t err_col = 0;
181+
char *path_str_p = NULL;
182+
size_t path_str_end = 0;
182183

183184
/* 1. parse column and line information */
184185
for (uint32_t i = 0; i < sz; i++)
185186
{
186-
if (!strncmp ((char *) (err_str_buf + i), "[line: ", 7))
187+
if (err_str_buf[i] == '[')
187188
{
188-
i += 7;
189+
i++;
189190

190-
char num_str[8];
191-
uint32_t j = 0;
191+
if (err_str_buf[i] == '<')
192+
{
193+
break;
194+
}
192195

193-
while (i < sz && err_str_buf[i] != ',')
196+
path_str_p = (char *) (err_str_buf + i);
197+
while (i < sz && err_str_buf[i] != ':')
194198
{
195-
num_str[j] = (char) err_str_buf[i];
196-
j++;
197199
i++;
198200
}
199-
num_str[j] = '\0';
200201

201-
err_line = str_to_uint (num_str);
202+
path_str_end = i++;
202203

203-
if (strncmp ((char *) (err_str_buf + i), ", column: ", 10))
204+
char num_str[8];
205+
uint32_t j = 0;
206+
207+
while (i < sz && err_str_buf[i] != ':')
204208
{
205-
break; /* wrong position info format */
209+
num_str[j++] = (char) err_str_buf[i++];
206210
}
211+
num_str[j] = '\0';
207212

208-
i += 10;
213+
err_line = str_to_uint (num_str);
214+
215+
i++;
209216
j = 0;
210217

211218
while (i < sz && err_str_buf[i] != ']')
212219
{
213-
num_str[j] = (char) err_str_buf[i];
214-
j++;
215-
i++;
220+
num_str[j++] = (char) err_str_buf[i++];
216221
}
217222
num_str[j] = '\0';
218223

@@ -228,6 +233,15 @@ print_unhandled_exception (jerry_value_t error_value, /**< error value */
228233
bool is_printing_context = false;
229234
uint32_t pos = 0;
230235

236+
/* Temporarily modify the error message, so we can use the path. */
237+
err_str_buf[path_str_end] = '\0';
238+
239+
size_t source_size;
240+
const jerry_char_t *source_p = read_file (path_str_p, &source_size);
241+
242+
/* Revert the error message. */
243+
err_str_buf[path_str_end] = ':';
244+
231245
/* 2. seek and print */
232246
while (source_p[pos] != '\0')
233247
{
@@ -419,6 +433,7 @@ int jerry_main (int argc, char *argv[])
419433
source_p,
420434
source_size,
421435
JERRY_PARSE_NO_OPTS);
436+
free ((void*) source_p);
422437

423438
if (!jerry_value_is_error (ret_value))
424439
{
@@ -429,14 +444,10 @@ int jerry_main (int argc, char *argv[])
429444

430445
if (jerry_value_is_error (ret_value))
431446
{
432-
print_unhandled_exception (ret_value, source_p);
433-
free ((void*) source_p);
434-
447+
print_unhandled_exception (ret_value);
435448
break;
436449
}
437450

438-
free ((void*) source_p);
439-
440451
jerry_release_value (ret_value);
441452
ret_value = jerry_create_undefined ();
442453
}

0 commit comments

Comments
 (0)