mirror of
https://github.com/jerryscript-project/jerryscript.git
synced 2025-12-15 16:29:21 +00:00
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:
parent
130be84ad1
commit
c3541c3ab7
@ -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_object (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'
|
||||
|
||||
@ -62,6 +62,8 @@ static jerry_flag_t jerry_flags;
|
||||
*/
|
||||
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
|
||||
* @{
|
||||
*/
|
||||
@ -542,13 +544,18 @@ jerry_create_array_object (jerry_size_t size) /**< size of array */
|
||||
* Set value of field in the specified array object
|
||||
*
|
||||
* @return true, if field value was set successfully
|
||||
* throw exception, otherwise
|
||||
* false, otherwise
|
||||
*/
|
||||
bool
|
||||
jerry_set_array_index_value (jerry_object_t *array_obj_p, /**< array object */
|
||||
jerry_length_t index, /**< index to be written */
|
||||
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_value_t set_completion = ecma_op_object_put (array_obj_p, str_idx_p, value, false);
|
||||
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 ();
|
||||
|
||||
if (ECMA_IS_VALUE_ERROR (field_value))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool is_successful = false;
|
||||
|
||||
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 ();
|
||||
|
||||
if (ECMA_IS_VALUE_ERROR (field_value))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool is_successful = true;
|
||||
|
||||
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 ();
|
||||
|
||||
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))
|
||||
{
|
||||
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 ();
|
||||
|
||||
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))
|
||||
{
|
||||
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 ();
|
||||
|
||||
if (ECMA_IS_VALUE_ERROR (value))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return ecma_op_to_boolean (value);
|
||||
} /* jerry_value_to_boolean */
|
||||
|
||||
@ -2132,6 +2170,11 @@ jerry_value_to_number (const jerry_value_t value) /**< input value */
|
||||
{
|
||||
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);
|
||||
} /* jerry_value_to_number */
|
||||
|
||||
@ -2149,6 +2192,11 @@ jerry_value_to_object (const jerry_value_t value) /**< input value */
|
||||
{
|
||||
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);
|
||||
} /* jerry_value_to_object */
|
||||
|
||||
@ -2166,9 +2214,26 @@ jerry_value_to_string (const jerry_value_t value) /**< input value */
|
||||
{
|
||||
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);
|
||||
} /* 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
|
||||
*
|
||||
|
||||
@ -501,6 +501,7 @@ main (int argc,
|
||||
}
|
||||
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));
|
||||
jerry_release_value (err_value);
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user