diff --git a/docs/02.API-REFERENCE.md b/docs/02.API-REFERENCE.md index c4c5c7a4b7972c7bca94a61ae6fdf6aa76853563..0a232953d0548fa873cf5638a8f207b7d038a05f 100644 --- a/docs/02.API-REFERENCE.md +++ b/docs/02.API-REFERENCE.md @@ -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 diff --git a/jerry-core/api/jerry.c b/jerry-core/api/jerry.c index 6a8f9166afec25daf566cfc5be29ef401ee269c8..c4622a009a7cce760c9c869d0b73c541148ea503 100644 --- a/jerry-core/api/jerry.c +++ b/jerry-core/api/jerry.c @@ -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) diff --git a/jerry-core/include/jerryscript-core.h b/jerry-core/include/jerryscript-core.h index 561e698686742705692d828d5139dde4a5af8116..22e23e47dc75dc98fa9499415e27573ff54cded8 100644 --- a/jerry-core/include/jerryscript-core.h +++ b/jerry-core/include/jerryscript-core.h @@ -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'. diff --git a/jerry-ext/module/module.c b/jerry-ext/module/module.c index fa972b7ea65ae2c54a74bbfa4da996c81b1aee3d..896b7caa99066d155d31543db6fb02eac632cc27 100644 --- a/jerry-ext/module/module.c +++ b/jerry-ext/module/module.c @@ -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 */ diff --git a/tests/unit-core/test-api-value-type.c b/tests/unit-core/test-api-value-type.c index 01d5b93ef11bbef6b84b4be05f696cad756625d3..45bf0cf7c274ead06675ab0d0ae35ee0a770e6f0 100644 --- a/tests/unit-core/test-api-value-type.c +++ b/tests/unit-core/test-api-value-type.c @@ -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 ()), diff --git a/tests/unit-core/test-api.c b/tests/unit-core/test-api.c index 6dcb4ade6959952928e5c22c6001972d2677f184..bd546b7c04a08348c42283b047af4ddcfdc083ed 100644 --- a/tests/unit-core/test-api.c +++ b/tests/unit-core/test-api.c @@ -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); diff --git a/tests/unit-ext/test-ext-module-empty.c b/tests/unit-ext/test-ext-module-empty.c index 7b5b2259ab96eb2eaff5e21e1d8055e99d1bc111..0e31658230e119493092a5e5575505736011f95b 100644 --- a/tests/unit-ext/test-ext-module-empty.c +++ b/tests/unit-ext/test-ext-module-empty.c @@ -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);