Check error values in API functions
Internal functions cannot handle error values, so it must be avoided to pass error values to the engine. JerryScript-DCO-1.0-Signed-off-by: László Langó llango.u-szeged@partner.samsung.com
This commit is contained in:
@@ -144,6 +144,7 @@ bool jerry_value_to_boolean (const jerry_value_t);
|
|||||||
jerry_value_t jerry_value_to_number (const jerry_value_t);
|
jerry_value_t jerry_value_to_number (const jerry_value_t);
|
||||||
jerry_value_t jerry_value_to_object (const jerry_value_t);
|
jerry_value_t jerry_value_to_object (const jerry_value_t);
|
||||||
jerry_value_t jerry_value_to_string (const jerry_value_t);
|
jerry_value_t jerry_value_to_string (const jerry_value_t);
|
||||||
|
jerry_value_t jerry_value_remove_error_flag (const jerry_value_t);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create functions of 'jerry_value_t'
|
* Create functions of 'jerry_value_t'
|
||||||
|
|||||||
+66
-1
@@ -62,6 +62,8 @@ static jerry_flag_t jerry_flags;
|
|||||||
*/
|
*/
|
||||||
static bool jerry_api_available;
|
static bool jerry_api_available;
|
||||||
|
|
||||||
|
static const jerry_char_t *error_value_msg_p = (const jerry_char_t *) "argument cannot have an error flag";
|
||||||
|
|
||||||
/** \addtogroup jerry_extension Jerry engine extension interface
|
/** \addtogroup jerry_extension Jerry engine extension interface
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
@@ -542,13 +544,18 @@ jerry_create_array_object (jerry_size_t size) /**< size of array */
|
|||||||
* Set value of field in the specified array object
|
* Set value of field in the specified array object
|
||||||
*
|
*
|
||||||
* @return true, if field value was set successfully
|
* @return true, if field value was set successfully
|
||||||
* throw exception, otherwise
|
* false, otherwise
|
||||||
*/
|
*/
|
||||||
bool
|
bool
|
||||||
jerry_set_array_index_value (jerry_object_t *array_obj_p, /**< array object */
|
jerry_set_array_index_value (jerry_object_t *array_obj_p, /**< array object */
|
||||||
jerry_length_t index, /**< index to be written */
|
jerry_length_t index, /**< index to be written */
|
||||||
jerry_value_t value) /**< value to set */
|
jerry_value_t value) /**< value to set */
|
||||||
{
|
{
|
||||||
|
if (ECMA_IS_VALUE_ERROR (value))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
ecma_string_t *str_idx_p = ecma_new_ecma_string_from_uint32 ((uint32_t) index);
|
ecma_string_t *str_idx_p = ecma_new_ecma_string_from_uint32 ((uint32_t) index);
|
||||||
ecma_value_t set_completion = ecma_op_object_put (array_obj_p, str_idx_p, value, false);
|
ecma_value_t set_completion = ecma_op_object_put (array_obj_p, str_idx_p, value, false);
|
||||||
JERRY_ASSERT (!ECMA_IS_VALUE_ERROR (set_completion));
|
JERRY_ASSERT (!ECMA_IS_VALUE_ERROR (set_completion));
|
||||||
@@ -857,6 +864,11 @@ jerry_add_object_field (jerry_object_t *object_p, /**< object to add field at */
|
|||||||
{
|
{
|
||||||
jerry_assert_api_available ();
|
jerry_assert_api_available ();
|
||||||
|
|
||||||
|
if (ECMA_IS_VALUE_ERROR (field_value))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool is_successful = false;
|
bool is_successful = false;
|
||||||
|
|
||||||
if (ecma_get_object_extensible (object_p))
|
if (ecma_get_object_extensible (object_p))
|
||||||
@@ -1053,6 +1065,11 @@ jerry_set_object_field_value_sz (jerry_object_t *object_p, /**< object */
|
|||||||
{
|
{
|
||||||
jerry_assert_api_available ();
|
jerry_assert_api_available ();
|
||||||
|
|
||||||
|
if (ECMA_IS_VALUE_ERROR (field_value))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool is_successful = true;
|
bool is_successful = true;
|
||||||
|
|
||||||
ecma_string_t *field_name_str_p = ecma_new_ecma_string_from_utf8 ((lit_utf8_byte_t *) field_name_p,
|
ecma_string_t *field_name_str_p = ecma_new_ecma_string_from_utf8 ((lit_utf8_byte_t *) field_name_p,
|
||||||
@@ -1235,6 +1252,14 @@ jerry_call_function (jerry_object_t *function_object_p, /**< function object to
|
|||||||
{
|
{
|
||||||
jerry_assert_api_available ();
|
jerry_assert_api_available ();
|
||||||
|
|
||||||
|
for (uint16_t i = 0; i < args_count; i++)
|
||||||
|
{
|
||||||
|
if (ECMA_IS_VALUE_ERROR (args_p[i]))
|
||||||
|
{
|
||||||
|
return jerry_create_object_value (jerry_create_error (JERRY_ERROR_TYPE, error_value_msg_p));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (jerry_is_function (function_object_p))
|
if (jerry_is_function (function_object_p))
|
||||||
{
|
{
|
||||||
return jerry_invoke_function (false, function_object_p, this_arg_p, args_p, args_count);
|
return jerry_invoke_function (false, function_object_p, this_arg_p, args_p, args_count);
|
||||||
@@ -1260,6 +1285,14 @@ jerry_construct_object (jerry_object_t *function_object_p, /**< function object
|
|||||||
{
|
{
|
||||||
jerry_assert_api_available ();
|
jerry_assert_api_available ();
|
||||||
|
|
||||||
|
for (uint16_t i = 0; i < args_count; i++)
|
||||||
|
{
|
||||||
|
if (ECMA_IS_VALUE_ERROR (args_p[i]))
|
||||||
|
{
|
||||||
|
return jerry_create_object_value (jerry_create_error (JERRY_ERROR_TYPE, error_value_msg_p));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (jerry_is_constructor (function_object_p))
|
if (jerry_is_constructor (function_object_p))
|
||||||
{
|
{
|
||||||
return jerry_invoke_function (true, function_object_p, NULL, args_p, args_count);
|
return jerry_invoke_function (true, function_object_p, NULL, args_p, args_count);
|
||||||
@@ -2115,6 +2148,11 @@ jerry_value_to_boolean (const jerry_value_t value) /**< input value */
|
|||||||
{
|
{
|
||||||
jerry_assert_api_available ();
|
jerry_assert_api_available ();
|
||||||
|
|
||||||
|
if (ECMA_IS_VALUE_ERROR (value))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return ecma_op_to_boolean (value);
|
return ecma_op_to_boolean (value);
|
||||||
} /* jerry_value_to_boolean */
|
} /* jerry_value_to_boolean */
|
||||||
|
|
||||||
@@ -2132,6 +2170,11 @@ jerry_value_to_number (const jerry_value_t value) /**< input value */
|
|||||||
{
|
{
|
||||||
jerry_assert_api_available ();
|
jerry_assert_api_available ();
|
||||||
|
|
||||||
|
if (ECMA_IS_VALUE_ERROR (value))
|
||||||
|
{
|
||||||
|
return jerry_create_object_value (jerry_create_error (JERRY_ERROR_TYPE, error_value_msg_p));
|
||||||
|
}
|
||||||
|
|
||||||
return ecma_op_to_number (value);
|
return ecma_op_to_number (value);
|
||||||
} /* jerry_value_to_number */
|
} /* jerry_value_to_number */
|
||||||
|
|
||||||
@@ -2149,6 +2192,11 @@ jerry_value_to_object (const jerry_value_t value) /**< input value */
|
|||||||
{
|
{
|
||||||
jerry_assert_api_available ();
|
jerry_assert_api_available ();
|
||||||
|
|
||||||
|
if (ECMA_IS_VALUE_ERROR (value))
|
||||||
|
{
|
||||||
|
return jerry_create_object_value (jerry_create_error (JERRY_ERROR_TYPE, error_value_msg_p));
|
||||||
|
}
|
||||||
|
|
||||||
return ecma_op_to_object (value);
|
return ecma_op_to_object (value);
|
||||||
} /* jerry_value_to_object */
|
} /* jerry_value_to_object */
|
||||||
|
|
||||||
@@ -2166,9 +2214,26 @@ jerry_value_to_string (const jerry_value_t value) /**< input value */
|
|||||||
{
|
{
|
||||||
jerry_assert_api_available ();
|
jerry_assert_api_available ();
|
||||||
|
|
||||||
|
if (ECMA_IS_VALUE_ERROR (value))
|
||||||
|
{
|
||||||
|
return jerry_create_object_value (jerry_create_error (JERRY_ERROR_TYPE, error_value_msg_p));
|
||||||
|
}
|
||||||
|
|
||||||
return ecma_op_to_string (value);
|
return ecma_op_to_string (value);
|
||||||
} /* jerry_value_to_string */
|
} /* jerry_value_to_string */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove the error flag
|
||||||
|
*
|
||||||
|
* @return converted normal value, if value is error
|
||||||
|
* unchanged value otherwise
|
||||||
|
*/
|
||||||
|
jerry_value_t
|
||||||
|
jerry_value_remove_error_flag (const jerry_value_t value)
|
||||||
|
{
|
||||||
|
return (jerry_value_t) (value & ~ECMA_VALUE_ERROR_FLAG);
|
||||||
|
} /* jerry_value_remove_error_flag */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get size of Jerry string
|
* Get size of Jerry string
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -501,6 +501,7 @@ main (int argc,
|
|||||||
}
|
}
|
||||||
else if (!jerry_value_is_undefined (err_value))
|
else if (!jerry_value_is_undefined (err_value))
|
||||||
{
|
{
|
||||||
|
err_value = jerry_value_remove_error_flag (err_value);
|
||||||
err_str_p = jerry_get_string_value (jerry_value_to_string (err_value));
|
err_str_p = jerry_get_string_value (jerry_value_to_string (err_value));
|
||||||
jerry_release_value (err_value);
|
jerry_release_value (err_value);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user