From 7baaafa40529f198c15d2630c80869394ff658b6 Mon Sep 17 00:00:00 2001 From: Zoltan Herczeg Date: Thu, 7 Jan 2021 11:09:07 +0100 Subject: [PATCH] Fix the return value of jerry_to_property_descriptor function (#4371) JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com --- docs/02.API-REFERENCE.md | 15 ++++--- jerry-core/api/jerry.c | 41 ++++++++----------- jerry-core/ecma/operations/ecma-conversion.c | 7 ++-- jerry-core/include/jerryscript-core.h | 2 +- tests/unit-core/test-to-property-descriptor.c | 12 +++++- 5 files changed, 39 insertions(+), 38 deletions(-) diff --git a/docs/02.API-REFERENCE.md b/docs/02.API-REFERENCE.md index f51041d88..7c7140949 100644 --- a/docs/02.API-REFERENCE.md +++ b/docs/02.API-REFERENCE.md @@ -4071,12 +4071,13 @@ This API function is equivalent to ToPropertyDescriptor operation defined in ECM It decodes the ECMAScript object and fills the fields of a JerryScript property descriptor. *Notes*: -- The es.next profile enables this by default. +- Returned value must be freed with [jerry_release_value](#jerry_release_value) when it + is no longer needed. **Prototype** ```c -bool +jerry_value_t jerry_to_property_descriptor (jerry_value_t obj_value, jerry_property_descriptor_t *out_prop_desc_p); ``` @@ -4084,8 +4085,10 @@ jerry_to_property_descriptor (jerry_value_t obj_value, jerry_property_descriptor - `src_prop_desc_p` - the output property descriptor. - return - [jerry_value_t](#jerry_value_t) - - true - if success - - false - if error occurs + - true, if success + - thrown error, otherwise + +*New in version [[NEXT_RELEASE]]*. **Example** @@ -4102,9 +4105,9 @@ example (void) jerry_value_t value = jerry_create_boolean (true); jerry_property_descriptor_t prop_desc; - jerry_set_property (object, prop_name, prop_name); + jerry_release_value (jerry_set_property (object, prop_name, prop_name)); - jerry_to_property_descriptor (object, &prop_desc); + jerry_release_value (jerry_to_property_descriptor (object, &prop_desc)); jerry_release_value (object); jerry_release_value (prop_name); diff --git a/jerry-core/api/jerry.c b/jerry-core/api/jerry.c index 99f15fafb..9a40e0817 100644 --- a/jerry-core/api/jerry.c +++ b/jerry-core/api/jerry.c @@ -4043,7 +4043,8 @@ jerry_object_get_property_names (const jerry_value_t obj_val, /**< object */ return ecma_op_new_array_object_from_collection (result_p, false); } /* jerry_object_get_property_names */ -/** FromPropertyDescriptor abstract operation. +/** + * FromPropertyDescriptor abstract operation. * * @return new jerry_value_t - if success * value marked with error flag - otherwise @@ -4066,41 +4067,31 @@ jerry_from_property_descriptor (const jerry_property_descriptor_t *src_prop_desc } /* jerry_from_property_descriptor */ /** -* ToPropertyDescriptor abstract operation. -* -* @return thrown error - if any conversion error happens -* ECMA_VALUE_TRUE - otherwise. -*/ -bool + * ToPropertyDescriptor abstract operation. + * + * @return true - if the conversion is successful + * thrown error - otherwise + */ +jerry_value_t jerry_to_property_descriptor (jerry_value_t obj_value, /**< object value */ - jerry_property_descriptor_t *out_prop_desc_p) /**< [out] filled property descriptor - if return value is normal - empty completion value */ + jerry_property_descriptor_t *out_prop_desc_p) /**< [out] filled property descriptor + * if return value is true, + * unmodified otherwise */ { jerry_assert_api_available (); - if (!ecma_is_value_object (obj_value)) - { - jerry_throw (ecma_raise_type_error (ECMA_ERR_MSG (wrong_args_msg_p))); - } - ecma_property_descriptor_t prop_desc; jerry_value_t result = ecma_op_to_property_descriptor (obj_value, &prop_desc); if (ECMA_IS_VALUE_ERROR (result)) { - return false; + return jerry_throw (result); } + + JERRY_ASSERT (result == ECMA_VALUE_EMPTY); + *out_prop_desc_p = jerry_property_descriptor_from_ecma (&prop_desc); - - if (ECMA_IS_VALUE_ERROR (out_prop_desc_p->value)) - { - jerry_release_value (result); - return false; - } - - jerry_release_value (result); - return true; + return ECMA_VALUE_TRUE; } /* jerry_to_property_descriptor */ /** diff --git a/jerry-core/ecma/operations/ecma-conversion.c b/jerry-core/ecma/operations/ecma-conversion.c index ed7135fec..eb980f11d 100644 --- a/jerry-core/ecma/operations/ecma-conversion.c +++ b/jerry-core/ecma/operations/ecma-conversion.c @@ -717,14 +717,13 @@ ecma_op_from_property_descriptor (const ecma_property_descriptor_t *src_prop_des * See also: * ECMA-262 v5, 8.10.5 * - * @return ecma value - * Returned value must be freed with ecma_free_value + * @return ECMA_VALUE_EMPTY if successful, ECMA_VALUE_ERROR otherwise */ ecma_value_t ecma_op_to_property_descriptor (ecma_value_t obj_value, /**< object value */ ecma_property_descriptor_t *out_prop_desc_p) /**< [out] filled property descriptor - if return value is normal - empty completion value */ + * if the operation is successful, + * unmodified otherwise */ { /* 1. */ if (!ecma_is_value_object (obj_value)) diff --git a/jerry-core/include/jerryscript-core.h b/jerry-core/include/jerryscript-core.h index e9265a4f1..8f44bf3a5 100644 --- a/jerry-core/include/jerryscript-core.h +++ b/jerry-core/include/jerryscript-core.h @@ -663,7 +663,7 @@ bool jerry_foreach_object_property (const jerry_value_t obj_val, jerry_object_pr jerry_value_t jerry_object_get_property_names (const jerry_value_t obj_val, jerry_property_filter_t filter); jerry_value_t jerry_from_property_descriptor (const jerry_property_descriptor_t *src_prop_desc_p); -bool jerry_to_property_descriptor (jerry_value_t obj_value, jerry_property_descriptor_t *out_prop_desc_p); +jerry_value_t jerry_to_property_descriptor (jerry_value_t obj_value, jerry_property_descriptor_t *out_prop_desc_p); /** * Promise functions. */ diff --git a/tests/unit-core/test-to-property-descriptor.c b/tests/unit-core/test-to-property-descriptor.c index 410e0b28e..cf991b5af 100644 --- a/tests/unit-core/test-to-property-descriptor.c +++ b/tests/unit-core/test-to-property-descriptor.c @@ -44,8 +44,9 @@ main (void) prop_name = jerry_create_string_from_utf8 ((jerry_char_t *) "configurable"); TEST_ASSERT (jerry_set_property (object, prop_name, value)); - bool result = jerry_to_property_descriptor (object, &prop_desc); - TEST_ASSERT (result); + jerry_value_t result = jerry_to_property_descriptor (object, &prop_desc); + TEST_ASSERT (jerry_value_is_boolean (result) && jerry_get_boolean_value (result)); + jerry_release_value (result); prop_name = jerry_create_string_from_utf8 ((jerry_char_t *) "value"); value = jerry_get_property (object, prop_name); @@ -71,6 +72,13 @@ main (void) jerry_release_value (prop_name); jerry_release_value (value); jerry_free_property_descriptor_fields (&prop_desc); + + object = jerry_create_null (); + result = jerry_to_property_descriptor (object, &prop_desc); + TEST_ASSERT (jerry_value_is_error (result)); + jerry_release_value (result); + jerry_release_value (object); + jerry_cleanup (); return 0; } /* main */