diff --git a/jerry-core/ecma/base/ecma-alloc.cpp b/jerry-core/ecma/base/ecma-alloc.cpp index fe3c7c096..33995c82b 100644 --- a/jerry-core/ecma/base/ecma-alloc.cpp +++ b/jerry-core/ecma/base/ecma-alloc.cpp @@ -32,6 +32,7 @@ JERRY_STATIC_ASSERT (sizeof (ecma_collection_chunk_t) == sizeof (uint64_t)); JERRY_STATIC_ASSERT (sizeof (ecma_string_t) == sizeof (uint64_t)); JERRY_STATIC_ASSERT (sizeof (ecma_completion_value_t) == sizeof (uint32_t)); JERRY_STATIC_ASSERT (sizeof (ecma_label_descriptor_t) == sizeof (uint64_t)); +JERRY_STATIC_ASSERT (sizeof (ecma_getter_setter_pointers_t) <= sizeof (uint64_t)); /** \addtogroup ecma ECMA * @{ @@ -88,6 +89,7 @@ DECLARE_ROUTINES_FOR (collection_header) DECLARE_ROUTINES_FOR (collection_chunk) DECLARE_ROUTINES_FOR (string) DECLARE_ROUTINES_FOR (label_descriptor) +DECLARE_ROUTINES_FOR (getter_setter_pointers) /** * @} diff --git a/jerry-core/ecma/base/ecma-alloc.h b/jerry-core/ecma/base/ecma-alloc.h index 0c765debe..43a76a964 100644 --- a/jerry-core/ecma/base/ecma-alloc.h +++ b/jerry-core/ecma/base/ecma-alloc.h @@ -109,6 +109,19 @@ extern ecma_label_descriptor_t *ecma_alloc_label_descriptor (void); */ extern void ecma_dealloc_label_descriptor (ecma_label_descriptor_t *label_desc_p); +/** + * Allocate memory for getter-setter pointer pair + * + * @return pointer to allocated memory + */ +extern ecma_getter_setter_pointers_t *ecma_alloc_getter_setter_pointers (void); + +/** + * Dealloc memory from getter-setter pointer pair + */ +extern void ecma_dealloc_getter_setter_pointers (ecma_getter_setter_pointers_t *pointer_pair_p); + + #endif /* JERRY_ECMA_ALLOC_H */ /** diff --git a/jerry-core/ecma/base/ecma-globals.h b/jerry-core/ecma/base/ecma-globals.h index 47d1ae29f..be58aa84d 100644 --- a/jerry-core/ecma/base/ecma-globals.h +++ b/jerry-core/ecma/base/ecma-globals.h @@ -269,6 +269,15 @@ typedef enum */ #define ECMA_PROPERTY_INTERNAL_PROPERTY_TYPE_WIDTH (5) +/** + * Pair of pointers - to property's getter and setter + */ +typedef struct +{ + uintptr_t getter_p : ECMA_POINTER_FIELD_WIDTH; /**< pointer to getter object */ + uintptr_t setter_p : ECMA_POINTER_FIELD_WIDTH; /**< pointer to setter object */ +} ecma_getter_setter_pointers_t; + /** * Description of ecma-property */ @@ -320,11 +329,8 @@ typedef struct ecma_property_t /** Flag indicating whether the property is registered in LCache */ unsigned int is_lcached : 1; - /** Compressed pointer to property's getter */ - unsigned int get_p : ECMA_POINTER_FIELD_WIDTH; - - /** Compressed pointer to property's setter */ - unsigned int set_p : ECMA_POINTER_FIELD_WIDTH; + /** Compressed pointer to pair of pointers - to property's getter and setter */ + unsigned int getter_setter_pair_cp : ECMA_POINTER_FIELD_WIDTH; } named_accessor_property; /** Description of internal property */ diff --git a/jerry-core/ecma/base/ecma-helpers.cpp b/jerry-core/ecma/base/ecma-helpers.cpp index 3972b5dd6..e48582838 100644 --- a/jerry-core/ecma/base/ecma-helpers.cpp +++ b/jerry-core/ecma/base/ecma-helpers.cpp @@ -571,6 +571,9 @@ ecma_create_named_accessor_property (ecma_object_t *obj_p, /**< object */ ECMA_SET_POINTER(prop_p->next_property_p, list_head_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. */ @@ -716,6 +719,10 @@ ecma_free_named_accessor_property (ecma_object_t *object_p, /**< object the prop ecma_deref_ecma_string (ECMA_GET_NON_NULL_POINTER (ecma_string_t, property_p->u.named_accessor_property.name_p)); + ecma_getter_setter_pointers_t *getter_setter_pointers_p; + getter_setter_pointers_p = ECMA_GET_NON_NULL_POINTER (ecma_getter_setter_pointers_t, + property_p->u.named_accessor_property.getter_setter_pair_cp); + ecma_dealloc_getter_setter_pointers (getter_setter_pointers_p); ecma_dealloc_property (property_p); } /* ecma_free_named_accessor_property */ @@ -959,7 +966,11 @@ ecma_get_named_accessor_property_getter (const ecma_property_t *prop_p) /**< nam { JERRY_ASSERT (prop_p->type == ECMA_PROPERTY_NAMEDACCESSOR); - return ECMA_GET_POINTER (ecma_object_t, prop_p->u.named_accessor_property.get_p); + ecma_getter_setter_pointers_t *getter_setter_pointers_p; + getter_setter_pointers_p = ECMA_GET_POINTER (ecma_getter_setter_pointers_t, + prop_p->u.named_accessor_property.getter_setter_pair_cp); + + return ECMA_GET_POINTER (ecma_object_t, getter_setter_pointers_p->getter_p); } /* ecma_named_accessor_property_get_getter */ /** @@ -972,7 +983,11 @@ ecma_get_named_accessor_property_setter (const ecma_property_t *prop_p) /**< nam { JERRY_ASSERT (prop_p->type == ECMA_PROPERTY_NAMEDACCESSOR); - return ECMA_GET_POINTER (ecma_object_t, prop_p->u.named_accessor_property.set_p); + ecma_getter_setter_pointers_t *getter_setter_pointers_p; + getter_setter_pointers_p = ECMA_GET_POINTER (ecma_getter_setter_pointers_t, + prop_p->u.named_accessor_property.getter_setter_pair_cp); + + return ECMA_GET_POINTER (ecma_object_t, getter_setter_pointers_p->setter_p); } /* ecma_named_accessor_property_get_setter */ /** @@ -986,7 +1001,11 @@ ecma_set_named_accessor_property_getter (ecma_object_t* object_p, /**< the prope JERRY_ASSERT (prop_p->type == ECMA_PROPERTY_NAMEDACCESSOR); ecma_assert_object_contains_the_property (object_p, prop_p); - ECMA_SET_POINTER (prop_p->u.named_accessor_property.get_p, getter_p); + ecma_getter_setter_pointers_t *getter_setter_pointers_p; + getter_setter_pointers_p = ECMA_GET_POINTER (ecma_getter_setter_pointers_t, + prop_p->u.named_accessor_property.getter_setter_pair_cp); + + ECMA_SET_POINTER (getter_setter_pointers_p->getter_p, getter_p); } /* ecma_named_accessor_property_set_getter */ /** @@ -1000,7 +1019,11 @@ ecma_set_named_accessor_property_setter (ecma_object_t* object_p, /**< the prope JERRY_ASSERT (prop_p->type == ECMA_PROPERTY_NAMEDACCESSOR); ecma_assert_object_contains_the_property (object_p, prop_p); - ECMA_SET_POINTER (prop_p->u.named_accessor_property.set_p, setter_p); + ecma_getter_setter_pointers_t *getter_setter_pointers_p; + getter_setter_pointers_p = ECMA_GET_POINTER (ecma_getter_setter_pointers_t, + prop_p->u.named_accessor_property.getter_setter_pair_cp); + + ECMA_SET_POINTER (getter_setter_pointers_p->setter_p, setter_p); } /* ecma_named_accessor_property_set_setter */ /**