diff --git a/src/libecmaobjects/ecma-helpers.c b/src/libecmaobjects/ecma-helpers.c index 66523f018..2d6fe683b 100644 --- a/src/libecmaobjects/ecma-helpers.c +++ b/src/libecmaobjects/ecma-helpers.c @@ -831,6 +831,33 @@ ecma_make_empty_property_descriptor (void) return prop_desc; } /* ecma_make_empty_property_descriptor */ +/** + * Free values contained in the property descriptor + * and make it empty property descriptor + */ +void +ecma_free_property_descriptor (ecma_property_descriptor_t *prop_desc_p) /**< property descriptor */ +{ + if (prop_desc_p->is_value_defined) + { + ecma_free_value (prop_desc_p->value, true); + } + + if (prop_desc_p->is_get_defined + && prop_desc_p->get_p != NULL) + { + ecma_deref_object (prop_desc_p->get_p); + } + + if (prop_desc_p->is_set_defined + && prop_desc_p->set_p != NULL) + { + ecma_deref_object (prop_desc_p->set_p); + } + + *prop_desc_p = ecma_make_empty_property_descriptor (); +} /* ecma_free_property_descriptor */ + /** * @} * @} diff --git a/src/libecmaobjects/ecma-helpers.h b/src/libecmaobjects/ecma-helpers.h index 8d97d390f..65b43b30d 100644 --- a/src/libecmaobjects/ecma-helpers.h +++ b/src/libecmaobjects/ecma-helpers.h @@ -224,6 +224,7 @@ 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); +extern void ecma_free_property_descriptor (ecma_property_descriptor_t *prop_desc_p); /* ecma-helpers-conversion.c */ extern ecma_number_t ecma_zt_string_to_number (const ecma_char_t *str_p); diff --git a/src/libecmaoperations/ecma-conversion.c b/src/libecmaoperations/ecma-conversion.c index f8aea60be..1c1e7ce8e 100644 --- a/src/libecmaoperations/ecma-conversion.c +++ b/src/libecmaoperations/ecma-conversion.c @@ -878,30 +878,13 @@ ecma_op_to_property_descriptor (ecma_value_t obj_value, /**< object value */ if (!ecma_is_completion_value_throw (ret_value)) { JERRY_ASSERT (ecma_is_completion_value_empty (ret_value)); - - *out_prop_desc_p = prop_desc; } else { - *out_prop_desc_p = ecma_make_empty_property_descriptor (); - - if (prop_desc.is_value_defined) - { - ecma_free_value (prop_desc.value, true); - } - - if (prop_desc.is_get_defined - && prop_desc.get_p != NULL) - { - ecma_deref_object (prop_desc.get_p); - } - - if (prop_desc.is_set_defined - && prop_desc.set_p != NULL) - { - ecma_deref_object (prop_desc.set_p); - } + ecma_free_property_descriptor (&prop_desc); } + + *out_prop_desc_p = prop_desc; } return ret_value;