mirror of
https://github.com/jerryscript-project/jerryscript.git
synced 2025-12-15 16:29:21 +00:00
Storing named accessor property's pointer to getter and setter objects in separate pool chunk.
This commit is contained in:
parent
bb18970151
commit
d0c62bb507
@ -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_string_t) == sizeof (uint64_t));
|
||||||
JERRY_STATIC_ASSERT (sizeof (ecma_completion_value_t) == sizeof (uint32_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_label_descriptor_t) == sizeof (uint64_t));
|
||||||
|
JERRY_STATIC_ASSERT (sizeof (ecma_getter_setter_pointers_t) <= sizeof (uint64_t));
|
||||||
|
|
||||||
/** \addtogroup ecma ECMA
|
/** \addtogroup ecma ECMA
|
||||||
* @{
|
* @{
|
||||||
@ -88,6 +89,7 @@ DECLARE_ROUTINES_FOR (collection_header)
|
|||||||
DECLARE_ROUTINES_FOR (collection_chunk)
|
DECLARE_ROUTINES_FOR (collection_chunk)
|
||||||
DECLARE_ROUTINES_FOR (string)
|
DECLARE_ROUTINES_FOR (string)
|
||||||
DECLARE_ROUTINES_FOR (label_descriptor)
|
DECLARE_ROUTINES_FOR (label_descriptor)
|
||||||
|
DECLARE_ROUTINES_FOR (getter_setter_pointers)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
|
|||||||
@ -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);
|
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 */
|
#endif /* JERRY_ECMA_ALLOC_H */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -269,6 +269,15 @@ typedef enum
|
|||||||
*/
|
*/
|
||||||
#define ECMA_PROPERTY_INTERNAL_PROPERTY_TYPE_WIDTH (5)
|
#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
|
* Description of ecma-property
|
||||||
*/
|
*/
|
||||||
@ -320,11 +329,8 @@ typedef struct ecma_property_t
|
|||||||
/** Flag indicating whether the property is registered in LCache */
|
/** Flag indicating whether the property is registered in LCache */
|
||||||
unsigned int is_lcached : 1;
|
unsigned int is_lcached : 1;
|
||||||
|
|
||||||
/** Compressed pointer to property's getter */
|
/** Compressed pointer to pair of pointers - to property's getter and setter */
|
||||||
unsigned int get_p : ECMA_POINTER_FIELD_WIDTH;
|
unsigned int getter_setter_pair_cp : ECMA_POINTER_FIELD_WIDTH;
|
||||||
|
|
||||||
/** Compressed pointer to property's setter */
|
|
||||||
unsigned int set_p : ECMA_POINTER_FIELD_WIDTH;
|
|
||||||
} named_accessor_property;
|
} named_accessor_property;
|
||||||
|
|
||||||
/** Description of internal property */
|
/** Description of internal property */
|
||||||
|
|||||||
@ -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_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.
|
||||||
*/
|
*/
|
||||||
@ -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,
|
ecma_deref_ecma_string (ECMA_GET_NON_NULL_POINTER (ecma_string_t,
|
||||||
property_p->u.named_accessor_property.name_p));
|
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_dealloc_property (property_p);
|
||||||
} /* ecma_free_named_accessor_property */
|
} /* 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);
|
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 */
|
} /* 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);
|
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 */
|
} /* 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);
|
JERRY_ASSERT (prop_p->type == ECMA_PROPERTY_NAMEDACCESSOR);
|
||||||
ecma_assert_object_contains_the_property (object_p, prop_p);
|
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 */
|
} /* 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);
|
JERRY_ASSERT (prop_p->type == ECMA_PROPERTY_NAMEDACCESSOR);
|
||||||
ecma_assert_object_contains_the_property (object_p, prop_p);
|
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 */
|
} /* ecma_named_accessor_property_set_setter */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user