From 21a84afc4f494d89d6ccd7379d2e95862832ea58 Mon Sep 17 00:00:00 2001 From: Ruben Ayrapetyan Date: Fri, 15 Aug 2014 17:22:29 +0400 Subject: [PATCH] Adding ecma_is_property_enumerable, ecma_is_property_configurable helpers. --- src/libecmaobjects/ecma-helpers.c | 46 ++++++++++++++++++-- src/libecmaobjects/ecma-helpers.h | 3 ++ src/libecmaoperations/ecma-objects-general.c | 12 ++--- 3 files changed, 52 insertions(+), 9 deletions(-) diff --git a/src/libecmaobjects/ecma-helpers.c b/src/libecmaobjects/ecma-helpers.c index 49cdef0e8..cbcb8c4bb 100644 --- a/src/libecmaobjects/ecma-helpers.c +++ b/src/libecmaobjects/ecma-helpers.c @@ -492,10 +492,50 @@ ecma_delete_property (ecma_object_t *obj_p, /**< object */ } /* ecma_delete_property */ /** - * Construct empty property descriptor. + * Get property's 'Enumerable' attribute value * - * @return property descriptor with all *_defined properties set to false, - * and rest properties set to default values (ECMA-262 v5, Table 7). + * @return true - property is enumerable, + * false - otherwise. + */ +bool +ecma_is_property_enumerable (ecma_property_t* prop_p) /**< property */ +{ + if (prop_p->type == ECMA_PROPERTY_NAMEDDATA) + { + return (prop_p->u.named_data_property.enumerable == ECMA_PROPERTY_ENUMERABLE); + } + else + { + JERRY_ASSERT (prop_p->type == ECMA_PROPERTY_NAMEDACCESSOR); + + return (prop_p->u.named_accessor_property.enumerable == ECMA_PROPERTY_ENUMERABLE); + } +} /* ecma_is_property_enumerable */ + +/** + * Get property's 'Configurable' attribute value + * + * @return true - property is configurable, + * false - otherwise. + */ +bool +ecma_is_property_configurable (ecma_property_t* prop_p) /**< property */ +{ + if (prop_p->type == ECMA_PROPERTY_NAMEDDATA) + { + return (prop_p->u.named_data_property.configurable == ECMA_PROPERTY_CONFIGURABLE); + } + else + { + JERRY_ASSERT (prop_p->type == ECMA_PROPERTY_NAMEDACCESSOR); + + return (prop_p->u.named_accessor_property.configurable == ECMA_PROPERTY_CONFIGURABLE); + } +} /* ecma_is_property_configurable */ + +/** + * Construct empty property descriptor, i.e.: + * property descriptor with all is_defined flags set to false and the rest - to default value. */ ecma_property_descriptor_t ecma_make_empty_property_descriptor (void) diff --git a/src/libecmaobjects/ecma-helpers.h b/src/libecmaobjects/ecma-helpers.h index e0ce63392..33f378b88 100644 --- a/src/libecmaobjects/ecma-helpers.h +++ b/src/libecmaobjects/ecma-helpers.h @@ -167,6 +167,9 @@ extern void ecma_free_property (ecma_property_t *prop_p); extern void ecma_delete_property (ecma_object_t *obj_p, ecma_property_t *prop_p); +extern bool ecma_is_property_enumerable (ecma_property_t* prop_p); +extern bool ecma_is_property_configurable (ecma_property_t* prop_p); + extern ecma_property_descriptor_t ecma_make_empty_property_descriptor (void); #endif /* !JERRY_ECMA_HELPERS_H */ diff --git a/src/libecmaoperations/ecma-objects-general.c b/src/libecmaoperations/ecma-objects-general.c index 0d5965eee..966353d01 100644 --- a/src/libecmaoperations/ecma-objects-general.c +++ b/src/libecmaoperations/ecma-objects-general.c @@ -555,12 +555,12 @@ ecma_op_general_object_define_own_property (ecma_object_t *obj_p, /**< the objec const bool is_current_data_descriptor = (current_p->type == ECMA_PROPERTY_NAMEDDATA); const bool is_current_accessor_descriptor = (current_p->type == ECMA_PROPERTY_NAMEDACCESSOR); - const ecma_property_enumerable_value_t current_enumerable = (is_current_data_descriptor ? - current_p->u.named_data_property.enumerable - : current_p->u.named_accessor_property.enumerable); - const ecma_property_configurable_value_t current_configurable = (is_current_data_descriptor ? - current_p->u.named_data_property.configurable - : current_p->u.named_accessor_property.configurable); + const ecma_property_enumerable_value_t current_enumerable = (ecma_is_property_enumerable (current_p) ? + ECMA_PROPERTY_ENUMERABLE : + ECMA_PROPERTY_NOT_ENUMERABLE); + const ecma_property_configurable_value_t current_configurable = (ecma_is_property_configurable (current_p) ? + ECMA_PROPERTY_CONFIGURABLE : + ECMA_PROPERTY_NOT_CONFIGURABLE); JERRY_ASSERT(is_current_data_descriptor || is_current_accessor_descriptor);