Refactor jerry_property_descriptor_t to use status flags (#4594)

JerryScript-DCO-1.0-Signed-off-by: Peter Marki marpeter@inf.u-szeged.hu
This commit is contained in:
Peter Marki
2021-03-08 09:08:24 +01:00
committed by GitHub
parent 9254cd4e7a
commit 96cd542bf5
10 changed files with 305 additions and 309 deletions
+74 -67
View File
@@ -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)