Skip to content

Commit a187e6d

Browse files
committed
Print error messages to be more informative
JerryScript-DCO-1.0-Signed-off-by: László Langó [email protected]
1 parent 212aa34 commit a187e6d

File tree

11 files changed

+170
-58
lines changed

11 files changed

+170
-58
lines changed

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

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -90,34 +90,32 @@ ecma_op_eval_chars_buffer (const jerry_api_char_t *code_p, /**< code characters
9090
{
9191
JERRY_ASSERT (code_p != NULL);
9292

93-
ecma_value_t completion;
93+
ecma_value_t ret_value;
9494

9595
ecma_compiled_code_t *bytecode_data_p;
9696
jsp_status_t parse_status;
9797

9898
bool is_strict_call = (is_direct && is_called_from_strict_mode_code);
99+
jerry_api_object_t *error_obj_p = NULL;
99100

100101
parse_status = parser_parse_eval (code_p,
101102
code_buffer_size,
102103
is_strict_call,
103-
&bytecode_data_p);
104+
&bytecode_data_p,
105+
&error_obj_p);
104106

105-
if (parse_status == JSP_STATUS_SYNTAX_ERROR)
106-
{
107-
completion = ecma_raise_syntax_error ("");
108-
}
109-
else if (parse_status == JSP_STATUS_REFERENCE_ERROR)
107+
if (parse_status == JSP_STATUS_OK)
110108
{
111-
completion = ecma_raise_reference_error ("");
109+
ret_value = vm_run_eval (bytecode_data_p, is_direct);
112110
}
113111
else
114112
{
115-
JERRY_ASSERT (parse_status == JSP_STATUS_OK);
113+
JERRY_ASSERT (parse_status == JSP_STATUS_SYNTAX_ERROR);
116114

117-
completion = vm_run_eval (bytecode_data_p, is_direct);
115+
ret_value = ecma_make_error_obj_value (error_obj_p);
118116
}
119117

120-
return completion;
118+
return ret_value;
121119
} /* ecma_op_eval_chars_buffer */
122120

123121
/**

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "ecma-gc.h"
1919
#include "ecma-globals.h"
2020
#include "ecma-helpers.h"
21+
#include "ecma-objects.h"
2122
#include "jrt.h"
2223

2324
/** \addtogroup ecma ECMA

jerry-core/jerry-api.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,11 @@ void jerry_register_external_magic_strings (const jerry_api_char_ptr_t *, uint32
319319
size_t jerry_parse_and_save_snapshot (const jerry_api_char_t *, size_t, bool, uint8_t *, size_t);
320320
jerry_completion_code_t jerry_exec_snapshot (const void *, size_t, bool, jerry_api_value_t *);
321321

322+
jerry_api_size_t jerry_api_get_string_size (const jerry_api_string_t *);
323+
jerry_api_length_t jerry_api_get_string_length (const jerry_api_string_t *);
324+
325+
jerry_api_string_t *jerry_api_value_to_string (const jerry_api_value_t *);
326+
322327
/**
323328
* @}
324329
*/

jerry-core/jerry.c

Lines changed: 81 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1704,7 +1704,8 @@ jerry_reg_err_callback (jerry_error_callback_t callback) /**< pointer to callbac
17041704
*/
17051705
bool
17061706
jerry_parse (const jerry_api_char_t *source_p, /**< script source */
1707-
size_t source_size) /**< script source size */
1707+
size_t source_size, /**< script source size */
1708+
jerry_api_object_t **error_obj_p) /**< [out] error object */
17081709
{
17091710
jerry_assert_api_available ();
17101711

@@ -1717,11 +1718,12 @@ jerry_parse (const jerry_api_char_t *source_p, /**< script source */
17171718

17181719
parse_status = parser_parse_script (source_p,
17191720
source_size,
1720-
&bytecode_data_p);
1721+
&bytecode_data_p,
1722+
error_obj_p);
17211723

17221724
if (parse_status != JSP_STATUS_OK)
17231725
{
1724-
JERRY_ASSERT (parse_status == JSP_STATUS_SYNTAX_ERROR || parse_status == JSP_STATUS_REFERENCE_ERROR);
1726+
JERRY_ASSERT (parse_status == JSP_STATUS_SYNTAX_ERROR);
17251727

17261728
return false;
17271729
}
@@ -1747,11 +1749,11 @@ jerry_parse (const jerry_api_char_t *source_p, /**< script source */
17471749
* @return completion status
17481750
*/
17491751
jerry_completion_code_t
1750-
jerry_run (void)
1752+
jerry_run (jerry_api_object_t **error_obj_p)
17511753
{
17521754
jerry_assert_api_available ();
17531755

1754-
return vm_run_global ();
1756+
return vm_run_global (error_obj_p);
17551757
} /* jerry_run */
17561758

17571759
/**
@@ -1767,8 +1769,9 @@ jerry_run_simple (const jerry_api_char_t *script_source, /**< script source */
17671769
jerry_init (flags);
17681770

17691771
jerry_completion_code_t ret_code = JERRY_COMPLETION_CODE_OK;
1772+
jerry_api_object_t *error_obj_p = NULL;
17701773

1771-
if (!jerry_parse (script_source, script_source_size))
1774+
if (!jerry_parse (script_source, script_source_size, &error_obj_p))
17721775
{
17731776
/* unhandled SyntaxError */
17741777
ret_code = JERRY_COMPLETION_CODE_UNHANDLED_EXCEPTION;
@@ -1777,7 +1780,7 @@ jerry_run_simple (const jerry_api_char_t *script_source, /**< script source */
17771780
{
17781781
if ((flags & JERRY_FLAG_PARSE_ONLY) == 0)
17791782
{
1780-
ret_code = jerry_run ();
1783+
ret_code = jerry_run (&error_obj_p);
17811784
}
17821785
}
17831786

@@ -2055,17 +2058,25 @@ jerry_parse_and_save_snapshot (const jerry_api_char_t *source_p, /**< script sou
20552058
size_t compiled_code_start = snapshot_buffer_write_offset;
20562059

20572060
snapshot_report_byte_code_compilation = true;
2061+
jerry_api_object_t *error_obj_p = NULL;
20582062

20592063
if (is_for_global)
20602064
{
2061-
parse_status = parser_parse_script (source_p, source_size, &bytecode_data_p);
2065+
parse_status = parser_parse_script (source_p, source_size, &bytecode_data_p, &error_obj_p);
20622066
}
20632067
else
20642068
{
20652069
parse_status = parser_parse_eval (source_p,
20662070
source_size,
20672071
false,
2068-
&bytecode_data_p);
2072+
&bytecode_data_p,
2073+
&error_obj_p);
2074+
}
2075+
2076+
if (parse_status != JSP_STATUS_OK)
2077+
{
2078+
JERRY_ASSERT (error_obj_p != NULL);
2079+
ecma_deref_object (error_obj_p);
20692080
}
20702081

20712082
snapshot_report_byte_code_compilation = false;
@@ -2361,7 +2372,21 @@ jerry_exec_snapshot (const void *snapshot_p, /**< snapshot */
23612372
{
23622373
vm_init (bytecode_p, false);
23632374

2364-
ret_code = vm_run_global ();
2375+
ecma_object_t *error_obj_p = NULL;
2376+
2377+
ret_code = vm_run_global (&error_obj_p);
2378+
2379+
if (ret_code == JERRY_COMPLETION_CODE_UNHANDLED_EXCEPTION)
2380+
{
2381+
JERRY_ASSERT (error_obj_p != NULL);
2382+
2383+
ecma_deref_object (error_obj_p);
2384+
}
2385+
else
2386+
{
2387+
JERRY_ASSERT (ret_code == JERRY_COMPLETION_CODE_OK);
2388+
JERRY_ASSERT (error_obj_p == NULL);
2389+
}
23652390

23662391
vm_finalize ();
23672392
}
@@ -2385,3 +2410,49 @@ jerry_exec_snapshot (const void *snapshot_p, /**< snapshot */
23852410
return JERRY_COMPLETION_CODE_INVALID_SNAPSHOT_VERSION;
23862411
#endif /* !JERRY_ENABLE_SNAPSHOT_EXEC */
23872412
} /* jerry_exec_snapshot */
2413+
2414+
/**
2415+
* Call the ToString ecma builtin operation on the api value.
2416+
*
2417+
* @return string value
2418+
*/
2419+
jerry_api_string_t *
2420+
jerry_api_value_to_string (const jerry_api_value_t *in_value_p) /**< input value */
2421+
{
2422+
jerry_assert_api_available ();
2423+
2424+
ecma_value_t in_value;
2425+
jerry_api_convert_api_value_to_ecma_value (&in_value, in_value_p);
2426+
2427+
ecma_value_t str_value = ecma_op_to_string (in_value);
2428+
2429+
ecma_free_value (in_value);
2430+
2431+
return (jerry_api_string_t *) ecma_get_string_from_value (str_value);
2432+
} /* jerry_api_value_to_string */
2433+
2434+
/**
2435+
* Get size of Jerry string
2436+
*
2437+
* @return number of bytes in the buffer needed to represent the string
2438+
*/
2439+
jerry_api_size_t
2440+
jerry_api_get_string_size (const jerry_api_string_t *str_p) /**< input string */
2441+
{
2442+
jerry_assert_api_available ();
2443+
2444+
return ecma_string_get_size ((ecma_string_t *) str_p);
2445+
} /* jerry_api_get_string_size */
2446+
2447+
/**
2448+
* Get length of Jerry string
2449+
*
2450+
* @return number of characters in the string
2451+
*/
2452+
jerry_api_length_t
2453+
jerry_api_get_string_length (const jerry_api_string_t *str_p) /**< input string */
2454+
{
2455+
jerry_assert_api_available ();
2456+
2457+
return ecma_string_get_length ((ecma_string_t *) str_p);
2458+
} /* jerry_api_get_string_length */

jerry-core/jerry.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,8 @@ void jerry_cleanup (void);
9393
void jerry_get_memory_limits (size_t *, size_t *);
9494
void jerry_reg_err_callback (jerry_error_callback_t);
9595

96-
bool jerry_parse (const jerry_api_char_t *, size_t);
97-
jerry_completion_code_t jerry_run (void);
96+
bool jerry_parse (const jerry_api_char_t *, size_t, jerry_api_object_t **);
97+
jerry_completion_code_t jerry_run (jerry_api_object_t **);
9898
jerry_completion_code_t jerry_run_simple (const jerry_api_char_t *, size_t, jerry_flag_t);
9999

100100
/**

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

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2254,19 +2254,22 @@ parser_set_show_instrs (int show_instrs) /**< flag indicating whether to dump by
22542254
#endif /* PARSER_DUMP_BYTE_CODE */
22552255
} /* parser_set_show_instrs */
22562256

2257-
22582257
/**
22592258
* Parse EcamScript source code
22602259
*/
22612260
jsp_status_t
22622261
parser_parse_script (const jerry_api_char_t *source_p, /**< source code */
22632262
size_t size, /**< size of the source code */
2264-
ecma_compiled_code_t **bytecode_data_p) /**< result */
2263+
ecma_compiled_code_t **bytecode_data_p, /**< [out] JS bytecode */
2264+
jerry_api_object_t **error_obj_p) /**< [out] error object */
22652265
{
2266-
*bytecode_data_p = parser_parse_source (source_p, size, false, NULL);
2266+
parser_error_location parse_error;
2267+
*bytecode_data_p = parser_parse_source (source_p, size, false, &parse_error);
22672268

22682269
if (!*bytecode_data_p)
22692270
{
2271+
*error_obj_p = jerry_api_create_error (JERRY_API_ERROR_SYNTAX,
2272+
(const jerry_api_char_t *) parser_error_to_string (parse_error.error));
22702273
return JSP_STATUS_SYNTAX_ERROR;
22712274
}
22722275

@@ -2280,19 +2283,22 @@ jsp_status_t
22802283
parser_parse_eval (const jerry_api_char_t *source_p, /**< source code */
22812284
size_t size, /**< size of the source code */
22822285
bool is_strict, /**< strict mode */
2283-
ecma_compiled_code_t **bytecode_data_p) /**< result */
2286+
ecma_compiled_code_t **bytecode_data_p, /**< [out] JS bytecode */
2287+
jerry_api_object_t **error_obj_p) /**< [out] error object */
22842288
{
2285-
*bytecode_data_p = parser_parse_source (source_p, size, is_strict, NULL);
2289+
parser_error_location parse_error;
2290+
*bytecode_data_p = parser_parse_source (source_p, size, is_strict, &parse_error);
22862291

22872292
if (!*bytecode_data_p)
22882293
{
2294+
*error_obj_p = jerry_api_create_error (JERRY_API_ERROR_SYNTAX,
2295+
(const jerry_api_char_t *) parser_error_to_string (parse_error.error));
22892296
return JSP_STATUS_SYNTAX_ERROR;
22902297
}
22912298

22922299
return JSP_STATUS_OK;
22932300
} /* parser_parse_eval */
22942301

2295-
22962302
/**
22972303
* @}
22982304
* @}

jerry-core/parser/js/js-parser.h

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -135,16 +135,20 @@ typedef enum
135135
{
136136
JSP_STATUS_OK, /**< parse finished successfully, no early errors occured */
137137
JSP_STATUS_SYNTAX_ERROR, /**< SyntaxError early error occured */
138-
JSP_STATUS_REFERENCE_ERROR /**< ReferenceError early error occured */
139138
} jsp_status_t;
140139

141140
extern void parser_set_show_instrs (int);
142141

143142
/* Note: source must be a valid UTF-8 string */
144-
extern jsp_status_t parser_parse_script (const jerry_api_char_t *, size_t,
145-
ecma_compiled_code_t **);
146-
extern jsp_status_t parser_parse_eval (const jerry_api_char_t *, size_t, bool,
147-
ecma_compiled_code_t **);
143+
extern jsp_status_t parser_parse_script (const jerry_api_char_t *,
144+
size_t,
145+
ecma_compiled_code_t **,
146+
jerry_api_object_t **);
147+
extern jsp_status_t parser_parse_eval (const jerry_api_char_t *,
148+
size_t,
149+
bool,
150+
ecma_compiled_code_t **,
151+
jerry_api_object_t **);
148152

149153
const char *parser_error_to_string (parser_error_t);
150154

jerry-core/vm/vm.c

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ static const uint32_t vm_ext_decode_table[] =
177177
* @return completion code
178178
*/
179179
jerry_completion_code_t
180-
vm_run_global (void)
180+
vm_run_global (ecma_object_t **error_obj_p)
181181
{
182182
jerry_completion_code_t ret_code;
183183

@@ -186,24 +186,24 @@ vm_run_global (void)
186186
ecma_object_t *glob_obj_p = ecma_builtin_get (ECMA_BUILTIN_ID_GLOBAL);
187187
ecma_object_t *lex_env_p = ecma_get_global_environment ();
188188

189-
ecma_value_t completion_value = vm_run (__program,
190-
ecma_make_object_value (glob_obj_p),
191-
lex_env_p,
192-
false,
193-
NULL,
194-
0);
189+
ecma_value_t ret_value = vm_run (__program,
190+
ecma_make_object_value (glob_obj_p),
191+
lex_env_p,
192+
false,
193+
NULL,
194+
0);
195195

196-
if (ecma_is_value_error (completion_value))
196+
if (ecma_is_value_error (ret_value))
197197
{
198+
*error_obj_p = ecma_get_object_from_value (ret_value);
198199
ret_code = JERRY_COMPLETION_CODE_UNHANDLED_EXCEPTION;
199200
}
200201
else
201202
{
203+
ecma_free_value (ret_value);
202204
ret_code = JERRY_COMPLETION_CODE_OK;
203205
}
204206

205-
ecma_free_value (completion_value);
206-
207207
ecma_deref_object (glob_obj_p);
208208
ecma_deref_object (lex_env_p);
209209

jerry-core/vm/vm.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ typedef enum
194194

195195
extern void vm_init (ecma_compiled_code_t *, bool);
196196
extern void vm_finalize (void);
197-
extern jerry_completion_code_t vm_run_global (void);
197+
extern jerry_completion_code_t vm_run_global (ecma_object_t **);
198198
extern ecma_value_t vm_run_eval (ecma_compiled_code_t *, bool);
199199

200200
extern ecma_value_t vm_run (const ecma_compiled_code_t *, ecma_value_t,

0 commit comments

Comments
 (0)