mirror of
https://github.com/jerryscript-project/jerryscript.git
synced 2025-12-15 16:29:21 +00:00
Remove jerry_get_arg_value function. (#2425)
Remove automatic conversion of errors. Errors are primary values, just like numbers or strings. JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
This commit is contained in:
parent
66dddadfd2
commit
88589902e2
@ -13,16 +13,17 @@ Enum that contains the following elements:
|
||||
|
||||
## jerry_type_t
|
||||
|
||||
Enum that contains a set of elements to represent JavaScript type:
|
||||
Enum that contains JerryScript API value types:
|
||||
|
||||
- JERRY_TYPE_NONE - no type information
|
||||
- JERRY_TYPE_UNDEFINED - undefined value
|
||||
- JERRY_TYPE_NULL - null value
|
||||
- JERRY_TYPE_BOOLEAN - boolean value
|
||||
- JERRY_TYPE_NUMBER - number value
|
||||
- JERRY_TYPE_STRING - string value
|
||||
- JERRY_TYPE_OBJECT - object value
|
||||
- JERRY_TYPE_FUNCTION - function value
|
||||
- JERRY_TYPE_UNDEFINED - undefined type
|
||||
- JERRY_TYPE_NULL - null type
|
||||
- JERRY_TYPE_BOOLEAN - boolean type
|
||||
- JERRY_TYPE_NUMBER - number type
|
||||
- JERRY_TYPE_STRING - string type
|
||||
- JERRY_TYPE_OBJECT - object type
|
||||
- JERRY_TYPE_FUNCTION - function type
|
||||
- JERRY_TYPE_ERROR - error/abort type
|
||||
|
||||
## jerry_error_t
|
||||
|
||||
|
||||
@ -122,25 +122,6 @@ jerry_make_api_unavailable (void)
|
||||
JERRY_CONTEXT (status_flags) &= (uint32_t) ~ECMA_STATUS_API_AVAILABLE;
|
||||
} /* jerry_make_api_unavailable */
|
||||
|
||||
/**
|
||||
* Remove the error flag from the argument value.
|
||||
*
|
||||
* Note:
|
||||
* Compatiblity function, should go away with JerryScript 2.0
|
||||
*
|
||||
* @return return value for Jerry API functions
|
||||
*/
|
||||
static inline jerry_value_t JERRY_ATTR_ALWAYS_INLINE
|
||||
jerry_get_arg_value (jerry_value_t value) /**< return value */
|
||||
{
|
||||
if (JERRY_UNLIKELY (ecma_is_value_error_reference (value)))
|
||||
{
|
||||
value = ecma_get_error_reference_from_value (value)->value;
|
||||
}
|
||||
|
||||
return value;
|
||||
} /* jerry_get_arg_value */
|
||||
|
||||
/**
|
||||
* Create an API compatible return value.
|
||||
*
|
||||
@ -641,9 +622,8 @@ jerry_value_is_array (const jerry_value_t value) /**< jerry api value */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
jerry_value_t array = jerry_get_arg_value (value);
|
||||
return (ecma_is_value_object (array)
|
||||
&& ecma_get_object_type (ecma_get_object_from_value (array)) == ECMA_OBJECT_TYPE_ARRAY);
|
||||
return (ecma_is_value_object (value)
|
||||
&& ecma_get_object_type (ecma_get_object_from_value (value)) == ECMA_OBJECT_TYPE_ARRAY);
|
||||
} /* jerry_value_is_array */
|
||||
|
||||
/**
|
||||
@ -657,7 +637,7 @@ jerry_value_is_boolean (const jerry_value_t value) /**< api value */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
return ecma_is_value_boolean (jerry_get_arg_value (value));
|
||||
return ecma_is_value_boolean (value);
|
||||
} /* jerry_value_is_boolean */
|
||||
|
||||
/**
|
||||
@ -671,7 +651,7 @@ jerry_value_is_constructor (const jerry_value_t value) /**< jerry api value */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
return ecma_is_constructor (jerry_get_arg_value (value));
|
||||
return ecma_is_constructor (value);
|
||||
} /* jerry_value_is_constructor */
|
||||
|
||||
/**
|
||||
@ -699,7 +679,7 @@ jerry_value_is_function (const jerry_value_t value) /**< api value */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
return ecma_op_is_callable (jerry_get_arg_value (value));
|
||||
return ecma_op_is_callable (value);
|
||||
} /* jerry_value_is_function */
|
||||
|
||||
/**
|
||||
@ -713,7 +693,7 @@ jerry_value_is_number (const jerry_value_t value) /**< api value */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
return ecma_is_value_number (jerry_get_arg_value (value));
|
||||
return ecma_is_value_number (value);
|
||||
} /* jerry_value_is_number */
|
||||
|
||||
/**
|
||||
@ -727,7 +707,7 @@ jerry_value_is_null (const jerry_value_t value) /**< api value */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
return ecma_is_value_null (jerry_get_arg_value (value));
|
||||
return ecma_is_value_null (value);
|
||||
} /* jerry_value_is_null */
|
||||
|
||||
/**
|
||||
@ -741,7 +721,7 @@ jerry_value_is_object (const jerry_value_t value) /**< api value */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
return ecma_is_value_object (jerry_get_arg_value (value));
|
||||
return ecma_is_value_object (value);
|
||||
} /* jerry_value_is_object */
|
||||
|
||||
/**
|
||||
@ -755,9 +735,8 @@ jerry_value_is_promise (const jerry_value_t value) /**< api value */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
#ifndef CONFIG_DISABLE_ES2015_PROMISE_BUILTIN
|
||||
jerry_value_t promise = jerry_get_arg_value (value);
|
||||
return (ecma_is_value_object (promise)
|
||||
&& ecma_is_promise (ecma_get_object_from_value (promise)));
|
||||
return (ecma_is_value_object (value)
|
||||
&& ecma_is_promise (ecma_get_object_from_value (value)));
|
||||
#else /* CONFIG_DISABLE_ES2015_PROMISE_BUILTIN */
|
||||
JERRY_UNUSED (value);
|
||||
return false;
|
||||
@ -775,7 +754,7 @@ jerry_value_is_string (const jerry_value_t value) /**< api value */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
return ecma_is_value_string (jerry_get_arg_value (value));
|
||||
return ecma_is_value_string (value);
|
||||
} /* jerry_value_is_string */
|
||||
|
||||
/**
|
||||
@ -789,7 +768,7 @@ jerry_value_is_undefined (const jerry_value_t value) /**< api value */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
return ecma_is_value_undefined (jerry_get_arg_value (value));
|
||||
return ecma_is_value_undefined (value);
|
||||
} /* jerry_value_is_undefined */
|
||||
|
||||
/**
|
||||
@ -802,8 +781,12 @@ jerry_value_get_type (const jerry_value_t value) /**< input value to check */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
jerry_value_t argument = jerry_get_arg_value (value);
|
||||
lit_magic_string_id_t lit_id = ecma_get_typeof_lit_id (argument);
|
||||
if (ecma_is_value_error_reference (value))
|
||||
{
|
||||
return JERRY_TYPE_ERROR;
|
||||
}
|
||||
|
||||
lit_magic_string_id_t lit_id = ecma_get_typeof_lit_id (value);
|
||||
|
||||
JERRY_ASSERT (lit_id != LIT_MAGIC_STRING__EMPTY);
|
||||
|
||||
@ -836,7 +819,7 @@ jerry_value_get_type (const jerry_value_t value) /**< input value to check */
|
||||
/* Based on the ECMA 262 5.1 standard the 'null' value is an object.
|
||||
* Thus we'll do an extra check for 'null' here.
|
||||
*/
|
||||
return ecma_is_value_null (argument) ? JERRY_TYPE_NULL : JERRY_TYPE_OBJECT;
|
||||
return ecma_is_value_null (value) ? JERRY_TYPE_NULL : JERRY_TYPE_OBJECT;
|
||||
}
|
||||
}
|
||||
} /* jerry_value_get_type */
|
||||
@ -1012,16 +995,19 @@ jerry_get_value_from_error (jerry_value_t value, /**< api value */
|
||||
* JERRY_ERROR_NONE - if the input value is not an Error object
|
||||
*/
|
||||
jerry_error_t
|
||||
jerry_get_error_type (const jerry_value_t value) /**< api value */
|
||||
jerry_get_error_type (jerry_value_t value) /**< api value */
|
||||
{
|
||||
jerry_value_t object = jerry_get_arg_value (value);
|
||||
if (JERRY_UNLIKELY (ecma_is_value_error_reference (value)))
|
||||
{
|
||||
value = ecma_get_error_reference_from_value (value)->value;
|
||||
}
|
||||
|
||||
if (!ecma_is_value_object (object))
|
||||
if (!ecma_is_value_object (value))
|
||||
{
|
||||
return JERRY_ERROR_NONE;
|
||||
}
|
||||
|
||||
ecma_object_t *object_p = ecma_get_object_from_value (object);
|
||||
ecma_object_t *object_p = ecma_get_object_from_value (value);
|
||||
ecma_standard_error_t error_type = ecma_get_error_type (object_p);
|
||||
|
||||
return (jerry_error_t) error_type;
|
||||
@ -1037,14 +1023,7 @@ jerry_get_boolean_value (const jerry_value_t value) /**< api value */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
jerry_value_t boolean = jerry_get_arg_value (value);
|
||||
|
||||
if (!ecma_is_value_boolean (boolean))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return ecma_is_value_true (boolean);
|
||||
return ecma_is_value_true (value);
|
||||
} /* jerry_get_boolean_value */
|
||||
|
||||
/**
|
||||
@ -1057,14 +1036,12 @@ jerry_get_number_value (const jerry_value_t value) /**< api value */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
jerry_value_t number = jerry_get_arg_value (value);
|
||||
|
||||
if (!ecma_is_value_number (number))
|
||||
if (!ecma_is_value_number (value))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
return (double) ecma_get_number_from_value (number);
|
||||
return (double) ecma_get_number_from_value (value);
|
||||
} /* jerry_get_number_value */
|
||||
|
||||
/**
|
||||
@ -1515,14 +1492,12 @@ jerry_get_array_length (const jerry_value_t value) /**< api value */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
jerry_value_t array = jerry_get_arg_value (value);
|
||||
|
||||
if (!jerry_value_is_array (array))
|
||||
if (!jerry_value_is_array (value))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
ecma_value_t len_value = ecma_op_object_get_by_magic_id (ecma_get_object_from_value (array),
|
||||
ecma_value_t len_value = ecma_op_object_get_by_magic_id (ecma_get_object_from_value (value),
|
||||
LIT_MAGIC_STRING_LENGTH);
|
||||
|
||||
jerry_length_t length = ecma_number_to_uint32 (ecma_get_number_from_value (len_value));
|
||||
@ -1544,14 +1519,12 @@ jerry_get_string_size (const jerry_value_t value) /**< input string */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
jerry_value_t string = jerry_get_arg_value (value);
|
||||
|
||||
if (!ecma_is_value_string (string))
|
||||
if (!ecma_is_value_string (value))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
return ecma_string_get_size (ecma_get_string_from_value (string));
|
||||
return ecma_string_get_size (ecma_get_string_from_value (value));
|
||||
} /* jerry_get_string_size */
|
||||
|
||||
/**
|
||||
@ -1567,14 +1540,12 @@ jerry_get_utf8_string_size (const jerry_value_t value) /**< input string */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
jerry_value_t string = jerry_get_arg_value (value);
|
||||
|
||||
if (!ecma_is_value_string (string))
|
||||
if (!ecma_is_value_string (value))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
return ecma_string_get_utf8_size (ecma_get_string_from_value (string));
|
||||
return ecma_string_get_utf8_size (ecma_get_string_from_value (value));
|
||||
} /* jerry_get_utf8_string_size */
|
||||
|
||||
/**
|
||||
@ -1590,14 +1561,12 @@ jerry_get_string_length (const jerry_value_t value) /**< input string */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
jerry_value_t string = jerry_get_arg_value (value);
|
||||
|
||||
if (!ecma_is_value_string (string))
|
||||
if (!ecma_is_value_string (value))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
return ecma_string_get_length (ecma_get_string_from_value (string));
|
||||
return ecma_string_get_length (ecma_get_string_from_value (value));
|
||||
} /* jerry_get_string_length */
|
||||
|
||||
/**
|
||||
@ -1613,14 +1582,12 @@ jerry_get_utf8_string_length (const jerry_value_t value) /**< input string */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
jerry_value_t string = jerry_get_arg_value (value);
|
||||
|
||||
if (!ecma_is_value_string (string))
|
||||
if (!ecma_is_value_string (value))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
return ecma_string_get_utf8_length (ecma_get_string_from_value (string));
|
||||
return ecma_string_get_utf8_length (ecma_get_string_from_value (value));
|
||||
} /* jerry_get_utf8_string_length */
|
||||
|
||||
/**
|
||||
@ -1645,14 +1612,12 @@ jerry_string_to_char_buffer (const jerry_value_t value, /**< input string value
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
jerry_value_t string = jerry_get_arg_value (value);
|
||||
|
||||
if (!ecma_is_value_string (string) || buffer_p == NULL)
|
||||
if (!ecma_is_value_string (value) || buffer_p == NULL)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
ecma_string_t *str_p = ecma_get_string_from_value (string);
|
||||
ecma_string_t *str_p = ecma_get_string_from_value (value);
|
||||
|
||||
if (ecma_string_get_size (str_p) > buffer_size)
|
||||
{
|
||||
@ -1686,14 +1651,12 @@ jerry_string_to_utf8_char_buffer (const jerry_value_t value, /**< input string v
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
jerry_value_t string = jerry_get_arg_value (value);
|
||||
|
||||
if (!ecma_is_value_string (string) || buffer_p == NULL)
|
||||
if (!ecma_is_value_string (value) || buffer_p == NULL)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
ecma_string_t *str_p = ecma_get_string_from_value (string);
|
||||
ecma_string_t *str_p = ecma_get_string_from_value (value);
|
||||
|
||||
if (ecma_string_get_utf8_size (str_p) > buffer_size)
|
||||
{
|
||||
@ -1725,14 +1688,12 @@ jerry_substring_to_char_buffer (const jerry_value_t value, /**< input string val
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
jerry_value_t string = jerry_get_arg_value (value);
|
||||
|
||||
if (!ecma_is_value_string (string) || buffer_p == NULL)
|
||||
if (!ecma_is_value_string (value) || buffer_p == NULL)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
ecma_string_t *str_p = ecma_get_string_from_value (string);
|
||||
ecma_string_t *str_p = ecma_get_string_from_value (value);
|
||||
|
||||
return ecma_substring_copy_to_cesu8_buffer (str_p,
|
||||
start_pos,
|
||||
@ -1761,14 +1722,12 @@ jerry_substring_to_utf8_char_buffer (const jerry_value_t value, /**< input strin
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
jerry_value_t string = jerry_get_arg_value (value);
|
||||
|
||||
if (!ecma_is_value_string (string) || buffer_p == NULL)
|
||||
if (!ecma_is_value_string (value) || buffer_p == NULL)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
ecma_string_t *str_p = ecma_get_string_from_value (string);
|
||||
ecma_string_t *str_p = ecma_get_string_from_value (value);
|
||||
|
||||
return ecma_substring_copy_to_utf8_buffer (str_p,
|
||||
start_pos,
|
||||
@ -1789,17 +1748,14 @@ jerry_has_property (const jerry_value_t obj_val, /**< object value */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
jerry_value_t obj_value = jerry_get_arg_value (obj_val);
|
||||
jerry_value_t prop_name_value = jerry_get_arg_value (prop_name_val);
|
||||
|
||||
if (!ecma_is_value_object (obj_value)
|
||||
|| !ecma_is_value_string (prop_name_value))
|
||||
if (!ecma_is_value_object (obj_val)
|
||||
|| !ecma_is_value_string (prop_name_val))
|
||||
{
|
||||
return ecma_make_boolean_value (false);
|
||||
}
|
||||
|
||||
bool has_property = ecma_op_object_has_property (ecma_get_object_from_value (obj_value),
|
||||
ecma_get_string_from_value (prop_name_value));
|
||||
bool has_property = ecma_op_object_has_property (ecma_get_object_from_value (obj_val),
|
||||
ecma_get_string_from_value (prop_name_val));
|
||||
|
||||
return ecma_make_boolean_value (has_property);
|
||||
} /* jerry_has_property */
|
||||
@ -1816,17 +1772,14 @@ jerry_has_own_property (const jerry_value_t obj_val, /**< object value */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
jerry_value_t obj_value = jerry_get_arg_value (obj_val);
|
||||
jerry_value_t prop_name_value = jerry_get_arg_value (prop_name_val);
|
||||
|
||||
if (!ecma_is_value_object (obj_value)
|
||||
|| !ecma_is_value_string (prop_name_value))
|
||||
if (!ecma_is_value_object (obj_val)
|
||||
|| !ecma_is_value_string (prop_name_val))
|
||||
{
|
||||
return ecma_make_boolean_value (false);
|
||||
}
|
||||
|
||||
bool has_property = ecma_op_object_has_own_property (ecma_get_object_from_value (obj_value),
|
||||
ecma_get_string_from_value (prop_name_value));
|
||||
bool has_property = ecma_op_object_has_own_property (ecma_get_object_from_value (obj_val),
|
||||
ecma_get_string_from_value (prop_name_val));
|
||||
|
||||
return ecma_make_boolean_value (has_property);
|
||||
} /* jerry_has_own_property */
|
||||
@ -1843,17 +1796,14 @@ jerry_delete_property (const jerry_value_t obj_val, /**< object value */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
jerry_value_t obj_value = jerry_get_arg_value (obj_val);
|
||||
jerry_value_t prop_name_value = jerry_get_arg_value (prop_name_val);
|
||||
|
||||
if (!ecma_is_value_object (obj_value)
|
||||
|| !ecma_is_value_string (prop_name_value))
|
||||
if (!ecma_is_value_object (obj_val)
|
||||
|| !ecma_is_value_string (prop_name_val))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
ecma_value_t ret_value = ecma_op_object_delete (ecma_get_object_from_value (obj_value),
|
||||
ecma_get_string_from_value (prop_name_value),
|
||||
ecma_value_t ret_value = ecma_op_object_delete (ecma_get_object_from_value (obj_val),
|
||||
ecma_get_string_from_value (prop_name_val),
|
||||
false);
|
||||
return ecma_is_value_true (ret_value);
|
||||
} /* jerry_delete_property */
|
||||
@ -1870,15 +1820,13 @@ jerry_delete_property_by_index (const jerry_value_t obj_val, /**< object value *
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
jerry_value_t obj_value = jerry_get_arg_value (obj_val);
|
||||
|
||||
if (!ecma_is_value_object (obj_value))
|
||||
if (!ecma_is_value_object (obj_val))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
ecma_string_t *str_idx_p = ecma_new_ecma_string_from_uint32 (index);
|
||||
ecma_value_t ret_value = ecma_op_object_delete (ecma_get_object_from_value (obj_value),
|
||||
ecma_value_t ret_value = ecma_op_object_delete (ecma_get_object_from_value (obj_val),
|
||||
str_idx_p,
|
||||
false);
|
||||
ecma_deref_ecma_string (str_idx_p);
|
||||
@ -1901,17 +1849,14 @@ jerry_get_property (const jerry_value_t obj_val, /**< object value */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
jerry_value_t obj_value = jerry_get_arg_value (obj_val);
|
||||
jerry_value_t prop_name_value = jerry_get_arg_value (prop_name_val);
|
||||
|
||||
if (!ecma_is_value_object (obj_value)
|
||||
|| !ecma_is_value_string (prop_name_value))
|
||||
if (!ecma_is_value_object (obj_val)
|
||||
|| !ecma_is_value_string (prop_name_val))
|
||||
{
|
||||
return jerry_throw (ecma_raise_type_error (ECMA_ERR_MSG (wrong_args_msg_p)));
|
||||
}
|
||||
|
||||
jerry_value_t ret_value = ecma_op_object_get (ecma_get_object_from_value (obj_value),
|
||||
ecma_get_string_from_value (prop_name_value));
|
||||
jerry_value_t ret_value = ecma_op_object_get (ecma_get_object_from_value (obj_val),
|
||||
ecma_get_string_from_value (prop_name_val));
|
||||
return jerry_return (ret_value);
|
||||
} /* jerry_get_property */
|
||||
|
||||
@ -1930,15 +1875,13 @@ jerry_get_property_by_index (const jerry_value_t obj_val, /**< object value */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
jerry_value_t obj_value = jerry_get_arg_value (obj_val);
|
||||
|
||||
if (!ecma_is_value_object (obj_value))
|
||||
if (!ecma_is_value_object (obj_val))
|
||||
{
|
||||
return jerry_throw (ecma_raise_type_error (ECMA_ERR_MSG (wrong_args_msg_p)));
|
||||
}
|
||||
|
||||
ecma_string_t *str_idx_p = ecma_new_ecma_string_from_uint32 (index);
|
||||
ecma_value_t ret_value = ecma_op_object_get (ecma_get_object_from_value (obj_value), str_idx_p);
|
||||
ecma_value_t ret_value = ecma_op_object_get (ecma_get_object_from_value (obj_val), str_idx_p);
|
||||
ecma_deref_ecma_string (str_idx_p);
|
||||
|
||||
return jerry_return (ret_value);
|
||||
@ -1960,18 +1903,15 @@ jerry_set_property (const jerry_value_t obj_val, /**< object value */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
jerry_value_t obj_value = jerry_get_arg_value (obj_val);
|
||||
jerry_value_t prop_name_value = jerry_get_arg_value (prop_name_val);
|
||||
|
||||
if (ecma_is_value_error_reference (value_to_set)
|
||||
|| !ecma_is_value_object (obj_value)
|
||||
|| !ecma_is_value_string (prop_name_value))
|
||||
|| !ecma_is_value_object (obj_val)
|
||||
|| !ecma_is_value_string (prop_name_val))
|
||||
{
|
||||
return jerry_throw (ecma_raise_type_error (ECMA_ERR_MSG (wrong_args_msg_p)));
|
||||
}
|
||||
|
||||
return jerry_return (ecma_op_object_put (ecma_get_object_from_value (obj_value),
|
||||
ecma_get_string_from_value (prop_name_value),
|
||||
return jerry_return (ecma_op_object_put (ecma_get_object_from_value (obj_val),
|
||||
ecma_get_string_from_value (prop_name_val),
|
||||
value_to_set,
|
||||
true));
|
||||
} /* jerry_set_property */
|
||||
@ -1992,16 +1932,14 @@ jerry_set_property_by_index (const jerry_value_t obj_val, /**< object value */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
jerry_value_t obj_value = jerry_get_arg_value (obj_val);
|
||||
|
||||
if (ecma_is_value_error_reference (value_to_set)
|
||||
|| !ecma_is_value_object (obj_value))
|
||||
|| !ecma_is_value_object (obj_val))
|
||||
{
|
||||
return jerry_throw (ecma_raise_type_error (ECMA_ERR_MSG (wrong_args_msg_p)));
|
||||
}
|
||||
|
||||
ecma_string_t *str_idx_p = ecma_new_ecma_string_from_uint32 ((uint32_t) index);
|
||||
ecma_value_t ret_value = ecma_op_object_put (ecma_get_object_from_value (obj_value),
|
||||
ecma_value_t ret_value = ecma_op_object_put (ecma_get_object_from_value (obj_val),
|
||||
str_idx_p,
|
||||
value_to_set,
|
||||
true);
|
||||
@ -2046,11 +1984,8 @@ jerry_define_own_property (const jerry_value_t obj_val, /**< object value */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
jerry_value_t obj_value = jerry_get_arg_value (obj_val);
|
||||
jerry_value_t prop_name_value = jerry_get_arg_value (prop_name_val);
|
||||
|
||||
if (!ecma_is_value_object (obj_value)
|
||||
|| !ecma_is_value_string (prop_name_value))
|
||||
if (!ecma_is_value_object (obj_val)
|
||||
|| !ecma_is_value_string (prop_name_val))
|
||||
{
|
||||
return jerry_throw (ecma_raise_type_error (ECMA_ERR_MSG (wrong_args_msg_p)));
|
||||
}
|
||||
@ -2129,8 +2064,8 @@ jerry_define_own_property (const jerry_value_t obj_val, /**< object value */
|
||||
}
|
||||
}
|
||||
|
||||
return ecma_op_object_define_own_property (ecma_get_object_from_value (obj_value),
|
||||
ecma_get_string_from_value (prop_name_value),
|
||||
return ecma_op_object_define_own_property (ecma_get_object_from_value (obj_val),
|
||||
ecma_get_string_from_value (prop_name_val),
|
||||
&prop_desc,
|
||||
true);
|
||||
} /* jerry_define_own_property */
|
||||
@ -2148,19 +2083,16 @@ jerry_get_own_property_descriptor (const jerry_value_t obj_val, /**< object val
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
jerry_value_t obj_value = jerry_get_arg_value (obj_val);
|
||||
jerry_value_t prop_name_value = jerry_get_arg_value (prop_name_val);
|
||||
|
||||
if (!ecma_is_value_object (obj_value)
|
||||
|| !ecma_is_value_string (prop_name_value))
|
||||
if (!ecma_is_value_object (obj_val)
|
||||
|| !ecma_is_value_string (prop_name_val))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
ecma_property_descriptor_t prop_desc;
|
||||
|
||||
if (!ecma_op_object_get_own_property_descriptor (ecma_get_object_from_value (obj_value),
|
||||
ecma_get_string_from_value (prop_name_value),
|
||||
if (!ecma_op_object_get_own_property_descriptor (ecma_get_object_from_value (obj_val),
|
||||
ecma_get_string_from_value (prop_name_val),
|
||||
&prop_desc))
|
||||
{
|
||||
return false;
|
||||
@ -2355,14 +2287,12 @@ jerry_get_object_keys (const jerry_value_t obj_val) /**< object value */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
jerry_value_t obj_value = jerry_get_arg_value (obj_val);
|
||||
|
||||
if (!ecma_is_value_object (obj_value))
|
||||
if (!ecma_is_value_object (obj_val))
|
||||
{
|
||||
return jerry_throw (ecma_raise_type_error (ECMA_ERR_MSG (wrong_args_msg_p)));
|
||||
}
|
||||
|
||||
return ecma_builtin_helper_object_get_properties (ecma_get_object_from_value (obj_value), true);
|
||||
return ecma_builtin_helper_object_get_properties (ecma_get_object_from_value (obj_val), true);
|
||||
} /* jerry_get_object_keys */
|
||||
|
||||
/**
|
||||
@ -2376,14 +2306,12 @@ jerry_get_prototype (const jerry_value_t obj_val) /**< object value */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
jerry_value_t obj_value = jerry_get_arg_value (obj_val);
|
||||
|
||||
if (!ecma_is_value_object (obj_value))
|
||||
if (!ecma_is_value_object (obj_val))
|
||||
{
|
||||
return jerry_throw (ecma_raise_type_error (ECMA_ERR_MSG (wrong_args_msg_p)));
|
||||
}
|
||||
|
||||
ecma_object_t *proto_obj_p = ecma_get_object_prototype (ecma_get_object_from_value (obj_value));
|
||||
ecma_object_t *proto_obj_p = ecma_get_object_prototype (ecma_get_object_from_value (obj_val));
|
||||
|
||||
if (proto_obj_p == NULL)
|
||||
{
|
||||
@ -2405,9 +2333,7 @@ jerry_set_prototype (const jerry_value_t obj_val, /**< object value */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
jerry_value_t obj_value = jerry_get_arg_value (obj_val);
|
||||
|
||||
if (!ecma_is_value_object (obj_value)
|
||||
if (!ecma_is_value_object (obj_val)
|
||||
|| ecma_is_value_error_reference (proto_obj_val)
|
||||
|| (!ecma_is_value_object (proto_obj_val) && !ecma_is_value_null (proto_obj_val)))
|
||||
{
|
||||
@ -2416,11 +2342,11 @@ jerry_set_prototype (const jerry_value_t obj_val, /**< object value */
|
||||
|
||||
if (ecma_is_value_null (proto_obj_val))
|
||||
{
|
||||
ECMA_SET_POINTER (ecma_get_object_from_value (obj_value)->prototype_or_outer_reference_cp, NULL);
|
||||
ECMA_SET_POINTER (ecma_get_object_from_value (obj_val)->prototype_or_outer_reference_cp, NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
ECMA_SET_POINTER (ecma_get_object_from_value (obj_value)->prototype_or_outer_reference_cp,
|
||||
ECMA_SET_POINTER (ecma_get_object_from_value (obj_val)->prototype_or_outer_reference_cp,
|
||||
ecma_get_object_from_value (proto_obj_val));
|
||||
}
|
||||
|
||||
@ -2441,15 +2367,13 @@ jerry_get_object_native_handle (const jerry_value_t obj_val, /**< object to get
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
jerry_value_t obj_value = jerry_get_arg_value (obj_val);
|
||||
|
||||
if (!ecma_is_value_object (obj_value))
|
||||
if (!ecma_is_value_object (obj_val))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
ecma_native_pointer_t *native_pointer_p;
|
||||
native_pointer_p = ecma_get_native_pointer_value (ecma_get_object_from_value (obj_value),
|
||||
native_pointer_p = ecma_get_native_pointer_value (ecma_get_object_from_value (obj_val),
|
||||
LIT_INTERNAL_MAGIC_STRING_NATIVE_HANDLE);
|
||||
|
||||
if (native_pointer_p == NULL)
|
||||
@ -2482,11 +2406,9 @@ jerry_set_object_native_handle (const jerry_value_t obj_val, /**< object to set
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
jerry_value_t obj_value = jerry_get_arg_value (obj_val);
|
||||
|
||||
if (ecma_is_value_object (obj_value))
|
||||
if (ecma_is_value_object (obj_val))
|
||||
{
|
||||
ecma_object_t *object_p = ecma_get_object_from_value (obj_value);
|
||||
ecma_object_t *object_p = ecma_get_object_from_value (obj_val);
|
||||
|
||||
ecma_create_native_handle_property (object_p,
|
||||
(void *) handle_p,
|
||||
@ -2579,15 +2501,13 @@ jerry_get_object_native_pointer (const jerry_value_t obj_val, /**< object to get
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
jerry_value_t obj_value = jerry_get_arg_value (obj_val);
|
||||
|
||||
if (!ecma_is_value_object (obj_value))
|
||||
if (!ecma_is_value_object (obj_val))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
ecma_native_pointer_t *native_pointer_p;
|
||||
native_pointer_p = ecma_get_native_pointer_value (ecma_get_object_from_value (obj_value),
|
||||
native_pointer_p = ecma_get_native_pointer_value (ecma_get_object_from_value (obj_val),
|
||||
LIT_INTERNAL_MAGIC_STRING_NATIVE_POINTER);
|
||||
|
||||
if (native_pointer_p == NULL)
|
||||
@ -2628,11 +2548,9 @@ jerry_set_object_native_pointer (const jerry_value_t obj_val, /**< object to set
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
jerry_value_t obj_value = jerry_get_arg_value (obj_val);
|
||||
|
||||
if (ecma_is_value_object (obj_value))
|
||||
if (ecma_is_value_object (obj_val))
|
||||
{
|
||||
ecma_object_t *object_p = ecma_get_object_from_value (obj_value);
|
||||
ecma_object_t *object_p = ecma_get_object_from_value (obj_val);
|
||||
|
||||
ecma_create_native_pointer_property (object_p, native_pointer_p, (void *) native_info_p);
|
||||
}
|
||||
@ -2654,14 +2572,12 @@ jerry_foreach_object_property (const jerry_value_t obj_val, /**< object value */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
jerry_value_t obj_value = jerry_get_arg_value (obj_val);
|
||||
|
||||
if (!ecma_is_value_object (obj_value))
|
||||
if (!ecma_is_value_object (obj_val))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
ecma_object_t *object_p = ecma_get_object_from_value (obj_value);
|
||||
ecma_object_t *object_p = ecma_get_object_from_value (obj_val);
|
||||
ecma_collection_header_t *names_p = ecma_op_object_get_property_names (object_p, false, true, true);
|
||||
ecma_value_t *ecma_value_p = ecma_collection_iterator_init (names_p);
|
||||
|
||||
@ -2892,8 +2808,7 @@ jerry_value_is_arraybuffer (const jerry_value_t value) /**< value to check if it
|
||||
jerry_assert_api_available ();
|
||||
|
||||
#ifndef CONFIG_DISABLE_ES2015_TYPEDARRAY_BUILTIN
|
||||
jerry_value_t buffer = jerry_get_arg_value (value);
|
||||
return ecma_is_arraybuffer (buffer);
|
||||
return ecma_is_arraybuffer (value);
|
||||
#else /* CONFIG_DISABLE_ES2015_TYPEDARRAY_BUILTIN */
|
||||
JERRY_UNUSED (value);
|
||||
return false;
|
||||
@ -2976,14 +2891,12 @@ jerry_arraybuffer_write (const jerry_value_t value, /**< target ArrayBuffer */
|
||||
jerry_assert_api_available ();
|
||||
|
||||
#ifndef CONFIG_DISABLE_ES2015_TYPEDARRAY_BUILTIN
|
||||
jerry_value_t buffer = jerry_get_arg_value (value);
|
||||
|
||||
if (!ecma_is_arraybuffer (buffer))
|
||||
if (!ecma_is_arraybuffer (value))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
ecma_object_t *buffer_p = ecma_get_object_from_value (buffer);
|
||||
ecma_object_t *buffer_p = ecma_get_object_from_value (value);
|
||||
jerry_length_t length = ecma_arraybuffer_get_length (buffer_p);
|
||||
|
||||
if (offset >= length)
|
||||
@ -3027,14 +2940,12 @@ jerry_arraybuffer_read (const jerry_value_t value, /**< ArrayBuffer to read from
|
||||
jerry_assert_api_available ();
|
||||
|
||||
#ifndef CONFIG_DISABLE_ES2015_TYPEDARRAY_BUILTIN
|
||||
jerry_value_t buffer = jerry_get_arg_value (value);
|
||||
|
||||
if (!ecma_is_arraybuffer (buffer))
|
||||
if (!ecma_is_arraybuffer (value))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
ecma_object_t *buffer_p = ecma_get_object_from_value (buffer);
|
||||
ecma_object_t *buffer_p = ecma_get_object_from_value (value);
|
||||
jerry_length_t length = ecma_arraybuffer_get_length (buffer_p);
|
||||
|
||||
if (offset >= length)
|
||||
@ -3075,10 +2986,9 @@ jerry_get_arraybuffer_byte_length (const jerry_value_t value) /**< ArrayBuffer *
|
||||
jerry_assert_api_available ();
|
||||
|
||||
#ifndef CONFIG_DISABLE_ES2015_TYPEDARRAY_BUILTIN
|
||||
jerry_value_t buffer = jerry_get_arg_value (value);
|
||||
if (ecma_is_arraybuffer (buffer))
|
||||
if (ecma_is_arraybuffer (value))
|
||||
{
|
||||
ecma_object_t *buffer_p = ecma_get_object_from_value (buffer);
|
||||
ecma_object_t *buffer_p = ecma_get_object_from_value (value);
|
||||
return ecma_arraybuffer_get_length (buffer_p);
|
||||
}
|
||||
#else /* CONFIG_DISABLE_ES2015_TYPEDARRAY_BUILTIN */
|
||||
@ -3105,14 +3015,12 @@ jerry_get_arraybuffer_pointer (const jerry_value_t value) /**< Array Buffer to u
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
#ifndef CONFIG_DISABLE_ES2015_TYPEDARRAY_BUILTIN
|
||||
jerry_value_t buffer = jerry_get_arg_value (value);
|
||||
|
||||
if (!ecma_is_arraybuffer (buffer))
|
||||
if (!ecma_is_arraybuffer (value))
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ecma_object_t *buffer_p = ecma_get_object_from_value (buffer);
|
||||
ecma_object_t *buffer_p = ecma_get_object_from_value (value);
|
||||
if (ECMA_ARRAYBUFFER_HAS_EXTERNAL_MEMORY (buffer_p))
|
||||
{
|
||||
jerry_acquire_value (value);
|
||||
@ -3143,8 +3051,7 @@ jerry_value_is_typedarray (jerry_value_t value) /**< value to check if it is a T
|
||||
jerry_assert_api_available ();
|
||||
|
||||
#ifndef CONFIG_DISABLE_ES2015_TYPEDARRAY_BUILTIN
|
||||
jerry_value_t array = jerry_get_arg_value (value);
|
||||
return ecma_is_typedarray (array);
|
||||
return ecma_is_typedarray (value);
|
||||
#else /* CONFIG_DISABLE_ES2015_TYPEDARRAY_BUILTIN */
|
||||
JERRY_UNUSED (value);
|
||||
return false;
|
||||
@ -3291,8 +3198,7 @@ jerry_create_typedarray_for_arraybuffer_sz (jerry_typedarray_type_t type_name, /
|
||||
return jerry_throw (ecma_raise_type_error (ECMA_ERR_MSG ("incorrect type for TypedArray.")));
|
||||
}
|
||||
|
||||
jerry_value_t buffer = jerry_get_arg_value (arraybuffer);
|
||||
if (!ecma_is_arraybuffer (buffer))
|
||||
if (!ecma_is_arraybuffer (arraybuffer))
|
||||
{
|
||||
return jerry_throw (ecma_raise_type_error (ECMA_ERR_MSG ("Argument is not an ArrayBuffer")));
|
||||
}
|
||||
@ -3350,13 +3256,12 @@ jerry_get_typedarray_type (jerry_value_t value) /**< object to get the TypedArra
|
||||
jerry_assert_api_available ();
|
||||
|
||||
#ifndef CONFIG_DISABLE_ES2015_TYPEDARRAY_BUILTIN
|
||||
jerry_value_t array = jerry_get_arg_value (value);
|
||||
if (!ecma_is_typedarray (array))
|
||||
if (!ecma_is_typedarray (value))
|
||||
{
|
||||
return JERRY_TYPEDARRAY_INVALID;
|
||||
}
|
||||
|
||||
ecma_object_t *array_p = ecma_get_object_from_value (array);
|
||||
ecma_object_t *array_p = ecma_get_object_from_value (value);
|
||||
|
||||
lit_magic_string_id_t class_name_id = ecma_object_get_class_name (array_p);
|
||||
for (uint32_t i = 0; i < sizeof (jerry_typedarray_mappings) / sizeof (jerry_typedarray_mappings[0]); i++)
|
||||
@ -3384,10 +3289,9 @@ jerry_get_typedarray_length (jerry_value_t value) /**< TypedArray to query */
|
||||
jerry_assert_api_available ();
|
||||
|
||||
#ifndef CONFIG_DISABLE_ES2015_TYPEDARRAY_BUILTIN
|
||||
jerry_value_t array = jerry_get_arg_value (value);
|
||||
if (ecma_is_typedarray (array))
|
||||
if (ecma_is_typedarray (value))
|
||||
{
|
||||
ecma_object_t *array_p = ecma_get_object_from_value (array);
|
||||
ecma_object_t *array_p = ecma_get_object_from_value (value);
|
||||
return ecma_typedarray_get_length (array_p);
|
||||
}
|
||||
#else /* CONFIG_DISABLE_ES2015_TYPEDARRAY_BUILTIN */
|
||||
@ -3417,13 +3321,12 @@ jerry_get_typedarray_buffer (jerry_value_t value, /**< TypedArray to get the arr
|
||||
jerry_assert_api_available ();
|
||||
|
||||
#ifndef CONFIG_DISABLE_ES2015_TYPEDARRAY_BUILTIN
|
||||
jerry_value_t array = jerry_get_arg_value (value);
|
||||
if (!ecma_is_typedarray (array))
|
||||
if (!ecma_is_typedarray (value))
|
||||
{
|
||||
return jerry_throw (ecma_raise_type_error (ECMA_ERR_MSG ("Object is not a TypedArray.")));
|
||||
}
|
||||
|
||||
ecma_object_t *array_p = ecma_get_object_from_value (array);
|
||||
ecma_object_t *array_p = ecma_get_object_from_value (value);
|
||||
uint8_t shift = ecma_typedarray_get_element_size_shift (array_p);
|
||||
|
||||
if (byte_length != NULL)
|
||||
|
||||
@ -367,6 +367,7 @@ typedef enum
|
||||
JERRY_TYPE_STRING, /**< string type */
|
||||
JERRY_TYPE_OBJECT, /**< object type */
|
||||
JERRY_TYPE_FUNCTION, /**< function type */
|
||||
JERRY_TYPE_ERROR, /**< error/abort type */
|
||||
} jerry_type_t;
|
||||
|
||||
jerry_type_t jerry_value_get_type (const jerry_value_t value);
|
||||
@ -386,7 +387,7 @@ jerry_value_t jerry_get_value_from_error (jerry_value_t value, bool release);
|
||||
/**
|
||||
* Error object function(s).
|
||||
*/
|
||||
jerry_error_t jerry_get_error_type (const jerry_value_t value);
|
||||
jerry_error_t jerry_get_error_type (jerry_value_t value);
|
||||
|
||||
/**
|
||||
* Getter functions of 'jerry_value_t'.
|
||||
|
||||
@ -35,10 +35,14 @@ jerryx_module_create_error (jerry_error_t error_type, /**< the type of error to
|
||||
const jerry_value_t module_name) /**< the module name */
|
||||
{
|
||||
jerry_value_t ret = jerry_create_error (error_type, message);
|
||||
|
||||
jerry_value_t error_object = jerry_get_value_from_error (ret, false);
|
||||
jerry_value_t property_name = jerry_create_string (module_name_property_name);
|
||||
|
||||
jerry_release_value (jerry_set_property (ret, property_name, module_name));
|
||||
jerry_release_value (jerry_set_property (error_object, property_name, module_name));
|
||||
|
||||
jerry_release_value (property_name);
|
||||
jerry_release_value (error_object);
|
||||
return ret;
|
||||
} /* jerryx_module_create_error */
|
||||
|
||||
|
||||
@ -63,7 +63,7 @@ main (void)
|
||||
|
||||
ENTRY (JERRY_TYPE_OBJECT, jerry_create_object ()),
|
||||
ENTRY (JERRY_TYPE_OBJECT, jerry_create_array (10)),
|
||||
ENTRY (JERRY_TYPE_OBJECT, jerry_create_error (JERRY_ERROR_TYPE, (const jerry_char_t *) "error")),
|
||||
ENTRY (JERRY_TYPE_ERROR, jerry_create_error (JERRY_ERROR_TYPE, (const jerry_char_t *) "error")),
|
||||
|
||||
ENTRY (JERRY_TYPE_NULL, jerry_create_null ()),
|
||||
|
||||
|
||||
@ -854,6 +854,7 @@ main (void)
|
||||
jerry_release_value (val_t);
|
||||
|
||||
/* 'res' should contain exception object */
|
||||
res = jerry_get_value_from_error (res, true);
|
||||
TEST_ASSERT (jerry_value_is_object (res));
|
||||
jerry_release_value (res);
|
||||
|
||||
@ -863,6 +864,7 @@ main (void)
|
||||
TEST_ASSERT (jerry_value_is_error (res));
|
||||
|
||||
/* 'res' should contain exception object */
|
||||
res = jerry_get_value_from_error (res, true);
|
||||
TEST_ASSERT (jerry_value_is_object (res));
|
||||
jerry_release_value (res);
|
||||
|
||||
@ -878,6 +880,7 @@ main (void)
|
||||
jerry_release_value (val_t);
|
||||
|
||||
/* 'res' should contain exception object */
|
||||
res = jerry_get_value_from_error (res, true);
|
||||
TEST_ASSERT (jerry_value_is_object (res));
|
||||
jerry_release_value (res);
|
||||
|
||||
@ -887,6 +890,7 @@ main (void)
|
||||
TEST_ASSERT (jerry_value_is_error (res));
|
||||
|
||||
/* 'res' should contain exception object */
|
||||
res = jerry_get_value_from_error (res, true);
|
||||
TEST_ASSERT (jerry_value_is_object (res));
|
||||
jerry_release_value (res);
|
||||
|
||||
|
||||
@ -39,6 +39,7 @@ main (int argc, char **argv)
|
||||
TEST_ASSERT (jerry_value_is_error (module));
|
||||
|
||||
/* Retrieve the error message. */
|
||||
module = jerry_get_value_from_error (module, true);
|
||||
jerry_value_t prop_name = jerry_create_string ((const jerry_char_t *) "message");
|
||||
jerry_value_t prop = jerry_get_property (module, prop_name);
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user