Implementation of general objects' [[GetOwnProperty]], [[GetProperty]], [[CanPut]], [[HasProperty]], [[Delete]]; partial implementation of general objects' [[Get]], [[Put]], [[DefineOwnProperty]].

This commit is contained in:
Ruben Ayrapetyan
2014-07-29 14:32:01 +04:00
parent 5aaa853b9f
commit 299c94ee85
8 changed files with 681 additions and 193 deletions
+48 -44
View File
@@ -188,50 +188,6 @@ typedef enum
ECMA_PROPERTY_CONFIGURABLE /**< property's 'Configurable' attribute is true */
} ecma_property_configurable_value_t;
/**
* Description of ECMA property descriptor
*
* See also: ECMA-262 v5, 8.10.
*/
typedef struct
{
/** Is [[Value]] defined? */
unsigned int is_value_defined : 1;
/** Is [[Get]] defined? */
unsigned int is_get_defined : 1;
/** Is [[Set]] defined? */
unsigned int is_set_defined : 1;
/** Is [[Writable]] defined? */
unsigned int is_writable_defined : 1;
/** Is [[Enumerable]] defined? */
unsigned int is_enumerable_defined : 1;
/** Is [[Configurable]] defined? */
unsigned int is_configurable_defined : 1;
/** [[Value]] */
ecma_value_t value;
/** [[Get]] */
ecma_value_t get;
/** [[Set]] */
ecma_value_t set;
/** [[Writable]] */
ecma_property_writable_value_t writable;
/** [[Enumerable]] */
ecma_property_enumerable_value_t enumerable;
/** [[Configurable]] */
ecma_property_configurable_value_t configurable;
} ecma_property_descriptor_t;
/**
* Description of ecma-property
*/
@@ -393,6 +349,54 @@ typedef struct ecma_object_t {
ecma_gc_info_t GCInfo;
} __packed ecma_object_t;
/**
* Description of ECMA property descriptor
*
* See also: ECMA-262 v5, 8.10.
*
* Note:
* If a component of descriptor is undefined then corresponding
* field should contain it's default value.
*/
typedef struct
{
/** Is [[Value]] defined? */
unsigned int is_value_defined : 1;
/** Is [[Get]] defined? */
unsigned int is_get_defined : 1;
/** Is [[Set]] defined? */
unsigned int is_set_defined : 1;
/** Is [[Writable]] defined? */
unsigned int is_writable_defined : 1;
/** Is [[Enumerable]] defined? */
unsigned int is_enumerable_defined : 1;
/** Is [[Configurable]] defined? */
unsigned int is_configurable_defined : 1;
/** [[Value]] */
ecma_value_t value;
/** [[Get]] */
ecma_object_t* get_p;
/** [[Set]] */
ecma_object_t* set_p;
/** [[Writable]] */
ecma_property_writable_value_t writable;
/** [[Enumerable]] */
ecma_property_enumerable_value_t enumerable;
/** [[Configurable]] */
ecma_property_configurable_value_t configurable;
} ecma_property_descriptor_t;
/**
* Description of an ecma-character
*/
+39 -96
View File
@@ -208,11 +208,11 @@ ecma_get_internal_property(ecma_object_t *object_p, /**< object descriptor */
* @return pointer to newly created property
*/
ecma_property_t*
ecma_create_named_property(ecma_object_t *obj_p, /**< object */
ecma_char_t *name_p, /**< property name */
ecma_property_writable_value_t writable, /**< 'writable' attribute */
ecma_property_enumerable_value_t enumerable, /**< 'enumerable' attribute */
ecma_property_configurable_value_t configurable) /**< 'configurable' attribute */
ecma_create_named_data_property(ecma_object_t *obj_p, /**< object */
ecma_char_t *name_p, /**< property name */
ecma_property_writable_value_t writable, /**< 'writable' attribute */
ecma_property_enumerable_value_t enumerable, /**< 'enumerable' attribute */
ecma_property_configurable_value_t configurable) /**< 'configurable' attribute */
{
JERRY_ASSERT( obj_p != NULL && name_p != NULL );
@@ -232,7 +232,40 @@ ecma_create_named_property(ecma_object_t *obj_p, /**< object */
ecma_set_pointer( obj_p->properties_p, prop);
return prop;
} /* ecma_create_named_property */
} /* ecma_create_named_data_property */
/**
* Create named accessor property with given name, attributes, getter and setter.
*
* @return pointer to newly created property
*/
ecma_property_t*
ecma_create_named_accessor_property(ecma_object_t *obj_p, /**< object */
ecma_char_t *name_p, /**< property name */
ecma_object_t *get_p, /**< getter */
ecma_object_t *set_p, /**< setter */
ecma_property_enumerable_value_t enumerable, /**< 'enumerable' attribute */
ecma_property_configurable_value_t configurable) /**< 'configurable' attribute */
{
JERRY_ASSERT( obj_p != NULL && name_p != NULL );
ecma_property_t *prop_p = ecma_alloc_property();
prop_p->type = ECMA_PROPERTY_NAMEDACCESSOR;
ecma_set_pointer( prop_p->u.named_accessor_property.name_p, ecma_new_ecma_string( name_p));
ecma_set_pointer( prop_p->u.named_accessor_property.get_p, get_p);
ecma_set_pointer( prop_p->u.named_accessor_property.set_p, set_p);
prop_p->u.named_accessor_property.enumerable = enumerable;
prop_p->u.named_accessor_property.configurable = configurable;
ecma_set_pointer( prop_p->next_property_p, ecma_get_pointer( obj_p->properties_p));
ecma_set_pointer( obj_p->properties_p, prop_p);
return prop_p;
} /* ecma_create_named_accessor_property */
/**
* Find named data property or named access property in specified object.
@@ -700,96 +733,6 @@ ecma_free_array( ecma_array_first_chunk_t *first_chunk_p) /**< first chunk of th
}
} /* ecma_free_array */
/**
* ECMA property descriptor constructor.
*
* @return ecma property descriptor
*/
ecma_property_descriptor_t
ecma_make_property_descriptor( bool is_value_defined, /**< is [[Value]] defined */
bool is_get_defined, /**< is [[Get]] defined */
bool is_set_defined, /**< is [[Set]] defined */
bool is_writable_defined, /**< is [[Writable]] defined */
bool is_enumerable_defined, /**< is [[Enumerable]] defined */
bool is_configurable_defined, /**< is [[Configurable]] defined */
ecma_value_t value, /**< [[Value]] */
ecma_value_t get, /**< [[Get]] */
ecma_value_t set, /**< [[Set]] */
ecma_property_writable_value_t writable, /**< [[Writable]] */
ecma_property_enumerable_value_t enumerable, /**< [[Enumerable]] */
ecma_property_configurable_value_t configurable) /**< [[Configurable]] */
{
ecma_property_descriptor_t prop_desc;
prop_desc.is_value_defined = is_value_defined;
prop_desc.is_get_defined = is_get_defined;
prop_desc.is_set_defined = is_set_defined;
prop_desc.is_writable_defined = is_writable_defined;
prop_desc.is_enumerable_defined = is_enumerable_defined;
prop_desc.is_configurable_defined = is_configurable_defined;
if ( prop_desc.is_value_defined )
{
prop_desc.value = value;
}
if ( prop_desc.is_get_defined )
{
prop_desc.get = get;
}
if ( prop_desc.is_set_defined )
{
prop_desc.set = set;
}
if ( prop_desc.is_writable_defined )
{
prop_desc.writable = writable;
}
if ( prop_desc.is_enumerable_defined )
{
prop_desc.enumerable = enumerable;
}
if ( prop_desc.is_configurable_defined )
{
prop_desc.configurable = configurable;
}
return prop_desc;
} /* ecma_make_property_descriptor */
/**
* Free the ecma property descriptor.
*/
void
ecma_free_property_descriptor( ecma_property_descriptor_t prop_desc) /**< ECMA property descriptor */
{
if ( prop_desc.is_value_defined )
{
ecma_free_value( prop_desc.value);
}
if ( prop_desc.is_get_defined )
{
ecma_free_value( prop_desc.get);
}
if ( prop_desc.is_set_defined )
{
ecma_free_value( prop_desc.set);
}
prop_desc.is_value_defined = false;
prop_desc.is_get_defined = false;
prop_desc.is_set_defined = false;
prop_desc.is_writable_defined = false;
prop_desc.is_enumerable_defined = false;
prop_desc.is_configurable_defined = false;
} /* ecma_free_property_descriptor */
/**
* @}
* @}
+2 -16
View File
@@ -77,7 +77,8 @@ extern ecma_property_t* ecma_create_internal_property(ecma_object_t *object_p, e
extern ecma_property_t* ecma_find_internal_property(ecma_object_t *object_p, ecma_internal_property_id_t property_id);
extern ecma_property_t* ecma_get_internal_property(ecma_object_t *object_p, ecma_internal_property_id_t property_id);
extern ecma_property_t *ecma_create_named_property(ecma_object_t *obj_p, ecma_char_t *name_p, ecma_property_writable_value_t writable, ecma_property_enumerable_value_t enumerable, ecma_property_configurable_value_t configurable);
extern ecma_property_t *ecma_create_named_data_property(ecma_object_t *obj_p, ecma_char_t *name_p, ecma_property_writable_value_t writable, ecma_property_enumerable_value_t enumerable, ecma_property_configurable_value_t configurable);
extern ecma_property_t *ecma_create_named_accessor_property(ecma_object_t *obj_p, ecma_char_t *name_p, ecma_object_t *get_p, ecma_object_t *set_p, ecma_property_enumerable_value_t enumerable, ecma_property_configurable_value_t configurable);
extern ecma_property_t *ecma_find_named_property(ecma_object_t *obj_p, ecma_char_t *name_p);
extern ecma_property_t *ecma_get_named_property(ecma_object_t *obj_p, ecma_char_t *name_p);
extern ecma_property_t *ecma_get_named_data_property(ecma_object_t *obj_p, ecma_char_t *name_p);
@@ -96,21 +97,6 @@ extern bool ecma_compare_zt_string_to_ecma_string( const ecma_char_t *string_p,
extern bool ecma_compare_ecma_string_to_ecma_string(const ecma_array_first_chunk_t *string1_p, const ecma_array_first_chunk_t *string2_p);
extern void ecma_free_array( ecma_array_first_chunk_t *first_chunk_p);
extern ecma_property_descriptor_t ecma_make_property_descriptor( bool is_value_defined,
bool is_get_defined,
bool is_set_defined,
bool is_writable_defined,
bool is_enumerable_defined,
bool is_configurable_defined,
ecma_value_t value,
ecma_value_t get,
ecma_value_t set,
ecma_property_writable_value_t writable,
ecma_property_enumerable_value_t enumerable,
ecma_property_configurable_value_t configurable);
extern void ecma_free_property_descriptor( ecma_property_descriptor_t prop_desc);
#endif /* !JERRY_ECMA_HELPERS_H */
/**