Implementation of general objects' [[GetOwnProperty]], [[GetProperty]], [[CanPut]], [[HasProperty]], [[Delete]]; partial implementation of general objects' [[Get]], [[Put]], [[DefineOwnProperty]].
This commit is contained in:
@@ -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
|
||||
*/
|
||||
|
||||
@@ -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 */
|
||||
|
||||
/**
|
||||
* @}
|
||||
* @}
|
||||
|
||||
@@ -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 */
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user