Fix ecma-property construction: perform operations that could invoke GC before linking property into an object's property list to avoid start of GC in the middle of property construction.
JerryScript-DCO-1.0-Signed-off-by: Ruben Ayrapetyan r.ayrapetyan@samsung.com
This commit is contained in:
committed by
Evgeny Gavrin
parent
713b433c42
commit
438d2c2930
@@ -511,10 +511,10 @@ ecma_create_named_data_property (ecma_object_t *obj_p, /**< object */
|
|||||||
JERRY_ASSERT (ecma_find_named_property (obj_p, name_p) == NULL);
|
JERRY_ASSERT (ecma_find_named_property (obj_p, name_p) == NULL);
|
||||||
|
|
||||||
ecma_property_t *prop_p = ecma_alloc_property ();
|
ecma_property_t *prop_p = ecma_alloc_property ();
|
||||||
|
name_p = ecma_copy_or_ref_ecma_string (name_p);
|
||||||
|
|
||||||
prop_p->type = ECMA_PROPERTY_NAMEDDATA;
|
prop_p->type = ECMA_PROPERTY_NAMEDDATA;
|
||||||
|
|
||||||
name_p = ecma_copy_or_ref_ecma_string (name_p);
|
|
||||||
ECMA_SET_NON_NULL_POINTER (prop_p->u.named_data_property.name_p, name_p);
|
ECMA_SET_NON_NULL_POINTER (prop_p->u.named_data_property.name_p, name_p);
|
||||||
|
|
||||||
prop_p->u.named_data_property.writable = is_writable ? ECMA_PROPERTY_WRITABLE : ECMA_PROPERTY_NOT_WRITABLE;
|
prop_p->u.named_data_property.writable = is_writable ? ECMA_PROPERTY_WRITABLE : ECMA_PROPERTY_NOT_WRITABLE;
|
||||||
@@ -526,12 +526,12 @@ ecma_create_named_data_property (ecma_object_t *obj_p, /**< object */
|
|||||||
|
|
||||||
ecma_set_named_data_property_value (prop_p, ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED));
|
ecma_set_named_data_property_value (prop_p, ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED));
|
||||||
|
|
||||||
ecma_lcache_invalidate (obj_p, name_p, NULL);
|
|
||||||
|
|
||||||
ecma_property_t *list_head_p = ecma_get_property_list (obj_p);
|
ecma_property_t *list_head_p = ecma_get_property_list (obj_p);
|
||||||
ECMA_SET_POINTER (prop_p->next_property_p, list_head_p);
|
ECMA_SET_POINTER (prop_p->next_property_p, list_head_p);
|
||||||
ecma_set_property_list (obj_p, prop_p);
|
ecma_set_property_list (obj_p, prop_p);
|
||||||
|
|
||||||
|
ecma_lcache_invalidate (obj_p, name_p, NULL);
|
||||||
|
|
||||||
return prop_p;
|
return prop_p;
|
||||||
} /* ecma_create_named_data_property */
|
} /* ecma_create_named_data_property */
|
||||||
|
|
||||||
@@ -552,10 +552,11 @@ ecma_create_named_accessor_property (ecma_object_t *obj_p, /**< object */
|
|||||||
JERRY_ASSERT (ecma_find_named_property (obj_p, name_p) == NULL);
|
JERRY_ASSERT (ecma_find_named_property (obj_p, name_p) == NULL);
|
||||||
|
|
||||||
ecma_property_t *prop_p = ecma_alloc_property ();
|
ecma_property_t *prop_p = ecma_alloc_property ();
|
||||||
|
ecma_getter_setter_pointers_t *getter_setter_pointers_p = ecma_alloc_getter_setter_pointers ();
|
||||||
|
name_p = ecma_copy_or_ref_ecma_string (name_p);
|
||||||
|
|
||||||
prop_p->type = ECMA_PROPERTY_NAMEDACCESSOR;
|
prop_p->type = ECMA_PROPERTY_NAMEDACCESSOR;
|
||||||
|
|
||||||
name_p = ecma_copy_or_ref_ecma_string (name_p);
|
|
||||||
ECMA_SET_NON_NULL_POINTER (prop_p->u.named_accessor_property.name_p, name_p);
|
ECMA_SET_NON_NULL_POINTER (prop_p->u.named_accessor_property.name_p, name_p);
|
||||||
|
|
||||||
prop_p->u.named_accessor_property.enumerable = (is_enumerable ?
|
prop_p->u.named_accessor_property.enumerable = (is_enumerable ?
|
||||||
@@ -565,21 +566,20 @@ ecma_create_named_accessor_property (ecma_object_t *obj_p, /**< object */
|
|||||||
|
|
||||||
prop_p->u.named_accessor_property.is_lcached = false;
|
prop_p->u.named_accessor_property.is_lcached = false;
|
||||||
|
|
||||||
ecma_lcache_invalidate (obj_p, name_p, NULL);
|
ECMA_SET_NON_NULL_POINTER (prop_p->u.named_accessor_property.getter_setter_pair_cp, getter_setter_pointers_p);
|
||||||
|
|
||||||
ecma_property_t *list_head_p = ecma_get_property_list (obj_p);
|
ecma_property_t *list_head_p = ecma_get_property_list (obj_p);
|
||||||
ECMA_SET_POINTER (prop_p->next_property_p, list_head_p);
|
ECMA_SET_POINTER (prop_p->next_property_p, list_head_p);
|
||||||
ecma_set_property_list (obj_p, prop_p);
|
ecma_set_property_list (obj_p, prop_p);
|
||||||
|
|
||||||
ecma_getter_setter_pointers_t *getter_setter_pointers_p = ecma_alloc_getter_setter_pointers ();
|
|
||||||
ECMA_SET_NON_NULL_POINTER (prop_p->u.named_accessor_property.getter_setter_pair_cp, getter_setter_pointers_p);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Should be performed after linking the property into object's property list, because the setters assert that.
|
* Should be performed after linking the property into object's property list, because the setters assert that.
|
||||||
*/
|
*/
|
||||||
ecma_set_named_accessor_property_getter (obj_p, prop_p, get_p);
|
ecma_set_named_accessor_property_getter (obj_p, prop_p, get_p);
|
||||||
ecma_set_named_accessor_property_setter (obj_p, prop_p, set_p);
|
ecma_set_named_accessor_property_setter (obj_p, prop_p, set_p);
|
||||||
|
|
||||||
|
ecma_lcache_invalidate (obj_p, name_p, NULL);
|
||||||
|
|
||||||
return prop_p;
|
return prop_p;
|
||||||
} /* ecma_create_named_accessor_property */
|
} /* ecma_create_named_accessor_property */
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user