Skip to content

Commit 1384496

Browse files
Fix ecma-property construction: perform memory allocations 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
1 parent 507411f commit 1384496

File tree

1 file changed

+8
-8
lines changed

1 file changed

+8
-8
lines changed

jerry-core/ecma/base/ecma-helpers.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -511,10 +511,10 @@ ecma_create_named_data_property (ecma_object_t *obj_p, /**< object */
511511
JERRY_ASSERT (ecma_find_named_property (obj_p, name_p) == NULL);
512512

513513
ecma_property_t *prop_p = ecma_alloc_property ();
514+
name_p = ecma_copy_or_ref_ecma_string (name_p);
514515

515516
prop_p->type = ECMA_PROPERTY_NAMEDDATA;
516517

517-
name_p = ecma_copy_or_ref_ecma_string (name_p);
518518
ECMA_SET_NON_NULL_POINTER (prop_p->u.named_data_property.name_p, name_p);
519519

520520
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 */
526526

527527
ecma_set_named_data_property_value (prop_p, ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED));
528528

529-
ecma_lcache_invalidate (obj_p, name_p, NULL);
530-
531529
ecma_property_t *list_head_p = ecma_get_property_list (obj_p);
532530
ECMA_SET_POINTER (prop_p->next_property_p, list_head_p);
533531
ecma_set_property_list (obj_p, prop_p);
534532

533+
ecma_lcache_invalidate (obj_p, name_p, NULL);
534+
535535
return prop_p;
536536
} /* ecma_create_named_data_property */
537537

@@ -552,10 +552,11 @@ ecma_create_named_accessor_property (ecma_object_t *obj_p, /**< object */
552552
JERRY_ASSERT (ecma_find_named_property (obj_p, name_p) == NULL);
553553

554554
ecma_property_t *prop_p = ecma_alloc_property ();
555+
ecma_getter_setter_pointers_t *getter_setter_pointers_p = ecma_alloc_getter_setter_pointers ();
556+
name_p = ecma_copy_or_ref_ecma_string (name_p);
555557

556558
prop_p->type = ECMA_PROPERTY_NAMEDACCESSOR;
557559

558-
name_p = ecma_copy_or_ref_ecma_string (name_p);
559560
ECMA_SET_NON_NULL_POINTER (prop_p->u.named_accessor_property.name_p, name_p);
560561

561562
prop_p->u.named_accessor_property.enumerable = (is_enumerable ?
@@ -565,21 +566,20 @@ ecma_create_named_accessor_property (ecma_object_t *obj_p, /**< object */
565566

566567
prop_p->u.named_accessor_property.is_lcached = false;
567568

568-
ecma_lcache_invalidate (obj_p, name_p, NULL);
569+
ECMA_SET_NON_NULL_POINTER (prop_p->u.named_accessor_property.getter_setter_pair_cp, getter_setter_pointers_p);
569570

570571
ecma_property_t *list_head_p = ecma_get_property_list (obj_p);
571572
ECMA_SET_POINTER (prop_p->next_property_p, list_head_p);
572573
ecma_set_property_list (obj_p, prop_p);
573574

574-
ecma_getter_setter_pointers_t *getter_setter_pointers_p = ecma_alloc_getter_setter_pointers ();
575-
ECMA_SET_NON_NULL_POINTER (prop_p->u.named_accessor_property.getter_setter_pair_cp, getter_setter_pointers_p);
576-
577575
/*
578576
* Should be performed after linking the property into object's property list, because the setters assert that.
579577
*/
580578
ecma_set_named_accessor_property_getter (obj_p, prop_p, get_p);
581579
ecma_set_named_accessor_property_setter (obj_p, prop_p, set_p);
582580

581+
ecma_lcache_invalidate (obj_p, name_p, NULL);
582+
583583
return prop_p;
584584
} /* ecma_create_named_accessor_property */
585585

0 commit comments

Comments
 (0)