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)
+78 -91
View File
@@ -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
+24 -28
View File
@@ -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);
@@ -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;
+29 -27
View File
@@ -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 ();
+3 -4
View File
@@ -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);
@@ -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 */
+23 -26
View File
@@ -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);
+55 -39
View File
@@ -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 })";
+3 -5
View File
@@ -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 */
/**