From b073701da47b155051c73f427c237c40feb96004 Mon Sep 17 00:00:00 2001 From: Ruben Ayrapetyan Date: Mon, 28 Jul 2014 21:54:42 +0400 Subject: [PATCH] Introducing ECMA property descriptor (8.10) type and helpers for it: constructor and destructor. --- src/libecmaobjects/ecma-globals.h | 46 +++++++++++++++- src/libecmaobjects/ecma-helpers.c | 90 +++++++++++++++++++++++++++++++ src/libecmaobjects/ecma-helpers.h | 15 ++++++ 3 files changed, 150 insertions(+), 1 deletion(-) diff --git a/src/libecmaobjects/ecma-globals.h b/src/libecmaobjects/ecma-globals.h index c58b3e61d..a416f27f9 100644 --- a/src/libecmaobjects/ecma-globals.h +++ b/src/libecmaobjects/ecma-globals.h @@ -189,7 +189,51 @@ typedef enum } ecma_property_configurable_value_t; /** - * Description of ecma-property. + * 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 */ typedef struct ecma_property_t { /** Property's type (ecma_property_type_t) */ diff --git a/src/libecmaobjects/ecma-helpers.c b/src/libecmaobjects/ecma-helpers.c index 2ffa90248..199c8f5cf 100644 --- a/src/libecmaobjects/ecma-helpers.c +++ b/src/libecmaobjects/ecma-helpers.c @@ -700,6 +700,96 @@ 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 */ + /** * @} * @} diff --git a/src/libecmaobjects/ecma-helpers.h b/src/libecmaobjects/ecma-helpers.h index 084e7cfef..7e6472c64 100644 --- a/src/libecmaobjects/ecma-helpers.h +++ b/src/libecmaobjects/ecma-helpers.h @@ -96,6 +96,21 @@ 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 */ /**