Fix assertion on unhandled exceptions

Follow up fix after #815 ('a187e6d'). Fixed the following
assertion on unhandled exceptions:
  * ICE: Assertion 'ecma_get_value_type_field (value) == ECMA_TYPE_OBJECT'
    failed at ecma-helpers-value.c(ecma_get_object_from_value):375.

JerryScript-DCO-1.0-Signed-off-by: László Langó llango.u-szeged@partner.samsung.com
This commit is contained in:
László Langó
2016-04-08 10:02:12 +02:00
parent 920a9ee244
commit b78f5a55bb
10 changed files with 74 additions and 28 deletions
+33 -14
View File
@@ -378,7 +378,11 @@ jerry_api_convert_ecma_value_to_api_value (jerry_api_value_t *out_value_p, /**<
JERRY_ASSERT (out_value_p != NULL); JERRY_ASSERT (out_value_p != NULL);
if (ecma_is_value_undefined (value)) if (ecma_is_value_empty (value))
{
out_value_p->type = JERRY_API_DATA_TYPE_VOID;
}
else if (ecma_is_value_undefined (value))
{ {
out_value_p->type = JERRY_API_DATA_TYPE_UNDEFINED; out_value_p->type = JERRY_API_DATA_TYPE_UNDEFINED;
} }
@@ -1715,6 +1719,9 @@ jerry_is_abort_on_fail (void)
/** /**
* Parse script for specified context * Parse script for specified context
* *
* Note:
* returned error object should be freed with jerry_api_release_object
*
* @return true - if script was parsed successfully, * @return true - if script was parsed successfully,
* false - otherwise (SyntaxError was raised). * false - otherwise (SyntaxError was raised).
*/ */
@@ -1760,14 +1767,25 @@ jerry_parse (const jerry_api_char_t *source_p, /**< script source */
/** /**
* Run Jerry in specified run context * Run Jerry in specified run context
* *
* Note:
* returned error value should be freed with jerry_api_release_value
* just when the value becomes unnecessary.
*
* @return completion status * @return completion status
*/ */
jerry_completion_code_t jerry_completion_code_t
jerry_run (jerry_api_object_t **error_obj_p) jerry_run (jerry_api_value_t *error_value_p) /**< [out] error value */
{ {
jerry_assert_api_available (); jerry_assert_api_available ();
return vm_run_global (error_obj_p); ecma_value_t error_value;
jerry_completion_code_t ret_code = vm_run_global (&error_value);
error_value &= ~(1u << ECMA_VALUE_ERROR_POS);
jerry_api_convert_ecma_value_to_api_value (error_value_p, error_value);
ecma_free_value (error_value);
return ret_code;
} /* jerry_run */ } /* jerry_run */
/** /**
@@ -1790,12 +1808,13 @@ jerry_run_simple (const jerry_api_char_t *script_source, /**< script source */
/* unhandled SyntaxError */ /* unhandled SyntaxError */
ret_code = JERRY_COMPLETION_CODE_UNHANDLED_EXCEPTION; ret_code = JERRY_COMPLETION_CODE_UNHANDLED_EXCEPTION;
} }
else else if ((flags & JERRY_FLAG_PARSE_ONLY) == 0)
{ {
if ((flags & JERRY_FLAG_PARSE_ONLY) == 0) jerry_api_value_t error_value;
{
ret_code = jerry_run (&error_obj_p); ret_code = jerry_run (&error_value);
}
jerry_api_release_value (&error_value);
} }
jerry_cleanup (); jerry_cleanup ();
@@ -2375,20 +2394,20 @@ jerry_exec_snapshot (const void *snapshot_p, /**< snapshot */
{ {
vm_init (bytecode_p); vm_init (bytecode_p);
ecma_object_t *error_obj_p = NULL; ecma_value_t error_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY);
ret_code = vm_run_global (&error_obj_p); ret_code = vm_run_global (&error_value);
if (ret_code == JERRY_COMPLETION_CODE_UNHANDLED_EXCEPTION) if (ret_code == JERRY_COMPLETION_CODE_UNHANDLED_EXCEPTION)
{ {
JERRY_ASSERT (error_obj_p != NULL); JERRY_ASSERT (ecma_is_value_error (error_value));
error_value = error_value & ~(1u << ECMA_VALUE_ERROR_POS);
ecma_deref_object (error_obj_p); ecma_free_value (error_value);
} }
else else
{ {
JERRY_ASSERT (ret_code == JERRY_COMPLETION_CODE_OK); JERRY_ASSERT (ret_code == JERRY_COMPLETION_CODE_OK);
JERRY_ASSERT (error_obj_p == NULL); JERRY_ASSERT (ecma_is_value_empty (error_value));
} }
vm_finalize (); vm_finalize ();
+1 -1
View File
@@ -85,7 +85,7 @@ void jerry_cleanup (void);
void jerry_get_memory_limits (size_t *, size_t *); void jerry_get_memory_limits (size_t *, size_t *);
bool jerry_parse (const jerry_api_char_t *, size_t, jerry_api_object_t **); bool jerry_parse (const jerry_api_char_t *, size_t, jerry_api_object_t **);
jerry_completion_code_t jerry_run (jerry_api_object_t **); jerry_completion_code_t jerry_run (jerry_api_value_t *);
jerry_completion_code_t jerry_run_simple (const jerry_api_char_t *, size_t, jerry_flag_t); jerry_completion_code_t jerry_run_simple (const jerry_api_char_t *, size_t, jerry_flag_t);
/** /**
+6
View File
@@ -2238,6 +2238,9 @@ parser_set_show_instrs (int show_instrs) /**< flag indicating whether to dump by
/** /**
* Parse EcamScript source code * Parse EcamScript source code
*
* Note:
* returned error object should be freed with jerry_api_release_object
*/ */
jsp_status_t jsp_status_t
parser_parse_script (const jerry_api_char_t *source_p, /**< source code */ parser_parse_script (const jerry_api_char_t *source_p, /**< source code */
@@ -2260,6 +2263,9 @@ parser_parse_script (const jerry_api_char_t *source_p, /**< source code */
/** /**
* Parse EcamScript eval source code * Parse EcamScript eval source code
*
* Note:
* returned error object should be freed with jerry_api_release_object
*/ */
jsp_status_t jsp_status_t
parser_parse_eval (const jerry_api_char_t *source_p, /**< source code */ parser_parse_eval (const jerry_api_char_t *source_p, /**< source code */
+7 -2
View File
@@ -171,10 +171,14 @@ static const uint32_t vm_ext_decode_table[] =
/** /**
* Run global code * Run global code
* *
* Note:
* returned error value should be freed with jerry_api_release_value
* just when the value becomes unnecessary.
*
* @return completion code * @return completion code
*/ */
jerry_completion_code_t jerry_completion_code_t
vm_run_global (ecma_object_t **error_obj_p) vm_run_global (ecma_value_t *error_value_p) /**< [out] error value */
{ {
jerry_completion_code_t ret_code; jerry_completion_code_t ret_code;
@@ -192,12 +196,13 @@ vm_run_global (ecma_object_t **error_obj_p)
if (ecma_is_value_error (ret_value)) if (ecma_is_value_error (ret_value))
{ {
*error_obj_p = ecma_get_object_from_value (ret_value); *error_value_p = ret_value;
ret_code = JERRY_COMPLETION_CODE_UNHANDLED_EXCEPTION; ret_code = JERRY_COMPLETION_CODE_UNHANDLED_EXCEPTION;
} }
else else
{ {
ecma_free_value (ret_value); ecma_free_value (ret_value);
*error_value_p = ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY);
ret_code = JERRY_COMPLETION_CODE_OK; ret_code = JERRY_COMPLETION_CODE_OK;
} }
+1 -1
View File
@@ -194,7 +194,7 @@ typedef enum
extern void vm_init (ecma_compiled_code_t *); extern void vm_init (ecma_compiled_code_t *);
extern void vm_finalize (void); extern void vm_finalize (void);
extern jerry_completion_code_t vm_run_global (ecma_object_t **); extern jerry_completion_code_t vm_run_global (ecma_value_t *);
extern ecma_value_t vm_run_eval (ecma_compiled_code_t *, bool); extern ecma_value_t vm_run_eval (ecma_compiled_code_t *, bool);
extern ecma_value_t vm_run (const ecma_compiled_code_t *, ecma_value_t, extern ecma_value_t vm_run (const ecma_compiled_code_t *, ecma_value_t,
+17 -6
View File
@@ -408,6 +408,7 @@ main (int argc,
} }
jerry_api_object_t *err_obj_p = NULL; jerry_api_object_t *err_obj_p = NULL;
jerry_api_value_t err_value = jerry_api_create_void_value ();
if (is_ok) if (is_ok)
{ {
@@ -455,7 +456,7 @@ main (int argc,
} }
else if ((flags & JERRY_FLAG_PARSE_ONLY) == 0) else if ((flags & JERRY_FLAG_PARSE_ONLY) == 0)
{ {
ret_code = jerry_run (&err_obj_p); ret_code = jerry_run (&err_value);
} }
} }
} }
@@ -547,12 +548,23 @@ main (int argc,
} }
else if (ret_code == JERRY_COMPLETION_CODE_UNHANDLED_EXCEPTION) else if (ret_code == JERRY_COMPLETION_CODE_UNHANDLED_EXCEPTION)
{ {
jerry_api_string_t *err_str_p = NULL;
if (err_obj_p != NULL) if (err_obj_p != NULL)
{ {
jerry_api_char_t err_str_buf[256];
jerry_api_value_t err_value = jerry_api_create_object_value (err_obj_p); jerry_api_value_t err_value = jerry_api_create_object_value (err_obj_p);
jerry_api_string_t *err_str_p = jerry_api_value_to_string (&err_value); err_str_p = jerry_api_value_to_string (&err_value);
jerry_api_release_object (err_obj_p);
}
else if (!jerry_api_value_is_void (&err_value))
{
err_str_p = jerry_api_value_to_string (&err_value);
jerry_api_release_value (&err_value);
}
if (likely (err_str_p != NULL))
{
jerry_api_char_t err_str_buf[256];
jerry_api_size_t err_str_size = jerry_api_get_string_size (err_str_p); jerry_api_size_t err_str_size = jerry_api_get_string_size (err_str_p);
JERRY_ASSERT (err_str_size < 256); JERRY_ASSERT (err_str_size < 256);
@@ -560,10 +572,9 @@ main (int argc,
JERRY_ASSERT (sz == err_str_size); JERRY_ASSERT (sz == err_str_size);
err_str_buf[err_str_size] = 0; err_str_buf[err_str_size] = 0;
JERRY_ERROR_MSG ("%s\n", err_str_buf); JERRY_ERROR_MSG ("Unhandled exception! %s\n", err_str_buf);
jerry_api_release_string (err_str_p); jerry_api_release_string (err_str_p);
jerry_api_release_object (err_obj_p);
} }
jerry_cleanup (); jerry_cleanup ();
+1
View File
@@ -0,0 +1 @@
throw new SyntaxError("error");
+1
View File
@@ -0,0 +1 @@
throw 0.1234;
+1
View File
@@ -0,0 +1 @@
throw "SyntaxError"
+6 -4
View File
@@ -339,8 +339,9 @@ main (void)
is_ok = jerry_parse ((jerry_api_char_t *) test_source, strlen (test_source), &err_obj_p); is_ok = jerry_parse ((jerry_api_char_t *) test_source, strlen (test_source), &err_obj_p);
JERRY_ASSERT (is_ok && err_obj_p == NULL); JERRY_ASSERT (is_ok && err_obj_p == NULL);
is_ok = (jerry_run (&err_obj_p) == JERRY_COMPLETION_CODE_OK); is_ok = (jerry_run (&res) == JERRY_COMPLETION_CODE_OK);
JERRY_ASSERT (is_ok && err_obj_p == NULL); JERRY_ASSERT (is_ok);
JERRY_ASSERT (jerry_api_value_is_void (&res));
global_obj_p = jerry_api_get_global (); global_obj_p = jerry_api_get_global ();
@@ -688,8 +689,9 @@ main (void)
is_ok = jerry_parse ((jerry_api_char_t *) ms_code_src_p, strlen (ms_code_src_p), &err_obj_p); is_ok = jerry_parse ((jerry_api_char_t *) ms_code_src_p, strlen (ms_code_src_p), &err_obj_p);
JERRY_ASSERT (is_ok && err_obj_p == NULL); JERRY_ASSERT (is_ok && err_obj_p == NULL);
is_ok = (jerry_run (&err_obj_p) == JERRY_COMPLETION_CODE_OK); is_ok = (jerry_run (&res) == JERRY_COMPLETION_CODE_OK);
JERRY_ASSERT (is_ok && err_obj_p == NULL); JERRY_ASSERT (is_ok);
JERRY_ASSERT (jerry_api_value_is_void (&res));
jerry_cleanup (); jerry_cleanup ();