From e25e4d6cabe0c4c36943a0618c5bba3b00aaa73c Mon Sep 17 00:00:00 2001 From: Ruben Ayrapetyan Date: Thu, 31 Jul 2014 14:03:11 +0400 Subject: [PATCH] Introducing constructor for ecma_property_descriptor_t. --- src/libecmaobjects/ecma-helpers.c | 32 +++++++++++ src/libecmaobjects/ecma-helpers.h | 4 +- src/libecmaoperations/ecma-function-object.c | 53 ++++++++----------- .../ecma-objects-properties.c | 51 ++++++------------ 4 files changed, 73 insertions(+), 67 deletions(-) diff --git a/src/libecmaobjects/ecma-helpers.c b/src/libecmaobjects/ecma-helpers.c index be6c2ddc5..0baa3e422 100644 --- a/src/libecmaobjects/ecma-helpers.c +++ b/src/libecmaobjects/ecma-helpers.c @@ -742,6 +742,38 @@ ecma_free_array( ecma_array_first_chunk_t *first_chunk_p) /**< first chunk of th } } /* ecma_free_array */ +/** + * Construct empty property descriptor. + * + * @return property descriptor with all *_defined properties set to false, + * and rest properties set to default values (ECMA-262 v5, Table 7). + */ +ecma_property_descriptor_t +ecma_make_empty_property_descriptor( void) +{ + ecma_property_descriptor_t prop_desc = (ecma_property_descriptor_t) { + .is_value_defined = false, + .value = ecma_make_simple_value( ECMA_SIMPLE_VALUE_UNDEFINED), + + .is_writable_defined = false, + .writable = ECMA_PROPERTY_NOT_WRITABLE, + + .is_enumerable_defined = false, + .enumerable = ECMA_PROPERTY_NOT_ENUMERABLE, + + .is_configurable_defined = false, + .configurable = ECMA_PROPERTY_NOT_CONFIGURABLE, + + .is_get_defined = false, + .get_p = NULL, + + .is_set_defined = false, + .set_p = NULL + }; + + return prop_desc; +} /* ecma_make_empty_property_descriptor */ + /** * @} * @} diff --git a/src/libecmaobjects/ecma-helpers.h b/src/libecmaobjects/ecma-helpers.h index c43e083da..6ae240462 100644 --- a/src/libecmaobjects/ecma-helpers.h +++ b/src/libecmaobjects/ecma-helpers.h @@ -69,10 +69,10 @@ extern bool ecma_is_completion_value_normal_true( ecma_completion_value_t value) extern bool ecma_is_completion_value_normal_false( ecma_completion_value_t value); extern bool ecma_is_empty_completion_value( ecma_completion_value_t value); +/* ecma-helpers.c */ extern ecma_object_t* ecma_create_object( ecma_object_t *prototype_object_p, bool is_extensible, ecma_object_type_t type); extern ecma_object_t* ecma_create_lexical_environment( ecma_object_t *outer_lexical_environment_p, ecma_lexical_environment_type_t type); -/* ecma-helpers.c */ extern ecma_property_t* ecma_create_internal_property(ecma_object_t *object_p, ecma_internal_property_id_t property_id); 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); @@ -97,6 +97,8 @@ 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_empty_property_descriptor( void); + #endif /* !JERRY_ECMA_HELPERS_H */ /** diff --git a/src/libecmaoperations/ecma-function-object.c b/src/libecmaoperations/ecma-function-object.c index ba0cc4d73..3f9bed09f 100644 --- a/src/libecmaoperations/ecma-function-object.c +++ b/src/libecmaoperations/ecma-function-object.c @@ -153,25 +153,21 @@ ecma_op_create_function_object( const ecma_char_t* formal_parameter_list_p[], /* // 17. ecma_ref_object( f); - ecma_property_descriptor_t prop_desc = (ecma_property_descriptor_t) { - .is_value_defined = true, - .value = ecma_make_object_value( f), + ecma_property_descriptor_t prop_desc = ecma_make_empty_property_descriptor(); + { + prop_desc.is_value_defined = true; + prop_desc.value = ecma_make_object_value( f); - .is_writable_defined = true, - .writable = ECMA_PROPERTY_WRITABLE, + prop_desc.is_writable_defined = true; + prop_desc.writable = ECMA_PROPERTY_WRITABLE; - .is_enumerable_defined = true, - .enumerable = ECMA_PROPERTY_NOT_ENUMERABLE, + prop_desc.is_enumerable_defined = true; + prop_desc.enumerable = ECMA_PROPERTY_NOT_ENUMERABLE; - .is_configurable_defined = true, - .configurable = ECMA_PROPERTY_CONFIGURABLE, + prop_desc.is_configurable_defined = true; + prop_desc.configurable = ECMA_PROPERTY_CONFIGURABLE; + } - .is_get_defined = false, - .get_p = NULL, - - .is_set_defined = false, - .set_p = NULL - }; ecma_op_object_define_own_property( proto_p, ecma_get_magic_string( ECMA_MAGIC_STRING_CONSTRUCTOR), prop_desc, @@ -194,25 +190,20 @@ ecma_op_create_function_object( const ecma_char_t* formal_parameter_list_p[], /* { ecma_object_t *thrower_p = ecma_op_get_throw_type_error(); - prop_desc = (ecma_property_descriptor_t) { - .is_value_defined = false, - .value = ecma_make_simple_value( ECMA_SIMPLE_VALUE_UNDEFINED), + prop_desc = ecma_make_empty_property_descriptor(); + { + prop_desc.is_enumerable_defined = true; + prop_desc.enumerable = ECMA_PROPERTY_NOT_ENUMERABLE; - .is_writable_defined = false, - .writable = ECMA_PROPERTY_NOT_WRITABLE, + prop_desc.is_configurable_defined = true; + prop_desc.configurable = ECMA_PROPERTY_NOT_CONFIGURABLE; - .is_enumerable_defined = true, - .enumerable = ECMA_PROPERTY_NOT_ENUMERABLE, + prop_desc.is_get_defined = true; + prop_desc.get_p = thrower_p; - .is_configurable_defined = true, - .configurable = ECMA_PROPERTY_NOT_CONFIGURABLE, - - .is_get_defined = true, - .get_p = thrower_p, - - .is_set_defined = true, - .set_p = thrower_p - }; + prop_desc.is_set_defined = true; + prop_desc.set_p = thrower_p; + } ecma_op_object_define_own_property( f, ecma_get_magic_string( ECMA_MAGIC_STRING_CALLER), diff --git a/src/libecmaoperations/ecma-objects-properties.c b/src/libecmaoperations/ecma-objects-properties.c index 9d418b6fc..ec62d23ff 100644 --- a/src/libecmaoperations/ecma-objects-properties.c +++ b/src/libecmaoperations/ecma-objects-properties.c @@ -196,25 +196,11 @@ ecma_op_object_put( ecma_object_t *obj_p, /**< the object */ if ( own_desc_p->type == ECMA_PROPERTY_NAMEDDATA ) { // a. - ecma_property_descriptor_t value_desc = (ecma_property_descriptor_t) { - .is_value_defined = true, - .value = value, - - .is_get_defined = false, - .get_p = NULL, - - .is_set_defined = false, - .set_p = NULL, - - .is_writable_defined = false, - .writable = ECMA_PROPERTY_NOT_WRITABLE, - - .is_enumerable_defined = false, - .enumerable = ECMA_PROPERTY_NOT_ENUMERABLE, - - .is_configurable_defined = false, - .configurable = ECMA_PROPERTY_NOT_CONFIGURABLE, - }; + ecma_property_descriptor_t value_desc = ecma_make_empty_property_descriptor(); + { + value_desc.is_value_defined = true; + value_desc.value = value; + } // b., c. return ecma_op_object_define_own_property( obj_p, @@ -245,26 +231,21 @@ ecma_op_object_put( ecma_object_t *obj_p, /**< the object */ // 6. // a. - ecma_property_descriptor_t new_desc = (ecma_property_descriptor_t) { - .is_value_defined = true, - .value = value, + ecma_property_descriptor_t new_desc = ecma_make_empty_property_descriptor(); + { + new_desc.is_value_defined = true; + new_desc.value = value; - .is_get_defined = false, - .get_p = NULL, + new_desc.is_writable_defined = true; + new_desc.writable = ECMA_PROPERTY_WRITABLE; - .is_set_defined = false, - .set_p = NULL, + new_desc.is_enumerable_defined = true; + new_desc.enumerable = ECMA_PROPERTY_ENUMERABLE; - .is_writable_defined = true, - .writable = ECMA_PROPERTY_WRITABLE, + new_desc.is_configurable_defined = true; + new_desc.configurable = ECMA_PROPERTY_CONFIGURABLE; + } - .is_enumerable_defined = true, - .enumerable = ECMA_PROPERTY_ENUMERABLE, - - .is_configurable_defined = true, - .configurable = ECMA_PROPERTY_CONFIGURABLE - }; - // b. return ecma_op_object_define_own_property( obj_p, property_name_p,