diff --git a/docs/02.API-REFERENCE.md b/docs/02.API-REFERENCE.md index 2b8f8e46c..9f5b42e00 100644 --- a/docs/02.API-REFERENCE.md +++ b/docs/02.API-REFERENCE.md @@ -484,6 +484,28 @@ Enum that contains the supported binary operation types - [jerry_binary_operation](#jerry_binary_operation) +## jerry_property_descriptor_flags_t + +Enum that contains the flags of property descriptors. + + - JERRY_PROP_NO_OPTS - empty property descriptor + - JERRY_PROP_IS_GET_DEFINED - Is [[Get]] defined? + - JERRY_PROP_IS_SET_DEFINED - Is [[Set]] defined? + - JERRY_PROP_IS_CONFIGURABLE - [[Configurable]] + - JERRY_PROP_IS_ENUMERABLE - [[Enumerable]] + - JERRY_PROP_IS_WRITABLE - [[Writable]] + - JERRY_PROP_IS_THROW - Flag that controls failure handling + - JERRY_PROP_IS_VALUE_DEFINED - Is [[Value]] defined? + - JERRY_PROP_IS_CONFIGURABLE_DEFINED - Is [[Configurable]] defined? + - JERRY_PROP_IS_ENUMERABLE_DEFINED - Is [[Enumerable]] defined? + - JERRY_PROP_IS_WRITABLE_DEFINED - Is [[Writable]] defined? + +*New in version [[NEXT_RELEASE]]*. + +**See also** + +- [jerry_property_descriptor_t](#jerry_property_descriptor_t) + ## jerry_property_descriptor_t **Summary** @@ -502,32 +524,8 @@ the `value` field should contain the value for the property. ```c typedef struct { - /** Is [[Value]] defined? */ - bool is_value_defined; - - /** Is [[Get]] defined? */ - bool is_get_defined; - - /** Is [[Set]] defined? */ - bool is_set_defined; - - /** Is [[Writable]] defined? */ - bool is_writable_defined; - - /** [[Writable]] */ - bool is_writable; - - /** Is [[Enumerable]] defined? */ - bool is_enumerable_defined; - - /** [[Enumerable]] */ - bool is_enumerable; - - /** Is [[Configurable]] defined? */ - bool is_configurable_defined; - - /** [[Configurable]] */ - bool is_configurable; + /** any combination of jerry_property_descriptor_flags_t bits */ + uint16_t flags; /** [[Value]] */ jerry_value_t value; @@ -542,6 +540,7 @@ typedef struct **See also** +- [jerry_property_descriptor_flags_t](#jerry_property_descriptor_flags_t) - [jerry_define_own_property](#jerry_define_own_property) ## jerry_backtrace_location_t @@ -4461,17 +4460,16 @@ example (void) { jerry_value_t prop_name = jerry_create_string_from_utf8 ((jerry_char_t *) "value"); - jerry_property_descriptor_t prop_desc; - jerry_init_property_descriptor_fields (&prop_desc); + jerry_property_descriptor_t prop_desc = jerry_property_descriptor_create (); prop_desc.value = prop_name; - prop_desc.is_value_defined = true; + prop_desc.flags |= JERRY_PROP_IS_VALUE_DEFINED; jerry_value_t from_object = jerry_from_property_descriptor (&prop_desc); jerry_release_value (prop_name); jerry_release_value (from_object); - jerry_free_property_descriptor_fields (&prop_desc); + jerry_property_descriptor_free (&prop_desc); } ``` @@ -4524,7 +4522,7 @@ example (void) jerry_release_value (object); jerry_release_value (prop_name); jerry_release_value (value); - jerry_free_property_descriptor_fields (&prop_desc); + jerry_property_descriptor_free (&prop_desc); } ``` @@ -7308,32 +7306,31 @@ main (void) - [jerry_get_internal_property](#jerry_get_internal_property) -## jerry_init_property_descriptor_fields +## jerry_property_descriptor_create **Summary** -Initialize property descriptor. This means that all fields in the `jerry_property_descriptor_t` -struct will be set to zero or false depending on the field's type. +Create a property descriptor and initialize it with default values. This means that all fields in +the `jerry_property_descriptor_t` struct will be set to zero or false depending on the field's type. **Prototype** ```c -void -jerry_init_property_descriptor_fields (jerry_property_descriptor_t *prop_desc_p); +jerry_property_descriptor_t +jerry_property_descriptor_create (void); ``` -- `prop_desc_p` - pointer to property descriptor +*New in version [[NEXT_RELEASE]]*: Replaces `jerry_init_property_descriptor_fields`. **Example** ```c { - jerry_property_descriptor_t prop_desc; - jerry_init_property_descriptor_fields (&prop_desc); + jerry_property_descriptor_t prop_desc = jerry_property_descriptor_create (); ... // usage of prop_desc - jerry_free_property_descriptor_fields (&prop_desc); + jerry_property_descriptor_free (&prop_desc); } ``` @@ -7344,7 +7341,7 @@ For a more complete example see [jerry_define_own_property](#jerry_define_own_pr - [jerry_property_descriptor_t](#jerry_property_descriptor_t) - [jerry_define_own_property](#jerry_define_own_property) - [jerry_get_own_property_descriptor](#jerry_get_own_property_descriptor) -- [jerry_free_property_descriptor_fields](#jerry_free_property_descriptor_fields) +- [jerry_property_descriptor_free](#jerry_property_descriptor_free) ## jerry_define_own_property @@ -7389,19 +7386,23 @@ main (void) jerry_value_t global_obj_val = jerry_get_global_object (); // configure the property - jerry_property_descriptor_t prop_desc; - jerry_init_property_descriptor_fields (&prop_desc); - - jerry_value_t value_to_set; + jerry_property_descriptor_t prop_desc = jerry_property_descriptor_create (); // create or acquire value to set // For example: - value_to_set = jerry_create_number (33); + jerry_value_t value_to_set = jerry_create_number (33); // set the property descriptor fields: - // set the "is_value_defined" field to "true" to indicate the "value" + // set the "JERRY_PROP_IS_VALUE_DEFINED" flag to indicate the "value" // field should be used during the property registration. - prop_desc.is_value_defined = true; + // set the writable, configurable, enumerable flags to true + prop_desc.flags |= (JERRY_PROP_IS_WRITABLE_DEFINED + | JERRY_PROP_IS_WRITABLE + | JERRY_PROP_IS_CONFIGURABLE_DEFINED + | JERRY_PROP_IS_CONFIGURABLE + | JERRY_PROP_IS_ENUMERABLE_DEFINED + | JERRY_PROP_IS_ENUMERABLE + | JERRY_PROP_IS_VALUE_DEFINED); // set the "value" field to the number 33 prop_desc.value = value_to_set; @@ -7414,12 +7415,20 @@ main (void) // there was an error } + // re-define the property with the enumerable flag set to false + prop_desc.flags &= (uint16_t) ~JERRY_PROP_IS_ENUMERABLE; + return_value = jerry_define_own_property (global_obj_val, prop_name, &prop_desc); + if (jerry_value_is_error (return_value)) + { + // there was an error + } + // if there was no error at this point the global object should have a "my_prop" property jerry_release_value (return_value); jerry_release_value (prop_name); - jerry_free_property_descriptor_fields (&prop_desc); + jerry_property_descriptor_free (&prop_desc); jerry_release_value (global_obj_val); jerry_cleanup (); @@ -7474,14 +7483,12 @@ main (void) jerry_value_t global_obj_val = jerry_get_global_object (); // configure the property - jerry_property_descriptor_t prop_desc; - jerry_init_property_descriptor_fields (&prop_desc); + jerry_property_descriptor_t prop_desc = jerry_property_descriptor_create (); // set the property descriptor fields: - prop_desc.is_get_defined = true; + prop_desc.flags |= JERRY_PROP_IS_GET_DEFINED | JERRY_PROP_IS_SET_DEFINED; prop_desc.getter = jerry_create_external_function (method_getter); - prop_desc.is_set_defined = true; prop_desc.setter = jerry_create_external_function (method_setter); // add the property as "my_prop" for the global object @@ -7497,7 +7504,7 @@ main (void) jerry_release_value (return_value); jerry_release_value (prop_name); - jerry_free_property_descriptor_fields (&prop_desc); + jerry_property_descriptor_free (&prop_desc); jerry_release_value (global_obj_val); // run an example js code to use the getter/setters @@ -7518,9 +7525,9 @@ main (void) **See also** - [jerry_property_descriptor_t](#jerry_property_descriptor_t) -- [jerry_init_property_descriptor_fields](#jerry_init_property_descriptor_fields) +- [jerry_property_descriptor_create](#jerry_property_descriptor_create) - [jerry_get_own_property_descriptor](#jerry_get_own_property_descriptor) -- [jerry_free_property_descriptor_fields](#jerry_free_property_descriptor_fields) +- [jerry_property_descriptor_free](#jerry_property_descriptor_free) ## jerry_get_own_property_descriptor @@ -7549,8 +7556,7 @@ jerry_get_own_property_descriptor (const jerry_value_t obj_val, { jerry_value_t global_obj_val = jerry_get_global_object (); - jerry_property_descriptor_t prop_desc; - jerry_init_property_descriptor_fields (&prop_desc); + jerry_property_descriptor_t prop_desc = jerry_property_descriptor_create (); jerry_value_t prop_name = jerry_create_string ((const jerry_char_t *) "my_prop"); jerry_get_own_property_descriptor (global_obj_val, prop_name, &prop_desc); @@ -7558,7 +7564,7 @@ jerry_get_own_property_descriptor (const jerry_value_t obj_val, ... // usage of property descriptor - jerry_free_property_descriptor_fields (&prop_desc); + jerry_property_descriptor_free (&prop_desc); jerry_release_value (global_obj_val); } ``` @@ -7566,12 +7572,12 @@ jerry_get_own_property_descriptor (const jerry_value_t obj_val, **See also** - [jerry_property_descriptor_t](#jerry_property_descriptor_t) -- [jerry_init_property_descriptor_fields](#jerry_init_property_descriptor_fields) +- [jerry_property_descriptor_create](#jerry_property_descriptor_create) - [jerry_define_own_property](#jerry_define_own_property) -- [jerry_free_property_descriptor_fields](#jerry_free_property_descriptor_fields) +- [jerry_property_descriptor_free](#jerry_property_descriptor_free) -## jerry_free_property_descriptor_fields +## jerry_property_descriptor_free **Summary** @@ -7581,27 +7587,28 @@ Free fields of property descriptor (setter, getter and value). ```c void -jerry_free_property_descriptor_fields (const jerry_property_descriptor_t *prop_desc_p); +jerry_property_descriptor_free (const jerry_property_descriptor_t *prop_desc_p); ``` - `prop_desc_p` - pointer to property descriptor +*New in version [[NEXT_RELEASE]]*: Replaces `jerry_free_property_descriptor_fields`. + **Example** ```c { - jerry_property_descriptor_t prop_desc; - jerry_init_property_descriptor_fields (&prop_desc); + jerry_property_descriptor_t prop_desc = jerry_property_descriptor_create (); ... // usage of property descriptor - jerry_free_property_descriptor_fields (&prop_desc); + jerry_property_descriptor_free (&prop_desc); } ``` **See also** -- [jerry_init_property_descriptor_fields](#jerry_init_property_descriptor_fields) +- [jerry_property_descriptor_create](#jerry_property_descriptor_create) - [jerry_define_own_property](#jerry_define_own_property) - [jerry_get_own_property_descriptor](#jerry_get_own_property_descriptor) diff --git a/jerry-core/api/jerry.c b/jerry-core/api/jerry.c index eea7a97f7..ac8132fa2 100644 --- a/jerry-core/api/jerry.c +++ b/jerry-core/api/jerry.c @@ -69,6 +69,19 @@ JERRY_STATIC_ASSERT ((int) ECMA_INIT_EMPTY == (int) JERRY_INIT_EMPTY && (int) ECMA_INIT_MEM_STATS == (int) JERRY_INIT_MEM_STATS, ecma_init_flag_t_must_be_equal_to_jerry_init_flag_t); +JERRY_STATIC_ASSERT ((int) JERRY_PROP_NO_OPTS == (int) ECMA_PROP_NO_OPTS + && (int) JERRY_PROP_IS_GET_DEFINED == (int) ECMA_PROP_IS_GET_DEFINED + && (int) JERRY_PROP_IS_SET_DEFINED == (int) ECMA_PROP_IS_SET_DEFINED + && (int) JERRY_PROP_IS_CONFIGURABLE == (int) ECMA_PROP_IS_CONFIGURABLE + && (int) JERRY_PROP_IS_ENUMERABLE == (int) ECMA_PROP_IS_ENUMERABLE + && (int) JERRY_PROP_IS_WRITABLE == (int) ECMA_PROP_IS_WRITABLE + && (int) JERRY_PROP_IS_THROW == (int) ECMA_PROP_IS_THROW + && (int) JERRY_PROP_IS_VALUE_DEFINED == (int) ECMA_PROP_IS_VALUE_DEFINED + && (int) JERRY_PROP_IS_CONFIGURABLE_DEFINED == (int) ECMA_PROP_IS_CONFIGURABLE_DEFINED + && (int) JERRY_PROP_IS_ENUMERABLE_DEFINED == (int) ECMA_PROP_IS_ENUMERABLE_DEFINED + && (int) JERRY_PROP_IS_WRITABLE_DEFINED == (int) ECMA_PROP_IS_WRITABLE_DEFINED, + jerry_prop_desc_flags_must_be_equal_to_ecma_prop_desc_flags); + #if JERRY_BUILTIN_REGEXP JERRY_STATIC_ASSERT ((int) RE_FLAG_GLOBAL == (int) JERRY_REGEXP_FLAG_GLOBAL && (int) RE_FLAG_MULTILINE == (int) JERRY_REGEXP_FLAG_MULTILINE @@ -3280,24 +3293,23 @@ jerry_set_internal_property (const jerry_value_t obj_val, /**< object value */ } /* jerry_set_internal_property */ /** - * Initialize property descriptor. + * Construct empty property descriptor, i.e.: + * property descriptor with all is_defined flags set to false and the rest - to default value. + * + * @return empty property descriptor */ -void -jerry_init_property_descriptor_fields (jerry_property_descriptor_t *prop_desc_p) /**< [out] property descriptor */ +jerry_property_descriptor_t +jerry_property_descriptor_create (void) { - prop_desc_p->is_value_defined = false; - prop_desc_p->value = ECMA_VALUE_UNDEFINED; - prop_desc_p->is_writable_defined = false; - prop_desc_p->is_writable = false; - prop_desc_p->is_enumerable_defined = false; - prop_desc_p->is_enumerable = false; - prop_desc_p->is_configurable_defined = false; - prop_desc_p->is_configurable = false; - prop_desc_p->is_get_defined = false; - prop_desc_p->getter = ECMA_VALUE_UNDEFINED; - prop_desc_p->is_set_defined = false; - prop_desc_p->setter = ECMA_VALUE_UNDEFINED; -} /* jerry_init_property_descriptor_fields */ + jerry_property_descriptor_t prop_desc; + + prop_desc.flags = JERRY_PROP_NO_OPTS; + prop_desc.value = ECMA_VALUE_UNDEFINED; + prop_desc.getter = ECMA_VALUE_UNDEFINED; + prop_desc.setter = ECMA_VALUE_UNDEFINED; + + return prop_desc; +} /* jerry_property_descriptor_create */ /** * Convert a ecma_property_descriptor_t to a jerry_property_descriptor_t @@ -3309,38 +3321,18 @@ jerry_init_property_descriptor_fields (jerry_property_descriptor_t *prop_desc_p) static jerry_property_descriptor_t jerry_property_descriptor_from_ecma (const ecma_property_descriptor_t *prop_desc_p) /**<[out] property_descriptor */ { - jerry_property_descriptor_t prop_desc; - jerry_init_property_descriptor_fields (&prop_desc); + jerry_property_descriptor_t prop_desc = jerry_property_descriptor_create (); - if (prop_desc_p->flags & ECMA_PROP_IS_ENUMERABLE_DEFINED) - { - prop_desc.is_enumerable_defined = true; - prop_desc.is_enumerable = prop_desc_p->flags & ECMA_PROP_IS_ENUMERABLE; - } + prop_desc.flags = prop_desc_p->flags; - if (prop_desc_p->flags & ECMA_PROP_IS_CONFIGURABLE_DEFINED) - { - prop_desc.is_configurable_defined = true; - prop_desc.is_configurable = prop_desc_p->flags & ECMA_PROP_IS_CONFIGURABLE; - } - - prop_desc.is_value_defined = prop_desc_p->flags & ECMA_PROP_IS_VALUE_DEFINED; - - if (prop_desc.is_value_defined) + if (prop_desc.flags & (JERRY_PROP_IS_VALUE_DEFINED)) { prop_desc.value = prop_desc_p->value; } - if (prop_desc_p->flags & ECMA_PROP_IS_WRITABLE_DEFINED) - { - prop_desc.is_writable_defined = true; - prop_desc.is_writable = prop_desc_p->flags & ECMA_PROP_IS_WRITABLE; - } - if (prop_desc_p->flags & ECMA_PROP_IS_GET_DEFINED) { prop_desc.getter = ECMA_VALUE_NULL; - prop_desc.is_get_defined = true; if (prop_desc_p->get_p != NULL) { @@ -3352,7 +3344,6 @@ jerry_property_descriptor_from_ecma (const ecma_property_descriptor_t *prop_desc if (prop_desc_p->flags & ECMA_PROP_IS_SET_DEFINED) { prop_desc.setter = ECMA_VALUE_NULL; - prop_desc.is_set_defined = true; if (prop_desc_p->set_p != NULL) { @@ -3376,24 +3367,10 @@ jerry_property_descriptor_to_ecma (const jerry_property_descriptor_t *prop_desc_ { ecma_property_descriptor_t prop_desc = ecma_make_empty_property_descriptor (); - uint32_t flags = ECMA_PROP_NO_OPTS; - - if (prop_desc_p->is_enumerable_defined) - { - flags |= (uint32_t) (ECMA_PROP_IS_ENUMERABLE_DEFINED | (prop_desc_p->is_enumerable ? ECMA_PROP_IS_ENUMERABLE - : ECMA_PROP_NO_OPTS)); - } - - if (prop_desc_p->is_configurable_defined) - { - flags |= (uint32_t) (ECMA_PROP_IS_CONFIGURABLE_DEFINED | (prop_desc_p->is_configurable ? ECMA_PROP_IS_CONFIGURABLE - : ECMA_PROP_NO_OPTS)); - } + prop_desc.flags = prop_desc_p->flags; /* Copy data property info. */ - flags |= (prop_desc_p->is_value_defined ? ECMA_PROP_IS_VALUE_DEFINED : ECMA_PROP_NO_OPTS); - - if (prop_desc_p->is_value_defined) + if (prop_desc_p->flags & (JERRY_PROP_IS_VALUE_DEFINED)) { if (ecma_is_value_error_reference (prop_desc_p->value)) { @@ -3404,17 +3381,10 @@ jerry_property_descriptor_to_ecma (const jerry_property_descriptor_t *prop_desc_ prop_desc.value = prop_desc_p->value; } - if (prop_desc_p->is_writable_defined) - { - flags |= (uint32_t) (ECMA_PROP_IS_WRITABLE_DEFINED | (prop_desc_p->is_writable ? ECMA_PROP_IS_WRITABLE - : ECMA_PROP_NO_OPTS)); - } - /* Copy accessor property info. */ - if (prop_desc_p->is_get_defined) + if (prop_desc_p->flags & (JERRY_PROP_IS_GET_DEFINED)) { ecma_value_t getter = prop_desc_p->getter; - flags |= ECMA_PROP_IS_GET_DEFINED; if (ecma_is_value_error_reference (getter)) { @@ -3433,10 +3403,9 @@ jerry_property_descriptor_to_ecma (const jerry_property_descriptor_t *prop_desc_ } } - if (prop_desc_p->is_set_defined) + if (prop_desc_p->flags & (JERRY_PROP_IS_SET_DEFINED)) { ecma_value_t setter = prop_desc_p->setter; - flags |= ECMA_PROP_IS_SET_DEFINED; if (ecma_is_value_error_reference (setter)) { @@ -3455,11 +3424,23 @@ jerry_property_descriptor_to_ecma (const jerry_property_descriptor_t *prop_desc_ } } - prop_desc.flags |= (uint16_t) (flags | ECMA_PROP_IS_THROW); + prop_desc.flags |= (uint16_t) (prop_desc_p->flags | ECMA_PROP_IS_THROW); return prop_desc; } /* jerry_property_descriptor_to_ecma */ +/** Helper function to return false value or error depending on the given flag. + * + * @return value marked with error flag - if is_throw is true + * false value - otherwise + */ +static jerry_value_t +jerry_error_or_false (const jerry_value_t err_val, /**< error value */ + bool is_throw) /**< throw flag */ +{ + return is_throw ? jerry_throw (err_val) : jerry_create_boolean (false); +} /* jerry_error_or_false */ + /** * Define a property to the specified object with the given name. * @@ -3467,6 +3448,7 @@ jerry_property_descriptor_to_ecma (const jerry_property_descriptor_t *prop_desc_ * returned value must be freed with jerry_release_value, when it is no longer needed. * * @return true value - if the operation was successful + * false value - if the property cannot be defined and JERRY_PROP_IS_THROW is not set * value marked with error flag - otherwise */ jerry_value_t @@ -3479,20 +3461,23 @@ jerry_define_own_property (const jerry_value_t obj_val, /**< object value */ if (!ecma_is_value_object (obj_val) || !ecma_is_value_prop_name (prop_name_val)) { - return jerry_throw (ecma_raise_type_error (ECMA_ERR_MSG (wrong_args_msg_p))); + return jerry_error_or_false (ecma_raise_type_error (ECMA_ERR_MSG (wrong_args_msg_p)), + prop_desc_p->flags & JERRY_PROP_IS_THROW); } - if ((prop_desc_p->is_writable_defined || prop_desc_p->is_value_defined) - && (prop_desc_p->is_get_defined || prop_desc_p->is_set_defined)) + if (prop_desc_p->flags & (JERRY_PROP_IS_WRITABLE_DEFINED | JERRY_PROP_IS_VALUE_DEFINED) + && prop_desc_p->flags & (JERRY_PROP_IS_GET_DEFINED | JERRY_PROP_IS_SET_DEFINED)) { - return jerry_throw (ecma_raise_type_error (ECMA_ERR_MSG (wrong_args_msg_p))); + return jerry_error_or_false (ecma_raise_type_error (ECMA_ERR_MSG (wrong_args_msg_p)), + prop_desc_p->flags & JERRY_PROP_IS_THROW); } ecma_property_descriptor_t prop_desc = jerry_property_descriptor_to_ecma (prop_desc_p); if (ECMA_IS_VALUE_ERROR (prop_desc.value)) { - return jerry_throw (prop_desc.value); + return jerry_error_or_false (prop_desc.value, prop_desc_p->flags & JERRY_PROP_IS_THROW); + } return jerry_return (ecma_op_object_define_own_property (ecma_get_object_from_value (obj_val), ecma_get_prop_name_from_value (prop_name_val), @@ -3537,28 +3522,30 @@ jerry_get_own_property_descriptor (const jerry_value_t obj_val, /**< object val return false; } - prop_desc_p->is_configurable_defined = true; - prop_desc_p->is_configurable = (prop_desc.flags & ECMA_PROP_IS_CONFIGURABLE) != 0; - prop_desc_p->is_enumerable_defined = true; - prop_desc_p->is_enumerable = (prop_desc.flags & ECMA_PROP_IS_ENUMERABLE) != 0; - - prop_desc_p->is_writable_defined = (prop_desc.flags & ECMA_PROP_IS_WRITABLE_DEFINED) != 0; - prop_desc_p->is_writable = prop_desc_p->is_writable_defined ? (prop_desc.flags & ECMA_PROP_IS_WRITABLE) != 0 : false; - - prop_desc_p->is_value_defined = (prop_desc.flags & ECMA_PROP_IS_VALUE_DEFINED) != 0; - prop_desc_p->is_get_defined = (prop_desc.flags & ECMA_PROP_IS_GET_DEFINED) != 0; - prop_desc_p->is_set_defined = (prop_desc.flags & ECMA_PROP_IS_SET_DEFINED) != 0; + prop_desc_p->flags = prop_desc.flags; + if (!(prop_desc_p->flags & JERRY_PROP_IS_WRITABLE_DEFINED)) + { + prop_desc_p->flags &= (uint16_t) ~JERRY_PROP_IS_WRITABLE; + } + if (!(prop_desc_p->flags & JERRY_PROP_IS_CONFIGURABLE_DEFINED)) + { + prop_desc_p->flags &= (uint16_t) ~JERRY_PROP_IS_CONFIGURABLE; + } + if (!(prop_desc_p->flags & JERRY_PROP_IS_ENUMERABLE_DEFINED)) + { + prop_desc_p->flags &= (uint16_t) ~JERRY_PROP_IS_ENUMERABLE; + } prop_desc_p->value = ECMA_VALUE_UNDEFINED; prop_desc_p->getter = ECMA_VALUE_UNDEFINED; prop_desc_p->setter = ECMA_VALUE_UNDEFINED; - if (prop_desc_p->is_value_defined) + if (prop_desc_p->flags & JERRY_PROP_IS_VALUE_DEFINED) { prop_desc_p->value = prop_desc.value; } - if (prop_desc_p->is_get_defined) + if (prop_desc_p->flags & JERRY_PROP_IS_GET_DEFINED) { if (prop_desc.get_p != NULL) { @@ -3570,7 +3557,7 @@ jerry_get_own_property_descriptor (const jerry_value_t obj_val, /**< object val } } - if (prop_desc_p->is_set_defined) + if (prop_desc_p->flags & JERRY_PROP_IS_SET_DEFINED) { if (prop_desc.set_p != NULL) { @@ -3589,23 +3576,23 @@ jerry_get_own_property_descriptor (const jerry_value_t obj_val, /**< object val * Free fields of property descriptor (setter, getter and value). */ void -jerry_free_property_descriptor_fields (const jerry_property_descriptor_t *prop_desc_p) /**< property descriptor */ +jerry_property_descriptor_free (const jerry_property_descriptor_t *prop_desc_p) /**< property descriptor */ { - if (prop_desc_p->is_value_defined) + if (prop_desc_p->flags & JERRY_PROP_IS_VALUE_DEFINED) { jerry_release_value (prop_desc_p->value); } - if (prop_desc_p->is_get_defined) + if (prop_desc_p->flags & JERRY_PROP_IS_GET_DEFINED) { jerry_release_value (prop_desc_p->getter); } - if (prop_desc_p->is_set_defined) + if (prop_desc_p->flags & JERRY_PROP_IS_SET_DEFINED) { jerry_release_value (prop_desc_p->setter); } -} /* jerry_free_property_descriptor_fields */ +} /* jerry_property_descriptor_free */ /** * Invoke function specified by a function value diff --git a/jerry-core/include/jerryscript-core.h b/jerry-core/include/jerryscript-core.h index 7609eb957..74a525adf 100644 --- a/jerry-core/include/jerryscript-core.h +++ b/jerry-core/include/jerryscript-core.h @@ -167,37 +167,33 @@ typedef uint32_t jerry_length_t; */ typedef uint32_t jerry_value_t; +/** + * Flags of ECMA property descriptor. + */ +typedef enum +{ + JERRY_PROP_NO_OPTS = (0), /** empty property descriptor */ + JERRY_PROP_IS_GET_DEFINED = (1 << 0), /** Is [[Get]] defined? */ + JERRY_PROP_IS_SET_DEFINED = (1 << 1), /** Is [[Set]] defined? */ + + JERRY_PROP_IS_CONFIGURABLE = (1 << 2), /** [[Configurable]] */ + JERRY_PROP_IS_ENUMERABLE = (1 << 3), /** [[Enumerable]] */ + JERRY_PROP_IS_WRITABLE = (1 << 4), /** [[Writable]] */ + JERRY_PROP_IS_THROW = (1 << 5), /** Flag that controls failure handling */ + + JERRY_PROP_IS_VALUE_DEFINED = (1 << 6), /** Is [[Value]] defined? */ + JERRY_PROP_IS_CONFIGURABLE_DEFINED = (1 << 7), /** Is [[Configurable]] defined? */ + JERRY_PROP_IS_ENUMERABLE_DEFINED = (1 << 8), /** Is [[Enumerable]] defined? */ + JERRY_PROP_IS_WRITABLE_DEFINED = (1 << 9), /** Is [[Writable]] defined? */ +} jerry_property_descriptor_flags_t; + /** * Description of ECMA property descriptor. */ typedef struct { - /** Is [[Value]] defined? */ - bool is_value_defined; - - /** Is [[Get]] defined? */ - bool is_get_defined; - - /** Is [[Set]] defined? */ - bool is_set_defined; - - /** Is [[Writable]] defined? */ - bool is_writable_defined; - - /** [[Writable]] */ - bool is_writable; - - /** Is [[Enumerable]] defined? */ - bool is_enumerable_defined; - - /** [[Enumerable]] */ - bool is_enumerable; - - /** Is [[Configurable]] defined? */ - bool is_configurable_defined; - - /** [[Configurable]] */ - bool is_configurable; + /** any combination of jerry_property_descriptor_flags_t bits */ + uint16_t flags; /** [[Value]] */ jerry_value_t value; @@ -697,7 +693,7 @@ jerry_value_t jerry_set_property_by_index (const jerry_value_t obj_val, uint32_t bool jerry_set_internal_property (const jerry_value_t obj_val, const jerry_value_t prop_name_val, const jerry_value_t value_to_set); -void jerry_init_property_descriptor_fields (jerry_property_descriptor_t *prop_desc_p); +jerry_property_descriptor_t jerry_property_descriptor_create (void); jerry_value_t jerry_define_own_property (const jerry_value_t obj_val, const jerry_value_t prop_name_val, const jerry_property_descriptor_t *prop_desc_p); @@ -705,7 +701,7 @@ jerry_value_t jerry_define_own_property (const jerry_value_t obj_val, bool jerry_get_own_property_descriptor (const jerry_value_t obj_val, const jerry_value_t prop_name_val, jerry_property_descriptor_t *prop_desc_p); -void jerry_free_property_descriptor_fields (const jerry_property_descriptor_t *prop_desc_p); +void jerry_property_descriptor_free (const jerry_property_descriptor_t *prop_desc_p); jerry_value_t jerry_call_function (const jerry_value_t func_obj_val, const jerry_value_t this_val, const jerry_value_t args_p[], jerry_size_t args_count); diff --git a/tests/unit-core/test-api-object-property-names.c b/tests/unit-core/test-api-object-property-names.c index 5dbf5bca7..ea124cb5c 100644 --- a/tests/unit-core/test-api-object-property-names.c +++ b/tests/unit-core/test-api-object-property-names.c @@ -104,16 +104,14 @@ main (void) jerry_value_t names; - jerry_property_descriptor_t prop_desc; - jerry_init_property_descriptor_fields (&prop_desc); - prop_desc.is_configurable_defined = true; - prop_desc.is_configurable = true; - prop_desc.is_writable_defined = true; - prop_desc.is_writable = true; - prop_desc.is_enumerable_defined = true; + jerry_property_descriptor_t prop_desc = jerry_property_descriptor_create (); + prop_desc.flags |= (JERRY_PROP_IS_CONFIGURABLE_DEFINED + | JERRY_PROP_IS_CONFIGURABLE + | JERRY_PROP_IS_WRITABLE_DEFINED + | JERRY_PROP_IS_WRITABLE + | JERRY_PROP_IS_ENUMERABLE_DEFINED); // Test enumerable - non-enumerable filter - prop_desc.is_enumerable = false; define_property (test_object, prop_names[2], &prop_desc, false); names = jerry_object_get_property_names (test_object, JERRY_PROPERTY_FILTER_ALL | JERRY_PROPERTY_FILTER_EXLCUDE_NON_ENUMERABLE); @@ -123,10 +121,10 @@ main (void) TEST_ASSERT (jerry_get_array_length (names) == (uint32_t) 3); compare_prop_name (names, prop_names[2], 2); jerry_release_value (names); - prop_desc.is_enumerable = true; + prop_desc.flags |= JERRY_PROP_IS_ENUMERABLE; // Test configurable - non-configurable filter - prop_desc.is_configurable = false; + prop_desc.flags &= (uint16_t) ~JERRY_PROP_IS_CONFIGURABLE; define_property (test_object, prop_names[3], &prop_desc, false); names = jerry_object_get_property_names (test_object, JERRY_PROPERTY_FILTER_ALL | JERRY_PROPERTY_FILTER_EXLCUDE_NON_CONFIGURABLE); @@ -136,10 +134,10 @@ main (void) TEST_ASSERT (jerry_get_array_length (names) == (uint32_t) 4); compare_prop_name (names, prop_names[3], 3); jerry_release_value (names); - prop_desc.is_configurable = true; + prop_desc.flags |= JERRY_PROP_IS_CONFIGURABLE; // Test writable - non-writable filter - prop_desc.is_writable = false; + prop_desc.flags &= (uint16_t) ~JERRY_PROP_IS_WRITABLE; define_property (test_object, prop_names[4], &prop_desc, false); names = jerry_object_get_property_names (test_object, JERRY_PROPERTY_FILTER_ALL | JERRY_PROPERTY_FILTER_EXLCUDE_NON_WRITABLE); @@ -149,7 +147,7 @@ main (void) TEST_ASSERT (jerry_get_array_length (names) == (uint32_t) 5); compare_prop_name (names, prop_names[4], 4); jerry_release_value (names); - prop_desc.is_writable = true; + prop_desc.flags |= JERRY_PROP_IS_WRITABLE; // Test all property filter names = jerry_object_get_property_names (test_object, JERRY_PROPERTY_FILTER_ALL); @@ -195,7 +193,7 @@ main (void) TEST_ASSERT (jerry_get_array_length (names) == (uint32_t) 7); jerry_release_value (names); - jerry_free_property_descriptor_fields (&prop_desc); + jerry_property_descriptor_free (&prop_desc); jerry_release_value (test_object); jerry_cleanup (); return 0; diff --git a/tests/unit-core/test-api-property.c b/tests/unit-core/test-api-property.c index b24a6c5c0..38c36276c 100644 --- a/tests/unit-core/test-api-property.c +++ b/tests/unit-core/test-api-property.c @@ -25,46 +25,48 @@ main (void) jerry_init (JERRY_INIT_EMPTY); /* Test: init property descriptor */ - jerry_property_descriptor_t prop_desc; - jerry_init_property_descriptor_fields (&prop_desc); - TEST_ASSERT (prop_desc.is_value_defined == false); + jerry_property_descriptor_t prop_desc = jerry_property_descriptor_create (); + TEST_ASSERT (prop_desc.flags == JERRY_PROP_NO_OPTS); TEST_ASSERT (jerry_value_is_undefined (prop_desc.value)); - TEST_ASSERT (prop_desc.is_writable_defined == false); - TEST_ASSERT (prop_desc.is_writable == false); - TEST_ASSERT (prop_desc.is_enumerable_defined == false); - TEST_ASSERT (prop_desc.is_enumerable == false); - TEST_ASSERT (prop_desc.is_configurable_defined == false); - TEST_ASSERT (prop_desc.is_configurable == false); - TEST_ASSERT (prop_desc.is_get_defined == false); TEST_ASSERT (jerry_value_is_undefined (prop_desc.getter)); - TEST_ASSERT (prop_desc.is_set_defined == false); TEST_ASSERT (jerry_value_is_undefined (prop_desc.setter)); /* Test: define own properties */ jerry_value_t global_obj_val = jerry_get_global_object (); jerry_value_t prop_name = jerry_create_string ((const jerry_char_t *) "my_defined_property"); - prop_desc.is_value_defined = true; + prop_desc.flags |= JERRY_PROP_IS_VALUE_DEFINED; prop_desc.value = jerry_acquire_value (prop_name); jerry_value_t res = jerry_define_own_property (global_obj_val, prop_name, &prop_desc); TEST_ASSERT (!jerry_value_is_error (res)); TEST_ASSERT (jerry_value_is_boolean (res)); TEST_ASSERT (jerry_get_boolean_value (res)); jerry_release_value (res); - jerry_free_property_descriptor_fields (&prop_desc); + jerry_property_descriptor_free (&prop_desc); + + /* Test: define own property with error */ + prop_desc = jerry_property_descriptor_create (); + prop_desc.flags |= JERRY_PROP_IS_VALUE_DEFINED | JERRY_PROP_IS_THROW; + prop_desc.value = jerry_create_number (3.14); + res = jerry_define_own_property (global_obj_val, prop_name, &prop_desc); + TEST_ASSERT (jerry_value_is_error (res)); + TEST_ASSERT (!jerry_value_is_boolean (res)); + jerry_release_value (res); + jerry_property_descriptor_free (&prop_desc); /* Test: get own property descriptor */ + prop_desc = jerry_property_descriptor_create (); bool is_ok = jerry_get_own_property_descriptor (global_obj_val, prop_name, &prop_desc); TEST_ASSERT (is_ok); - TEST_ASSERT (prop_desc.is_value_defined == true); + TEST_ASSERT (prop_desc.flags & JERRY_PROP_IS_VALUE_DEFINED); TEST_ASSERT (jerry_value_is_string (prop_desc.value)); - TEST_ASSERT (prop_desc.is_writable == false); - TEST_ASSERT (prop_desc.is_enumerable == false); - TEST_ASSERT (prop_desc.is_configurable == false); - TEST_ASSERT (prop_desc.is_get_defined == false); + TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_WRITABLE)); + TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_ENUMERABLE)); + TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_CONFIGURABLE)); + TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_GET_DEFINED)); TEST_ASSERT (jerry_value_is_undefined (prop_desc.getter)); - TEST_ASSERT (prop_desc.is_set_defined == false); + TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_SET_DEFINED)); TEST_ASSERT (jerry_value_is_undefined (prop_desc.setter)); - jerry_free_property_descriptor_fields (&prop_desc); + jerry_property_descriptor_free (&prop_desc); if (jerry_is_feature_enabled (JERRY_FEATURE_PROXY)) { @@ -83,26 +85,26 @@ main (void) jerry_release_value (prop_name); /* Test: define and get own property descriptor */ - prop_desc.is_enumerable = true; + prop_desc.flags |= JERRY_PROP_IS_ENUMERABLE; prop_name = jerry_create_string ((const jerry_char_t *) "enumerable-property"); res = jerry_define_own_property (global_obj_val, prop_name, &prop_desc); TEST_ASSERT (!jerry_value_is_error (res)); TEST_ASSERT (jerry_value_is_boolean (res)); TEST_ASSERT (jerry_get_boolean_value (res)); jerry_release_value (res); - jerry_free_property_descriptor_fields (&prop_desc); + jerry_property_descriptor_free (&prop_desc); is_ok = jerry_get_own_property_descriptor (global_obj_val, prop_name, &prop_desc); TEST_ASSERT (is_ok); - TEST_ASSERT (prop_desc.is_writable == false); - TEST_ASSERT (prop_desc.is_enumerable == true); - TEST_ASSERT (prop_desc.is_configurable == false); + TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_WRITABLE)); + TEST_ASSERT (prop_desc.flags & JERRY_PROP_IS_ENUMERABLE); + TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_CONFIGURABLE)); jerry_release_value (prop_name); jerry_release_value (global_obj_val); /* Test: define own property descriptor error */ - jerry_init_property_descriptor_fields (&prop_desc); - prop_desc.is_value_defined = true; + prop_desc = jerry_property_descriptor_create (); + prop_desc.flags |= JERRY_PROP_IS_VALUE_DEFINED; prop_desc.value = jerry_create_number (11); jerry_value_t obj_val = jerry_create_object (); diff --git a/tests/unit-core/test-api.c b/tests/unit-core/test-api.c index 79c2c4dd9..00410e51b 100644 --- a/tests/unit-core/test-api.c +++ b/tests/unit-core/test-api.c @@ -924,16 +924,15 @@ main (void) jerry_value_t global_obj = jerry_get_global_object (); jerry_value_t prop_name = jerry_create_string ((const jerry_char_t *) "foo"); - jerry_property_descriptor_t prop_desc; - jerry_init_property_descriptor_fields (&prop_desc); - prop_desc.is_value_defined = true; + jerry_property_descriptor_t prop_desc = jerry_property_descriptor_create (); + prop_desc.flags |= JERRY_PROP_IS_VALUE_DEFINED; prop_desc.value = jerry_create_number (5.2); jerry_value_t define_result = jerry_define_own_property (global_obj, prop_name, &prop_desc); TEST_ASSERT (jerry_value_is_boolean (define_result) && jerry_get_boolean_value (define_result)); jerry_release_value (define_result); - jerry_free_property_descriptor_fields (&prop_desc); + jerry_property_descriptor_free (&prop_desc); jerry_release_value (prop_name); jerry_release_value (global_obj); diff --git a/tests/unit-core/test-from-property-descriptor.c b/tests/unit-core/test-from-property-descriptor.c index 27b8af78b..e049febec 100644 --- a/tests/unit-core/test-from-property-descriptor.c +++ b/tests/unit-core/test-from-property-descriptor.c @@ -43,25 +43,21 @@ main (void) prop_name = jerry_create_string_from_utf8 ((jerry_char_t *) "writable"); value = jerry_get_property (from_object, prop_name); - TEST_ASSERT (jerry_get_boolean_value (value) == prop_desc.is_writable); - - prop_name = jerry_create_string_from_utf8 ((jerry_char_t *) "writable"); - value = jerry_get_property (from_object, prop_name); - TEST_ASSERT (jerry_get_boolean_value (value) == prop_desc.is_writable); + TEST_ASSERT (jerry_get_boolean_value (value) == ((prop_desc.flags & JERRY_PROP_IS_WRITABLE) != 0)); prop_name = jerry_create_string_from_utf8 ((jerry_char_t *) "enumerable"); value = jerry_get_property (from_object, prop_name); - TEST_ASSERT (jerry_get_boolean_value (value) == prop_desc.is_enumerable); + TEST_ASSERT (jerry_get_boolean_value (value) == ((prop_desc.flags & JERRY_PROP_IS_ENUMERABLE) != 0)); prop_name = jerry_create_string_from_utf8 ((jerry_char_t *) "configurable"); value = jerry_get_property (from_object, prop_name); - TEST_ASSERT (jerry_get_boolean_value (value) == prop_desc.is_configurable); + TEST_ASSERT (jerry_get_boolean_value (value) == ((prop_desc.flags & JERRY_PROP_IS_CONFIGURABLE) != 0)); jerry_release_value (object); jerry_release_value (prop_name); jerry_release_value (value); jerry_release_value (from_object); - jerry_free_property_descriptor_fields (&prop_desc); + jerry_property_descriptor_free (&prop_desc); jerry_cleanup (); return 0; } /* main */ diff --git a/tests/unit-core/test-symbol.c b/tests/unit-core/test-symbol.c index c88593f30..4596f7d3f 100644 --- a/tests/unit-core/test-symbol.c +++ b/tests/unit-core/test-symbol.c @@ -91,49 +91,46 @@ main (void) /* Test {get, define}_own_property_descriptor */ jerry_property_descriptor_t prop_desc; TEST_ASSERT (jerry_get_own_property_descriptor (object, symbol_2, &prop_desc)); - TEST_ASSERT (prop_desc.is_value_defined == true); + TEST_ASSERT (prop_desc.flags & JERRY_PROP_IS_VALUE_DEFINED); TEST_ASSERT (value_2 == prop_desc.value); TEST_ASSERT (jerry_get_number_value (value_2) == jerry_get_number_value (prop_desc.value)); - TEST_ASSERT (prop_desc.is_writable == true); - TEST_ASSERT (prop_desc.is_enumerable == true); - TEST_ASSERT (prop_desc.is_configurable == true); - TEST_ASSERT (prop_desc.is_get_defined == false); + TEST_ASSERT (prop_desc.flags & JERRY_PROP_IS_WRITABLE); + TEST_ASSERT (prop_desc.flags & JERRY_PROP_IS_ENUMERABLE); + TEST_ASSERT (prop_desc.flags & JERRY_PROP_IS_CONFIGURABLE); + TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_GET_DEFINED)); TEST_ASSERT (jerry_value_is_undefined (prop_desc.getter)); - TEST_ASSERT (prop_desc.is_set_defined == false); + TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_SET_DEFINED)); TEST_ASSERT (jerry_value_is_undefined (prop_desc.setter)); - jerry_free_property_descriptor_fields (&prop_desc); + jerry_property_descriptor_free (&prop_desc); /* Modify the descriptor fields */ - jerry_init_property_descriptor_fields (&prop_desc); + prop_desc = jerry_property_descriptor_create (); jerry_value_t value_3 = jerry_create_string (STRING_BAR); - prop_desc.is_value_defined = true; + prop_desc.flags |= JERRY_PROP_IS_VALUE_DEFINED + | JERRY_PROP_IS_WRITABLE_DEFINED + | JERRY_PROP_IS_ENUMERABLE_DEFINED + | JERRY_PROP_IS_CONFIGURABLE_DEFINED; prop_desc.value = jerry_acquire_value (value_3); - prop_desc.is_writable_defined = true; - prop_desc.is_writable = false; - prop_desc.is_enumerable_defined = true; - prop_desc.is_enumerable = false; - prop_desc.is_configurable_defined = true; - prop_desc.is_configurable = false; TEST_ASSERT (jerry_get_boolean_value (jerry_define_own_property (object, symbol_2, &prop_desc))); - jerry_free_property_descriptor_fields (&prop_desc); + jerry_property_descriptor_free (&prop_desc); /* Check the modified fields */ TEST_ASSERT (jerry_get_own_property_descriptor (object, symbol_2, &prop_desc)); - TEST_ASSERT (prop_desc.is_value_defined == true); + TEST_ASSERT (prop_desc.flags & JERRY_PROP_IS_VALUE_DEFINED); TEST_ASSERT (value_3 == prop_desc.value); TEST_ASSERT (jerry_value_is_string (prop_desc.value)); - TEST_ASSERT (prop_desc.is_writable_defined == true); - TEST_ASSERT (prop_desc.is_writable == false); - TEST_ASSERT (prop_desc.is_enumerable_defined == true); - TEST_ASSERT (prop_desc.is_enumerable == false); - TEST_ASSERT (prop_desc.is_configurable_defined == true); - TEST_ASSERT (prop_desc.is_configurable == false); - TEST_ASSERT (prop_desc.is_get_defined == false); + TEST_ASSERT (prop_desc.flags & JERRY_PROP_IS_WRITABLE_DEFINED); + TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_WRITABLE)); + TEST_ASSERT (prop_desc.flags & JERRY_PROP_IS_ENUMERABLE_DEFINED); + TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_ENUMERABLE)); + TEST_ASSERT (prop_desc.flags & JERRY_PROP_IS_CONFIGURABLE_DEFINED); + TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_CONFIGURABLE)); + TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_GET_DEFINED)); TEST_ASSERT (jerry_value_is_undefined (prop_desc.getter)); - TEST_ASSERT (prop_desc.is_set_defined == false); + TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_SET_DEFINED)); TEST_ASSERT (jerry_value_is_undefined (prop_desc.setter)); - jerry_free_property_descriptor_fields (&prop_desc); + jerry_property_descriptor_free (&prop_desc); jerry_release_value (value_3); jerry_release_value (value_2); diff --git a/tests/unit-core/test-to-property-descriptor.c b/tests/unit-core/test-to-property-descriptor.c index 396d8d5fd..b3b3ee6a7 100644 --- a/tests/unit-core/test-to-property-descriptor.c +++ b/tests/unit-core/test-to-property-descriptor.c @@ -48,15 +48,16 @@ check_attribute (jerry_value_t attribute, /**< attribute to be checked */ jerry_release_value (prop_name); } /* check_attribute */ -static void -to_property_descriptor (jerry_value_t object, /**< object */ - jerry_property_descriptor_t *prop_desc_p) /**< property descriptor */ +static jerry_property_descriptor_t +to_property_descriptor (jerry_value_t object /**< object */) { - jerry_init_property_descriptor_fields (prop_desc_p); + jerry_property_descriptor_t prop_desc = jerry_property_descriptor_create (); - jerry_value_t result = jerry_to_property_descriptor (object, prop_desc_p); + 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); + + return prop_desc; } /* to_property_descriptor */ int @@ -66,39 +67,44 @@ main (void) jerry_init (JERRY_INIT_EMPTY); - jerry_property_descriptor_t prop_desc; - /* Next test. */ const char *source_p = "({ value:'X', writable:true, enumerable:true, configurable:true })"; jerry_value_t object = create_property_descriptor (source_p); - to_property_descriptor (object, &prop_desc); + jerry_property_descriptor_t prop_desc = to_property_descriptor (object); check_attribute (prop_desc.value, object, "value"); - TEST_ASSERT (prop_desc.is_value_defined); - TEST_ASSERT (!prop_desc.is_get_defined && !prop_desc.is_set_defined); - TEST_ASSERT (prop_desc.is_writable_defined && prop_desc.is_writable); - TEST_ASSERT (prop_desc.is_enumerable_defined && prop_desc.is_enumerable); - TEST_ASSERT (prop_desc.is_configurable_defined && prop_desc.is_configurable); + TEST_ASSERT (prop_desc.flags & JERRY_PROP_IS_VALUE_DEFINED); + TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_GET_DEFINED)); + TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_SET_DEFINED)); + TEST_ASSERT (prop_desc.flags & JERRY_PROP_IS_WRITABLE_DEFINED); + TEST_ASSERT (prop_desc.flags & JERRY_PROP_IS_WRITABLE); + TEST_ASSERT (prop_desc.flags & JERRY_PROP_IS_ENUMERABLE_DEFINED); + TEST_ASSERT (prop_desc.flags & JERRY_PROP_IS_ENUMERABLE); + TEST_ASSERT (prop_desc.flags & JERRY_PROP_IS_CONFIGURABLE_DEFINED); + TEST_ASSERT (prop_desc.flags & JERRY_PROP_IS_CONFIGURABLE); jerry_release_value (object); - jerry_free_property_descriptor_fields (&prop_desc); + jerry_property_descriptor_free (&prop_desc); /* Next test. */ source_p = "({ writable:false, configurable:true })"; object = create_property_descriptor (source_p); - to_property_descriptor (object, &prop_desc); + prop_desc = to_property_descriptor (object); - TEST_ASSERT (!prop_desc.is_value_defined); - TEST_ASSERT (!prop_desc.is_get_defined && !prop_desc.is_set_defined); - TEST_ASSERT (prop_desc.is_writable_defined && !prop_desc.is_writable); - TEST_ASSERT (!prop_desc.is_enumerable_defined); - TEST_ASSERT (prop_desc.is_configurable_defined && prop_desc.is_configurable); + TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_VALUE_DEFINED)); + TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_GET_DEFINED)); + TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_SET_DEFINED)); + TEST_ASSERT (prop_desc.flags & JERRY_PROP_IS_WRITABLE_DEFINED); + TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_WRITABLE)); + TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_ENUMERABLE_DEFINED)); + TEST_ASSERT (prop_desc.flags & JERRY_PROP_IS_CONFIGURABLE_DEFINED); + TEST_ASSERT (prop_desc.flags & JERRY_PROP_IS_CONFIGURABLE); jerry_release_value (object); - jerry_free_property_descriptor_fields (&prop_desc); + jerry_property_descriptor_free (&prop_desc); /* Next test. */ /* Note: the 'set' property is defined, and it has a value of undefined. @@ -106,50 +112,60 @@ main (void) source_p = "({ get: function() {}, set:undefined, configurable:true })"; object = create_property_descriptor (source_p); - to_property_descriptor (object, &prop_desc); + prop_desc = to_property_descriptor (object); check_attribute (prop_desc.getter, object, "get"); check_attribute (prop_desc.setter, object, "set"); - TEST_ASSERT (!prop_desc.is_value_defined && !prop_desc.is_writable_defined); - TEST_ASSERT (prop_desc.is_get_defined && prop_desc.is_set_defined); - TEST_ASSERT (!prop_desc.is_enumerable_defined); - TEST_ASSERT (prop_desc.is_configurable_defined && prop_desc.is_configurable); + TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_VALUE_DEFINED)); + TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_WRITABLE_DEFINED)); + TEST_ASSERT (prop_desc.flags & JERRY_PROP_IS_GET_DEFINED); + TEST_ASSERT (prop_desc.flags & JERRY_PROP_IS_SET_DEFINED); + TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_ENUMERABLE_DEFINED)); + TEST_ASSERT (prop_desc.flags & JERRY_PROP_IS_CONFIGURABLE_DEFINED); + TEST_ASSERT (prop_desc.flags & JERRY_PROP_IS_CONFIGURABLE); jerry_release_value (object); - jerry_free_property_descriptor_fields (&prop_desc); + jerry_property_descriptor_free (&prop_desc); /* Next test. */ source_p = "({ get: undefined, enumerable:false })"; object = create_property_descriptor (source_p); - to_property_descriptor (object, &prop_desc); + prop_desc = to_property_descriptor (object); check_attribute (prop_desc.getter, object, "get"); - TEST_ASSERT (!prop_desc.is_value_defined && !prop_desc.is_writable_defined); - TEST_ASSERT (prop_desc.is_get_defined && !prop_desc.is_set_defined); - TEST_ASSERT (prop_desc.is_enumerable_defined && !prop_desc.is_enumerable); - TEST_ASSERT (!prop_desc.is_configurable_defined); + TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_VALUE_DEFINED)); + TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_WRITABLE_DEFINED)); + TEST_ASSERT (prop_desc.flags & JERRY_PROP_IS_GET_DEFINED); + TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_SET_DEFINED)); + TEST_ASSERT (prop_desc.flags & JERRY_PROP_IS_ENUMERABLE_DEFINED); + TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_ENUMERABLE)); + TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_CONFIGURABLE_DEFINED)); jerry_release_value (object); - jerry_free_property_descriptor_fields (&prop_desc); + jerry_property_descriptor_free (&prop_desc); /* Next test. */ source_p = "({ set: function(v) {}, enumerable:true, configurable:false })"; object = create_property_descriptor (source_p); - to_property_descriptor (object, &prop_desc); + prop_desc = to_property_descriptor (object); check_attribute (prop_desc.setter, object, "set"); - TEST_ASSERT (!prop_desc.is_value_defined && !prop_desc.is_writable_defined); - TEST_ASSERT (!prop_desc.is_get_defined && prop_desc.is_set_defined); - TEST_ASSERT (prop_desc.is_enumerable_defined && prop_desc.is_enumerable); - TEST_ASSERT (prop_desc.is_configurable_defined && !prop_desc.is_configurable); + TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_VALUE_DEFINED)); + TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_WRITABLE_DEFINED)); + TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_GET_DEFINED)); + TEST_ASSERT (prop_desc.flags & JERRY_PROP_IS_SET_DEFINED); + TEST_ASSERT (prop_desc.flags & JERRY_PROP_IS_ENUMERABLE_DEFINED); + TEST_ASSERT (prop_desc.flags & JERRY_PROP_IS_ENUMERABLE); + TEST_ASSERT (prop_desc.flags & JERRY_PROP_IS_CONFIGURABLE_DEFINED); + TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_CONFIGURABLE)); jerry_release_value (object); - jerry_free_property_descriptor_fields (&prop_desc); + jerry_property_descriptor_free (&prop_desc); /* Next test. */ source_p = "({ get: function(v) {}, writable:true })"; diff --git a/tests/unit-ext/test-ext-method-register.c b/tests/unit-ext/test-ext-method-register.c index 9347f8a71..21265cdcc 100644 --- a/tests/unit-ext/test-ext-method-register.c +++ b/tests/unit-ext/test-ext-method-register.c @@ -41,10 +41,8 @@ freeze_property (jerry_value_t target_obj, /**< target object */ const char *target_prop) /**< target property name */ { // "freeze" property - jerry_property_descriptor_t prop_desc; - jerry_init_property_descriptor_fields (&prop_desc); - prop_desc.is_configurable_defined = true; - prop_desc.is_configurable = false; + jerry_property_descriptor_t prop_desc = jerry_property_descriptor_create (); + prop_desc.flags |= JERRY_PROP_IS_CONFIGURABLE_DEFINED; jerry_value_t prop_name = jerry_create_string ((const jerry_char_t *) target_prop); jerry_value_t return_value = jerry_define_own_property (target_obj, prop_name, &prop_desc); @@ -52,7 +50,7 @@ freeze_property (jerry_value_t target_obj, /**< target object */ jerry_release_value (return_value); jerry_release_value (prop_name); - jerry_free_property_descriptor_fields (&prop_desc); + jerry_property_descriptor_free (&prop_desc); } /* freeze_property */ /**