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:
+74
-67
@@ -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
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 ();
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 })";
|
||||
|
||||
@@ -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 */
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user