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_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
|
## jerry_property_descriptor_t
|
||||||
|
|
||||||
**Summary**
|
**Summary**
|
||||||
@@ -502,32 +524,8 @@ the `value` field should contain the value for the property.
|
|||||||
```c
|
```c
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
/** Is [[Value]] defined? */
|
/** any combination of jerry_property_descriptor_flags_t bits */
|
||||||
bool is_value_defined;
|
uint16_t flags;
|
||||||
|
|
||||||
/** 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;
|
|
||||||
|
|
||||||
/** [[Value]] */
|
/** [[Value]] */
|
||||||
jerry_value_t value;
|
jerry_value_t value;
|
||||||
@@ -542,6 +540,7 @@ typedef struct
|
|||||||
|
|
||||||
**See also**
|
**See also**
|
||||||
|
|
||||||
|
- [jerry_property_descriptor_flags_t](#jerry_property_descriptor_flags_t)
|
||||||
- [jerry_define_own_property](#jerry_define_own_property)
|
- [jerry_define_own_property](#jerry_define_own_property)
|
||||||
|
|
||||||
## jerry_backtrace_location_t
|
## 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_value_t prop_name = jerry_create_string_from_utf8 ((jerry_char_t *) "value");
|
||||||
|
|
||||||
jerry_property_descriptor_t prop_desc;
|
jerry_property_descriptor_t prop_desc = jerry_property_descriptor_create ();
|
||||||
jerry_init_property_descriptor_fields (&prop_desc);
|
|
||||||
|
|
||||||
prop_desc.value = prop_name;
|
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_value_t from_object = jerry_from_property_descriptor (&prop_desc);
|
||||||
|
|
||||||
jerry_release_value (prop_name);
|
jerry_release_value (prop_name);
|
||||||
jerry_release_value (from_object);
|
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 (object);
|
||||||
jerry_release_value (prop_name);
|
jerry_release_value (prop_name);
|
||||||
jerry_release_value (value);
|
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_get_internal_property](#jerry_get_internal_property)
|
||||||
|
|
||||||
|
|
||||||
## jerry_init_property_descriptor_fields
|
## jerry_property_descriptor_create
|
||||||
|
|
||||||
**Summary**
|
**Summary**
|
||||||
|
|
||||||
Initialize property descriptor. This means that all fields in the `jerry_property_descriptor_t`
|
Create a property descriptor and initialize it with default values. This means that all fields in
|
||||||
struct will be set to zero or false depending on the field's type.
|
the `jerry_property_descriptor_t` struct will be set to zero or false depending on the field's type.
|
||||||
|
|
||||||
**Prototype**
|
**Prototype**
|
||||||
|
|
||||||
```c
|
```c
|
||||||
void
|
jerry_property_descriptor_t
|
||||||
jerry_init_property_descriptor_fields (jerry_property_descriptor_t *prop_desc_p);
|
jerry_property_descriptor_create (void);
|
||||||
```
|
```
|
||||||
|
|
||||||
- `prop_desc_p` - pointer to property descriptor
|
*New in version [[NEXT_RELEASE]]*: Replaces `jerry_init_property_descriptor_fields`.
|
||||||
|
|
||||||
**Example**
|
**Example**
|
||||||
|
|
||||||
```c
|
```c
|
||||||
{
|
{
|
||||||
jerry_property_descriptor_t prop_desc;
|
jerry_property_descriptor_t prop_desc = jerry_property_descriptor_create ();
|
||||||
jerry_init_property_descriptor_fields (&prop_desc);
|
|
||||||
|
|
||||||
... // usage of prop_desc
|
... // 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_property_descriptor_t](#jerry_property_descriptor_t)
|
||||||
- [jerry_define_own_property](#jerry_define_own_property)
|
- [jerry_define_own_property](#jerry_define_own_property)
|
||||||
- [jerry_get_own_property_descriptor](#jerry_get_own_property_descriptor)
|
- [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
|
## jerry_define_own_property
|
||||||
@@ -7389,19 +7386,23 @@ main (void)
|
|||||||
jerry_value_t global_obj_val = jerry_get_global_object ();
|
jerry_value_t global_obj_val = jerry_get_global_object ();
|
||||||
|
|
||||||
// configure the property
|
// configure the property
|
||||||
jerry_property_descriptor_t prop_desc;
|
jerry_property_descriptor_t prop_desc = jerry_property_descriptor_create ();
|
||||||
jerry_init_property_descriptor_fields (&prop_desc);
|
|
||||||
|
|
||||||
jerry_value_t value_to_set;
|
|
||||||
|
|
||||||
// create or acquire value to set
|
// create or acquire value to set
|
||||||
// For example:
|
// 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 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.
|
// 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
|
// set the "value" field to the number 33
|
||||||
prop_desc.value = value_to_set;
|
prop_desc.value = value_to_set;
|
||||||
@@ -7414,12 +7415,20 @@ main (void)
|
|||||||
// there was an error
|
// 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
|
// 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 (return_value);
|
||||||
jerry_release_value (prop_name);
|
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_release_value (global_obj_val);
|
||||||
|
|
||||||
jerry_cleanup ();
|
jerry_cleanup ();
|
||||||
@@ -7474,14 +7483,12 @@ main (void)
|
|||||||
jerry_value_t global_obj_val = jerry_get_global_object ();
|
jerry_value_t global_obj_val = jerry_get_global_object ();
|
||||||
|
|
||||||
// configure the property
|
// configure the property
|
||||||
jerry_property_descriptor_t prop_desc;
|
jerry_property_descriptor_t prop_desc = jerry_property_descriptor_create ();
|
||||||
jerry_init_property_descriptor_fields (&prop_desc);
|
|
||||||
|
|
||||||
// set the property descriptor fields:
|
// 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.getter = jerry_create_external_function (method_getter);
|
||||||
prop_desc.is_set_defined = true;
|
|
||||||
prop_desc.setter = jerry_create_external_function (method_setter);
|
prop_desc.setter = jerry_create_external_function (method_setter);
|
||||||
|
|
||||||
// add the property as "my_prop" for the global object
|
// add the property as "my_prop" for the global object
|
||||||
@@ -7497,7 +7504,7 @@ main (void)
|
|||||||
jerry_release_value (return_value);
|
jerry_release_value (return_value);
|
||||||
jerry_release_value (prop_name);
|
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_release_value (global_obj_val);
|
||||||
|
|
||||||
// run an example js code to use the getter/setters
|
// run an example js code to use the getter/setters
|
||||||
@@ -7518,9 +7525,9 @@ main (void)
|
|||||||
**See also**
|
**See also**
|
||||||
|
|
||||||
- [jerry_property_descriptor_t](#jerry_property_descriptor_t)
|
- [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_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
|
## 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_value_t global_obj_val = jerry_get_global_object ();
|
||||||
|
|
||||||
jerry_property_descriptor_t prop_desc;
|
jerry_property_descriptor_t prop_desc = jerry_property_descriptor_create ();
|
||||||
jerry_init_property_descriptor_fields (&prop_desc);
|
|
||||||
|
|
||||||
jerry_value_t prop_name = jerry_create_string ((const jerry_char_t *) "my_prop");
|
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);
|
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
|
... // usage of property descriptor
|
||||||
|
|
||||||
jerry_free_property_descriptor_fields (&prop_desc);
|
jerry_property_descriptor_free (&prop_desc);
|
||||||
jerry_release_value (global_obj_val);
|
jerry_release_value (global_obj_val);
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -7566,12 +7572,12 @@ jerry_get_own_property_descriptor (const jerry_value_t obj_val,
|
|||||||
**See also**
|
**See also**
|
||||||
|
|
||||||
- [jerry_property_descriptor_t](#jerry_property_descriptor_t)
|
- [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_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**
|
**Summary**
|
||||||
|
|
||||||
@@ -7581,27 +7587,28 @@ Free fields of property descriptor (setter, getter and value).
|
|||||||
|
|
||||||
```c
|
```c
|
||||||
void
|
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
|
- `prop_desc_p` - pointer to property descriptor
|
||||||
|
|
||||||
|
*New in version [[NEXT_RELEASE]]*: Replaces `jerry_free_property_descriptor_fields`.
|
||||||
|
|
||||||
**Example**
|
**Example**
|
||||||
|
|
||||||
```c
|
```c
|
||||||
{
|
{
|
||||||
jerry_property_descriptor_t prop_desc;
|
jerry_property_descriptor_t prop_desc = jerry_property_descriptor_create ();
|
||||||
jerry_init_property_descriptor_fields (&prop_desc);
|
|
||||||
|
|
||||||
... // usage of property descriptor
|
... // usage of property descriptor
|
||||||
|
|
||||||
jerry_free_property_descriptor_fields (&prop_desc);
|
jerry_property_descriptor_free (&prop_desc);
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
**See also**
|
**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_define_own_property](#jerry_define_own_property)
|
||||||
- [jerry_get_own_property_descriptor](#jerry_get_own_property_descriptor)
|
- [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,
|
&& (int) ECMA_INIT_MEM_STATS == (int) JERRY_INIT_MEM_STATS,
|
||||||
ecma_init_flag_t_must_be_equal_to_jerry_init_flag_t);
|
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
|
#if JERRY_BUILTIN_REGEXP
|
||||||
JERRY_STATIC_ASSERT ((int) RE_FLAG_GLOBAL == (int) JERRY_REGEXP_FLAG_GLOBAL
|
JERRY_STATIC_ASSERT ((int) RE_FLAG_GLOBAL == (int) JERRY_REGEXP_FLAG_GLOBAL
|
||||||
&& (int) RE_FLAG_MULTILINE == (int) JERRY_REGEXP_FLAG_MULTILINE
|
&& (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 */
|
} /* 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_property_descriptor_t
|
||||||
jerry_init_property_descriptor_fields (jerry_property_descriptor_t *prop_desc_p) /**< [out] property descriptor */
|
jerry_property_descriptor_create (void)
|
||||||
{
|
{
|
||||||
prop_desc_p->is_value_defined = false;
|
jerry_property_descriptor_t prop_desc;
|
||||||
prop_desc_p->value = ECMA_VALUE_UNDEFINED;
|
|
||||||
prop_desc_p->is_writable_defined = false;
|
prop_desc.flags = JERRY_PROP_NO_OPTS;
|
||||||
prop_desc_p->is_writable = false;
|
prop_desc.value = ECMA_VALUE_UNDEFINED;
|
||||||
prop_desc_p->is_enumerable_defined = false;
|
prop_desc.getter = ECMA_VALUE_UNDEFINED;
|
||||||
prop_desc_p->is_enumerable = false;
|
prop_desc.setter = ECMA_VALUE_UNDEFINED;
|
||||||
prop_desc_p->is_configurable_defined = false;
|
|
||||||
prop_desc_p->is_configurable = false;
|
return prop_desc;
|
||||||
prop_desc_p->is_get_defined = false;
|
} /* jerry_property_descriptor_create */
|
||||||
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 */
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert a ecma_property_descriptor_t to a jerry_property_descriptor_t
|
* 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
|
static jerry_property_descriptor_t
|
||||||
jerry_property_descriptor_from_ecma (const ecma_property_descriptor_t *prop_desc_p) /**<[out] property_descriptor */
|
jerry_property_descriptor_from_ecma (const ecma_property_descriptor_t *prop_desc_p) /**<[out] property_descriptor */
|
||||||
{
|
{
|
||||||
jerry_property_descriptor_t prop_desc;
|
jerry_property_descriptor_t prop_desc = jerry_property_descriptor_create ();
|
||||||
jerry_init_property_descriptor_fields (&prop_desc);
|
|
||||||
|
|
||||||
if (prop_desc_p->flags & ECMA_PROP_IS_ENUMERABLE_DEFINED)
|
prop_desc.flags = prop_desc_p->flags;
|
||||||
{
|
|
||||||
prop_desc.is_enumerable_defined = true;
|
|
||||||
prop_desc.is_enumerable = prop_desc_p->flags & ECMA_PROP_IS_ENUMERABLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (prop_desc_p->flags & ECMA_PROP_IS_CONFIGURABLE_DEFINED)
|
if (prop_desc.flags & (JERRY_PROP_IS_VALUE_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)
|
|
||||||
{
|
{
|
||||||
prop_desc.value = prop_desc_p->value;
|
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)
|
if (prop_desc_p->flags & ECMA_PROP_IS_GET_DEFINED)
|
||||||
{
|
{
|
||||||
prop_desc.getter = ECMA_VALUE_NULL;
|
prop_desc.getter = ECMA_VALUE_NULL;
|
||||||
prop_desc.is_get_defined = true;
|
|
||||||
|
|
||||||
if (prop_desc_p->get_p != NULL)
|
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)
|
if (prop_desc_p->flags & ECMA_PROP_IS_SET_DEFINED)
|
||||||
{
|
{
|
||||||
prop_desc.setter = ECMA_VALUE_NULL;
|
prop_desc.setter = ECMA_VALUE_NULL;
|
||||||
prop_desc.is_set_defined = true;
|
|
||||||
|
|
||||||
if (prop_desc_p->set_p != NULL)
|
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 ();
|
ecma_property_descriptor_t prop_desc = ecma_make_empty_property_descriptor ();
|
||||||
|
|
||||||
uint32_t flags = ECMA_PROP_NO_OPTS;
|
prop_desc.flags = prop_desc_p->flags;
|
||||||
|
|
||||||
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));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Copy data property info. */
|
/* Copy data property info. */
|
||||||
flags |= (prop_desc_p->is_value_defined ? ECMA_PROP_IS_VALUE_DEFINED : ECMA_PROP_NO_OPTS);
|
if (prop_desc_p->flags & (JERRY_PROP_IS_VALUE_DEFINED))
|
||||||
|
|
||||||
if (prop_desc_p->is_value_defined)
|
|
||||||
{
|
{
|
||||||
if (ecma_is_value_error_reference (prop_desc_p->value))
|
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;
|
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. */
|
/* 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;
|
ecma_value_t getter = prop_desc_p->getter;
|
||||||
flags |= ECMA_PROP_IS_GET_DEFINED;
|
|
||||||
|
|
||||||
if (ecma_is_value_error_reference (getter))
|
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;
|
ecma_value_t setter = prop_desc_p->setter;
|
||||||
flags |= ECMA_PROP_IS_SET_DEFINED;
|
|
||||||
|
|
||||||
if (ecma_is_value_error_reference (setter))
|
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;
|
return prop_desc;
|
||||||
} /* jerry_property_descriptor_to_ecma */
|
} /* 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.
|
* 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.
|
* returned value must be freed with jerry_release_value, when it is no longer needed.
|
||||||
*
|
*
|
||||||
* @return true value - if the operation was successful
|
* @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
|
* value marked with error flag - otherwise
|
||||||
*/
|
*/
|
||||||
jerry_value_t
|
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)
|
if (!ecma_is_value_object (obj_val)
|
||||||
|| !ecma_is_value_prop_name (prop_name_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)
|
if (prop_desc_p->flags & (JERRY_PROP_IS_WRITABLE_DEFINED | JERRY_PROP_IS_VALUE_DEFINED)
|
||||||
&& (prop_desc_p->is_get_defined || prop_desc_p->is_set_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);
|
ecma_property_descriptor_t prop_desc = jerry_property_descriptor_to_ecma (prop_desc_p);
|
||||||
|
|
||||||
if (ECMA_IS_VALUE_ERROR (prop_desc.value))
|
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),
|
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),
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
prop_desc_p->is_configurable_defined = true;
|
prop_desc_p->flags = prop_desc.flags;
|
||||||
prop_desc_p->is_configurable = (prop_desc.flags & ECMA_PROP_IS_CONFIGURABLE) != 0;
|
if (!(prop_desc_p->flags & JERRY_PROP_IS_WRITABLE_DEFINED))
|
||||||
prop_desc_p->is_enumerable_defined = true;
|
{
|
||||||
prop_desc_p->is_enumerable = (prop_desc.flags & ECMA_PROP_IS_ENUMERABLE) != 0;
|
prop_desc_p->flags &= (uint16_t) ~JERRY_PROP_IS_WRITABLE;
|
||||||
|
}
|
||||||
prop_desc_p->is_writable_defined = (prop_desc.flags & ECMA_PROP_IS_WRITABLE_DEFINED) != 0;
|
if (!(prop_desc_p->flags & JERRY_PROP_IS_CONFIGURABLE_DEFINED))
|
||||||
prop_desc_p->is_writable = prop_desc_p->is_writable_defined ? (prop_desc.flags & ECMA_PROP_IS_WRITABLE) != 0 : false;
|
{
|
||||||
|
prop_desc_p->flags &= (uint16_t) ~JERRY_PROP_IS_CONFIGURABLE;
|
||||||
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;
|
if (!(prop_desc_p->flags & JERRY_PROP_IS_ENUMERABLE_DEFINED))
|
||||||
prop_desc_p->is_set_defined = (prop_desc.flags & ECMA_PROP_IS_SET_DEFINED) != 0;
|
{
|
||||||
|
prop_desc_p->flags &= (uint16_t) ~JERRY_PROP_IS_ENUMERABLE;
|
||||||
|
}
|
||||||
|
|
||||||
prop_desc_p->value = ECMA_VALUE_UNDEFINED;
|
prop_desc_p->value = ECMA_VALUE_UNDEFINED;
|
||||||
prop_desc_p->getter = ECMA_VALUE_UNDEFINED;
|
prop_desc_p->getter = ECMA_VALUE_UNDEFINED;
|
||||||
prop_desc_p->setter = 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;
|
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)
|
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)
|
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).
|
* Free fields of property descriptor (setter, getter and value).
|
||||||
*/
|
*/
|
||||||
void
|
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);
|
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);
|
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_release_value (prop_desc_p->setter);
|
||||||
}
|
}
|
||||||
} /* jerry_free_property_descriptor_fields */
|
} /* jerry_property_descriptor_free */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Invoke function specified by a function value
|
* Invoke function specified by a function value
|
||||||
|
|||||||
@@ -167,37 +167,33 @@ typedef uint32_t jerry_length_t;
|
|||||||
*/
|
*/
|
||||||
typedef uint32_t jerry_value_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.
|
* Description of ECMA property descriptor.
|
||||||
*/
|
*/
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
/** Is [[Value]] defined? */
|
/** any combination of jerry_property_descriptor_flags_t bits */
|
||||||
bool is_value_defined;
|
uint16_t flags;
|
||||||
|
|
||||||
/** 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;
|
|
||||||
|
|
||||||
/** [[Value]] */
|
/** [[Value]] */
|
||||||
jerry_value_t 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,
|
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);
|
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,
|
jerry_value_t jerry_define_own_property (const jerry_value_t obj_val,
|
||||||
const jerry_value_t prop_name_val,
|
const jerry_value_t prop_name_val,
|
||||||
const jerry_property_descriptor_t *prop_desc_p);
|
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,
|
bool jerry_get_own_property_descriptor (const jerry_value_t obj_val,
|
||||||
const jerry_value_t prop_name_val,
|
const jerry_value_t prop_name_val,
|
||||||
jerry_property_descriptor_t *prop_desc_p);
|
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,
|
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);
|
const jerry_value_t args_p[], jerry_size_t args_count);
|
||||||
|
|||||||
@@ -104,16 +104,14 @@ main (void)
|
|||||||
|
|
||||||
jerry_value_t names;
|
jerry_value_t names;
|
||||||
|
|
||||||
jerry_property_descriptor_t prop_desc;
|
jerry_property_descriptor_t prop_desc = jerry_property_descriptor_create ();
|
||||||
jerry_init_property_descriptor_fields (&prop_desc);
|
prop_desc.flags |= (JERRY_PROP_IS_CONFIGURABLE_DEFINED
|
||||||
prop_desc.is_configurable_defined = true;
|
| JERRY_PROP_IS_CONFIGURABLE
|
||||||
prop_desc.is_configurable = true;
|
| JERRY_PROP_IS_WRITABLE_DEFINED
|
||||||
prop_desc.is_writable_defined = true;
|
| JERRY_PROP_IS_WRITABLE
|
||||||
prop_desc.is_writable = true;
|
| JERRY_PROP_IS_ENUMERABLE_DEFINED);
|
||||||
prop_desc.is_enumerable_defined = true;
|
|
||||||
|
|
||||||
// Test enumerable - non-enumerable filter
|
// Test enumerable - non-enumerable filter
|
||||||
prop_desc.is_enumerable = false;
|
|
||||||
define_property (test_object, prop_names[2], &prop_desc, false);
|
define_property (test_object, prop_names[2], &prop_desc, false);
|
||||||
names = jerry_object_get_property_names (test_object,
|
names = jerry_object_get_property_names (test_object,
|
||||||
JERRY_PROPERTY_FILTER_ALL | JERRY_PROPERTY_FILTER_EXLCUDE_NON_ENUMERABLE);
|
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);
|
TEST_ASSERT (jerry_get_array_length (names) == (uint32_t) 3);
|
||||||
compare_prop_name (names, prop_names[2], 2);
|
compare_prop_name (names, prop_names[2], 2);
|
||||||
jerry_release_value (names);
|
jerry_release_value (names);
|
||||||
prop_desc.is_enumerable = true;
|
prop_desc.flags |= JERRY_PROP_IS_ENUMERABLE;
|
||||||
|
|
||||||
// Test configurable - non-configurable filter
|
// 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);
|
define_property (test_object, prop_names[3], &prop_desc, false);
|
||||||
names = jerry_object_get_property_names (test_object,
|
names = jerry_object_get_property_names (test_object,
|
||||||
JERRY_PROPERTY_FILTER_ALL | JERRY_PROPERTY_FILTER_EXLCUDE_NON_CONFIGURABLE);
|
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);
|
TEST_ASSERT (jerry_get_array_length (names) == (uint32_t) 4);
|
||||||
compare_prop_name (names, prop_names[3], 3);
|
compare_prop_name (names, prop_names[3], 3);
|
||||||
jerry_release_value (names);
|
jerry_release_value (names);
|
||||||
prop_desc.is_configurable = true;
|
prop_desc.flags |= JERRY_PROP_IS_CONFIGURABLE;
|
||||||
|
|
||||||
// Test writable - non-writable filter
|
// 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);
|
define_property (test_object, prop_names[4], &prop_desc, false);
|
||||||
names = jerry_object_get_property_names (test_object,
|
names = jerry_object_get_property_names (test_object,
|
||||||
JERRY_PROPERTY_FILTER_ALL | JERRY_PROPERTY_FILTER_EXLCUDE_NON_WRITABLE);
|
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);
|
TEST_ASSERT (jerry_get_array_length (names) == (uint32_t) 5);
|
||||||
compare_prop_name (names, prop_names[4], 4);
|
compare_prop_name (names, prop_names[4], 4);
|
||||||
jerry_release_value (names);
|
jerry_release_value (names);
|
||||||
prop_desc.is_writable = true;
|
prop_desc.flags |= JERRY_PROP_IS_WRITABLE;
|
||||||
|
|
||||||
// Test all property filter
|
// Test all property filter
|
||||||
names = jerry_object_get_property_names (test_object, JERRY_PROPERTY_FILTER_ALL);
|
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);
|
TEST_ASSERT (jerry_get_array_length (names) == (uint32_t) 7);
|
||||||
jerry_release_value (names);
|
jerry_release_value (names);
|
||||||
|
|
||||||
jerry_free_property_descriptor_fields (&prop_desc);
|
jerry_property_descriptor_free (&prop_desc);
|
||||||
jerry_release_value (test_object);
|
jerry_release_value (test_object);
|
||||||
jerry_cleanup ();
|
jerry_cleanup ();
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -25,46 +25,48 @@ main (void)
|
|||||||
jerry_init (JERRY_INIT_EMPTY);
|
jerry_init (JERRY_INIT_EMPTY);
|
||||||
|
|
||||||
/* Test: init property descriptor */
|
/* Test: init property descriptor */
|
||||||
jerry_property_descriptor_t prop_desc;
|
jerry_property_descriptor_t prop_desc = jerry_property_descriptor_create ();
|
||||||
jerry_init_property_descriptor_fields (&prop_desc);
|
TEST_ASSERT (prop_desc.flags == JERRY_PROP_NO_OPTS);
|
||||||
TEST_ASSERT (prop_desc.is_value_defined == false);
|
|
||||||
TEST_ASSERT (jerry_value_is_undefined (prop_desc.value));
|
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 (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_ASSERT (jerry_value_is_undefined (prop_desc.setter));
|
||||||
|
|
||||||
/* Test: define own properties */
|
/* Test: define own properties */
|
||||||
jerry_value_t global_obj_val = jerry_get_global_object ();
|
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");
|
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);
|
prop_desc.value = jerry_acquire_value (prop_name);
|
||||||
jerry_value_t res = jerry_define_own_property (global_obj_val, prop_name, &prop_desc);
|
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_error (res));
|
||||||
TEST_ASSERT (jerry_value_is_boolean (res));
|
TEST_ASSERT (jerry_value_is_boolean (res));
|
||||||
TEST_ASSERT (jerry_get_boolean_value (res));
|
TEST_ASSERT (jerry_get_boolean_value (res));
|
||||||
jerry_release_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 */
|
/* 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);
|
bool is_ok = jerry_get_own_property_descriptor (global_obj_val, prop_name, &prop_desc);
|
||||||
TEST_ASSERT (is_ok);
|
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 (jerry_value_is_string (prop_desc.value));
|
||||||
TEST_ASSERT (prop_desc.is_writable == false);
|
TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_WRITABLE));
|
||||||
TEST_ASSERT (prop_desc.is_enumerable == false);
|
TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_ENUMERABLE));
|
||||||
TEST_ASSERT (prop_desc.is_configurable == false);
|
TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_CONFIGURABLE));
|
||||||
TEST_ASSERT (prop_desc.is_get_defined == false);
|
TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_GET_DEFINED));
|
||||||
TEST_ASSERT (jerry_value_is_undefined (prop_desc.getter));
|
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));
|
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))
|
if (jerry_is_feature_enabled (JERRY_FEATURE_PROXY))
|
||||||
{
|
{
|
||||||
@@ -83,26 +85,26 @@ main (void)
|
|||||||
jerry_release_value (prop_name);
|
jerry_release_value (prop_name);
|
||||||
|
|
||||||
/* Test: define and get own property descriptor */
|
/* 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");
|
prop_name = jerry_create_string ((const jerry_char_t *) "enumerable-property");
|
||||||
res = jerry_define_own_property (global_obj_val, prop_name, &prop_desc);
|
res = jerry_define_own_property (global_obj_val, prop_name, &prop_desc);
|
||||||
TEST_ASSERT (!jerry_value_is_error (res));
|
TEST_ASSERT (!jerry_value_is_error (res));
|
||||||
TEST_ASSERT (jerry_value_is_boolean (res));
|
TEST_ASSERT (jerry_value_is_boolean (res));
|
||||||
TEST_ASSERT (jerry_get_boolean_value (res));
|
TEST_ASSERT (jerry_get_boolean_value (res));
|
||||||
jerry_release_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);
|
is_ok = jerry_get_own_property_descriptor (global_obj_val, prop_name, &prop_desc);
|
||||||
TEST_ASSERT (is_ok);
|
TEST_ASSERT (is_ok);
|
||||||
TEST_ASSERT (prop_desc.is_writable == false);
|
TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_WRITABLE));
|
||||||
TEST_ASSERT (prop_desc.is_enumerable == true);
|
TEST_ASSERT (prop_desc.flags & JERRY_PROP_IS_ENUMERABLE);
|
||||||
TEST_ASSERT (prop_desc.is_configurable == false);
|
TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_CONFIGURABLE));
|
||||||
|
|
||||||
jerry_release_value (prop_name);
|
jerry_release_value (prop_name);
|
||||||
jerry_release_value (global_obj_val);
|
jerry_release_value (global_obj_val);
|
||||||
|
|
||||||
/* Test: define own property descriptor error */
|
/* Test: define own property descriptor error */
|
||||||
jerry_init_property_descriptor_fields (&prop_desc);
|
prop_desc = jerry_property_descriptor_create ();
|
||||||
prop_desc.is_value_defined = true;
|
prop_desc.flags |= JERRY_PROP_IS_VALUE_DEFINED;
|
||||||
prop_desc.value = jerry_create_number (11);
|
prop_desc.value = jerry_create_number (11);
|
||||||
|
|
||||||
jerry_value_t obj_val = jerry_create_object ();
|
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 global_obj = jerry_get_global_object ();
|
||||||
jerry_value_t prop_name = jerry_create_string ((const jerry_char_t *) "foo");
|
jerry_value_t prop_name = jerry_create_string ((const jerry_char_t *) "foo");
|
||||||
|
|
||||||
jerry_property_descriptor_t prop_desc;
|
jerry_property_descriptor_t prop_desc = jerry_property_descriptor_create ();
|
||||||
jerry_init_property_descriptor_fields (&prop_desc);
|
prop_desc.flags |= JERRY_PROP_IS_VALUE_DEFINED;
|
||||||
prop_desc.is_value_defined = true;
|
|
||||||
prop_desc.value = jerry_create_number (5.2);
|
prop_desc.value = jerry_create_number (5.2);
|
||||||
|
|
||||||
jerry_value_t define_result = jerry_define_own_property (global_obj, prop_name, &prop_desc);
|
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));
|
TEST_ASSERT (jerry_value_is_boolean (define_result) && jerry_get_boolean_value (define_result));
|
||||||
jerry_release_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 (prop_name);
|
||||||
jerry_release_value (global_obj);
|
jerry_release_value (global_obj);
|
||||||
|
|
||||||
|
|||||||
@@ -43,25 +43,21 @@ main (void)
|
|||||||
|
|
||||||
prop_name = jerry_create_string_from_utf8 ((jerry_char_t *) "writable");
|
prop_name = jerry_create_string_from_utf8 ((jerry_char_t *) "writable");
|
||||||
value = jerry_get_property (from_object, prop_name);
|
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 *) "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 *) "enumerable");
|
prop_name = jerry_create_string_from_utf8 ((jerry_char_t *) "enumerable");
|
||||||
value = jerry_get_property (from_object, prop_name);
|
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");
|
prop_name = jerry_create_string_from_utf8 ((jerry_char_t *) "configurable");
|
||||||
value = jerry_get_property (from_object, prop_name);
|
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 (object);
|
||||||
jerry_release_value (prop_name);
|
jerry_release_value (prop_name);
|
||||||
jerry_release_value (value);
|
jerry_release_value (value);
|
||||||
jerry_release_value (from_object);
|
jerry_release_value (from_object);
|
||||||
jerry_free_property_descriptor_fields (&prop_desc);
|
jerry_property_descriptor_free (&prop_desc);
|
||||||
jerry_cleanup ();
|
jerry_cleanup ();
|
||||||
return 0;
|
return 0;
|
||||||
} /* main */
|
} /* main */
|
||||||
|
|||||||
@@ -91,49 +91,46 @@ main (void)
|
|||||||
/* Test {get, define}_own_property_descriptor */
|
/* Test {get, define}_own_property_descriptor */
|
||||||
jerry_property_descriptor_t prop_desc;
|
jerry_property_descriptor_t prop_desc;
|
||||||
TEST_ASSERT (jerry_get_own_property_descriptor (object, symbol_2, &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 (value_2 == prop_desc.value);
|
||||||
TEST_ASSERT (jerry_get_number_value (value_2) == jerry_get_number_value (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.flags & JERRY_PROP_IS_WRITABLE);
|
||||||
TEST_ASSERT (prop_desc.is_enumerable == true);
|
TEST_ASSERT (prop_desc.flags & JERRY_PROP_IS_ENUMERABLE);
|
||||||
TEST_ASSERT (prop_desc.is_configurable == true);
|
TEST_ASSERT (prop_desc.flags & JERRY_PROP_IS_CONFIGURABLE);
|
||||||
TEST_ASSERT (prop_desc.is_get_defined == false);
|
TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_GET_DEFINED));
|
||||||
TEST_ASSERT (jerry_value_is_undefined (prop_desc.getter));
|
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));
|
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 */
|
/* 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);
|
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.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)));
|
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 */
|
/* Check the modified fields */
|
||||||
TEST_ASSERT (jerry_get_own_property_descriptor (object, symbol_2, &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_3 == prop_desc.value);
|
TEST_ASSERT (value_3 == prop_desc.value);
|
||||||
TEST_ASSERT (jerry_value_is_string (prop_desc.value));
|
TEST_ASSERT (jerry_value_is_string (prop_desc.value));
|
||||||
TEST_ASSERT (prop_desc.is_writable_defined == true);
|
TEST_ASSERT (prop_desc.flags & JERRY_PROP_IS_WRITABLE_DEFINED);
|
||||||
TEST_ASSERT (prop_desc.is_writable == false);
|
TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_WRITABLE));
|
||||||
TEST_ASSERT (prop_desc.is_enumerable_defined == true);
|
TEST_ASSERT (prop_desc.flags & JERRY_PROP_IS_ENUMERABLE_DEFINED);
|
||||||
TEST_ASSERT (prop_desc.is_enumerable == false);
|
TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_ENUMERABLE));
|
||||||
TEST_ASSERT (prop_desc.is_configurable_defined == true);
|
TEST_ASSERT (prop_desc.flags & JERRY_PROP_IS_CONFIGURABLE_DEFINED);
|
||||||
TEST_ASSERT (prop_desc.is_configurable == false);
|
TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_CONFIGURABLE));
|
||||||
TEST_ASSERT (prop_desc.is_get_defined == false);
|
TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_GET_DEFINED));
|
||||||
TEST_ASSERT (jerry_value_is_undefined (prop_desc.getter));
|
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));
|
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_3);
|
||||||
jerry_release_value (value_2);
|
jerry_release_value (value_2);
|
||||||
|
|||||||
@@ -48,15 +48,16 @@ check_attribute (jerry_value_t attribute, /**< attribute to be checked */
|
|||||||
jerry_release_value (prop_name);
|
jerry_release_value (prop_name);
|
||||||
} /* check_attribute */
|
} /* check_attribute */
|
||||||
|
|
||||||
static void
|
static jerry_property_descriptor_t
|
||||||
to_property_descriptor (jerry_value_t object, /**< object */
|
to_property_descriptor (jerry_value_t object /**< object */)
|
||||||
jerry_property_descriptor_t *prop_desc_p) /**< property descriptor */
|
|
||||||
{
|
{
|
||||||
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));
|
TEST_ASSERT (jerry_value_is_boolean (result) && jerry_get_boolean_value (result));
|
||||||
jerry_release_value (result);
|
jerry_release_value (result);
|
||||||
|
|
||||||
|
return prop_desc;
|
||||||
} /* to_property_descriptor */
|
} /* to_property_descriptor */
|
||||||
|
|
||||||
int
|
int
|
||||||
@@ -66,39 +67,44 @@ main (void)
|
|||||||
|
|
||||||
jerry_init (JERRY_INIT_EMPTY);
|
jerry_init (JERRY_INIT_EMPTY);
|
||||||
|
|
||||||
jerry_property_descriptor_t prop_desc;
|
|
||||||
|
|
||||||
/* Next test. */
|
/* Next test. */
|
||||||
const char *source_p = "({ value:'X', writable:true, enumerable:true, configurable:true })";
|
const char *source_p = "({ value:'X', writable:true, enumerable:true, configurable:true })";
|
||||||
jerry_value_t object = create_property_descriptor (source_p);
|
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");
|
check_attribute (prop_desc.value, object, "value");
|
||||||
|
|
||||||
TEST_ASSERT (prop_desc.is_value_defined);
|
TEST_ASSERT (prop_desc.flags & JERRY_PROP_IS_VALUE_DEFINED);
|
||||||
TEST_ASSERT (!prop_desc.is_get_defined && !prop_desc.is_set_defined);
|
TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_GET_DEFINED));
|
||||||
TEST_ASSERT (prop_desc.is_writable_defined && prop_desc.is_writable);
|
TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_SET_DEFINED));
|
||||||
TEST_ASSERT (prop_desc.is_enumerable_defined && prop_desc.is_enumerable);
|
TEST_ASSERT (prop_desc.flags & JERRY_PROP_IS_WRITABLE_DEFINED);
|
||||||
TEST_ASSERT (prop_desc.is_configurable_defined && prop_desc.is_configurable);
|
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_release_value (object);
|
||||||
jerry_free_property_descriptor_fields (&prop_desc);
|
jerry_property_descriptor_free (&prop_desc);
|
||||||
|
|
||||||
/* Next test. */
|
/* Next test. */
|
||||||
source_p = "({ writable:false, configurable:true })";
|
source_p = "({ writable:false, configurable:true })";
|
||||||
object = create_property_descriptor (source_p);
|
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.flags & JERRY_PROP_IS_VALUE_DEFINED));
|
||||||
TEST_ASSERT (!prop_desc.is_get_defined && !prop_desc.is_set_defined);
|
TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_GET_DEFINED));
|
||||||
TEST_ASSERT (prop_desc.is_writable_defined && !prop_desc.is_writable);
|
TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_SET_DEFINED));
|
||||||
TEST_ASSERT (!prop_desc.is_enumerable_defined);
|
TEST_ASSERT (prop_desc.flags & JERRY_PROP_IS_WRITABLE_DEFINED);
|
||||||
TEST_ASSERT (prop_desc.is_configurable_defined && prop_desc.is_configurable);
|
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_release_value (object);
|
||||||
jerry_free_property_descriptor_fields (&prop_desc);
|
jerry_property_descriptor_free (&prop_desc);
|
||||||
|
|
||||||
/* Next test. */
|
/* Next test. */
|
||||||
/* Note: the 'set' property is defined, and it has a value of undefined.
|
/* 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 })";
|
source_p = "({ get: function() {}, set:undefined, configurable:true })";
|
||||||
object = create_property_descriptor (source_p);
|
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.getter, object, "get");
|
||||||
check_attribute (prop_desc.setter, object, "set");
|
check_attribute (prop_desc.setter, object, "set");
|
||||||
|
|
||||||
TEST_ASSERT (!prop_desc.is_value_defined && !prop_desc.is_writable_defined);
|
TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_VALUE_DEFINED));
|
||||||
TEST_ASSERT (prop_desc.is_get_defined && prop_desc.is_set_defined);
|
TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_WRITABLE_DEFINED));
|
||||||
TEST_ASSERT (!prop_desc.is_enumerable_defined);
|
TEST_ASSERT (prop_desc.flags & JERRY_PROP_IS_GET_DEFINED);
|
||||||
TEST_ASSERT (prop_desc.is_configurable_defined && prop_desc.is_configurable);
|
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_release_value (object);
|
||||||
jerry_free_property_descriptor_fields (&prop_desc);
|
jerry_property_descriptor_free (&prop_desc);
|
||||||
|
|
||||||
/* Next test. */
|
/* Next test. */
|
||||||
source_p = "({ get: undefined, enumerable:false })";
|
source_p = "({ get: undefined, enumerable:false })";
|
||||||
object = create_property_descriptor (source_p);
|
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.getter, object, "get");
|
||||||
|
|
||||||
TEST_ASSERT (!prop_desc.is_value_defined && !prop_desc.is_writable_defined);
|
TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_VALUE_DEFINED));
|
||||||
TEST_ASSERT (prop_desc.is_get_defined && !prop_desc.is_set_defined);
|
TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_WRITABLE_DEFINED));
|
||||||
TEST_ASSERT (prop_desc.is_enumerable_defined && !prop_desc.is_enumerable);
|
TEST_ASSERT (prop_desc.flags & JERRY_PROP_IS_GET_DEFINED);
|
||||||
TEST_ASSERT (!prop_desc.is_configurable_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_release_value (object);
|
||||||
jerry_free_property_descriptor_fields (&prop_desc);
|
jerry_property_descriptor_free (&prop_desc);
|
||||||
|
|
||||||
/* Next test. */
|
/* Next test. */
|
||||||
source_p = "({ set: function(v) {}, enumerable:true, configurable:false })";
|
source_p = "({ set: function(v) {}, enumerable:true, configurable:false })";
|
||||||
object = create_property_descriptor (source_p);
|
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");
|
check_attribute (prop_desc.setter, object, "set");
|
||||||
|
|
||||||
TEST_ASSERT (!prop_desc.is_value_defined && !prop_desc.is_writable_defined);
|
TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_VALUE_DEFINED));
|
||||||
TEST_ASSERT (!prop_desc.is_get_defined && prop_desc.is_set_defined);
|
TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_WRITABLE_DEFINED));
|
||||||
TEST_ASSERT (prop_desc.is_enumerable_defined && prop_desc.is_enumerable);
|
TEST_ASSERT (!(prop_desc.flags & JERRY_PROP_IS_GET_DEFINED));
|
||||||
TEST_ASSERT (prop_desc.is_configurable_defined && !prop_desc.is_configurable);
|
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_release_value (object);
|
||||||
jerry_free_property_descriptor_fields (&prop_desc);
|
jerry_property_descriptor_free (&prop_desc);
|
||||||
|
|
||||||
/* Next test. */
|
/* Next test. */
|
||||||
source_p = "({ get: function(v) {}, writable:true })";
|
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 */
|
const char *target_prop) /**< target property name */
|
||||||
{
|
{
|
||||||
// "freeze" property
|
// "freeze" property
|
||||||
jerry_property_descriptor_t prop_desc;
|
jerry_property_descriptor_t prop_desc = jerry_property_descriptor_create ();
|
||||||
jerry_init_property_descriptor_fields (&prop_desc);
|
prop_desc.flags |= JERRY_PROP_IS_CONFIGURABLE_DEFINED;
|
||||||
prop_desc.is_configurable_defined = true;
|
|
||||||
prop_desc.is_configurable = false;
|
|
||||||
|
|
||||||
jerry_value_t prop_name = jerry_create_string ((const jerry_char_t *) target_prop);
|
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);
|
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 (return_value);
|
||||||
jerry_release_value (prop_name);
|
jerry_release_value (prop_name);
|
||||||
|
|
||||||
jerry_free_property_descriptor_fields (&prop_desc);
|
jerry_property_descriptor_free (&prop_desc);
|
||||||
} /* freeze_property */
|
} /* freeze_property */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user