Improve performance of item 3.l of arrays' [[DefineOwnProperty]] (ecma_op_array_object_define_own_property).
JerryScript-DCO-1.0-Signed-off-by: Ruben Ayrapetyan r.ayrapetyan@samsung.com
This commit is contained in:
@@ -291,29 +291,60 @@ ecma_op_array_object_define_own_property (ecma_object_t *obj_p, /**< the array o
|
|||||||
// l
|
// l
|
||||||
JERRY_ASSERT (new_len_uint32 < old_len_uint32);
|
JERRY_ASSERT (new_len_uint32 < old_len_uint32);
|
||||||
|
|
||||||
bool reduce_succeeded = true;
|
/*
|
||||||
|
* Item i. is replaced with faster iteration: only indices that actually exist in the array, are iterated
|
||||||
|
*/
|
||||||
|
bool is_reduce_succeeded = true;
|
||||||
|
|
||||||
while (new_len_uint32 < old_len_uint32)
|
ecma_collection_header_t *array_index_props_p = ecma_op_object_get_property_names (obj_p,
|
||||||
|
true,
|
||||||
|
false,
|
||||||
|
false);
|
||||||
|
|
||||||
|
ecma_length_t array_index_props_num = array_index_props_p->unit_number;
|
||||||
|
|
||||||
|
MEM_DEFINE_LOCAL_ARRAY (array_index_values_p, array_index_props_num, uint32_t);
|
||||||
|
|
||||||
|
ecma_collection_iterator_t iter;
|
||||||
|
ecma_collection_iterator_init (&iter, array_index_props_p);
|
||||||
|
|
||||||
|
uint32_t array_index_values_pos = 0;
|
||||||
|
|
||||||
|
while (ecma_collection_iterator_next (&iter))
|
||||||
{
|
{
|
||||||
// i
|
ecma_string_t *property_name_p = ecma_get_string_from_value (*iter.current_value_p);
|
||||||
old_len_uint32--;
|
|
||||||
|
|
||||||
// ii
|
uint32_t index;
|
||||||
ecma_string_t *old_length_string_p = ecma_new_ecma_string_from_uint32 (old_len_uint32);
|
bool is_index = ecma_string_get_array_index (property_name_p, &index);
|
||||||
|
JERRY_ASSERT (is_index);
|
||||||
|
JERRY_ASSERT (index < old_len_uint32);
|
||||||
|
|
||||||
|
array_index_values_p[array_index_values_pos++] = index;
|
||||||
|
}
|
||||||
|
|
||||||
|
JERRY_ASSERT (array_index_values_pos == array_index_props_num);
|
||||||
|
|
||||||
|
while (array_index_values_pos != 0
|
||||||
|
&& array_index_values_p[--array_index_values_pos] >= new_len_uint32)
|
||||||
|
{
|
||||||
|
uint32_t index = array_index_values_p[array_index_values_pos];
|
||||||
|
|
||||||
|
// ii.
|
||||||
|
ecma_string_t *index_string_p = ecma_new_ecma_string_from_uint32 (index);
|
||||||
ecma_completion_value_t delete_succeeded = ecma_op_object_delete (obj_p,
|
ecma_completion_value_t delete_succeeded = ecma_op_object_delete (obj_p,
|
||||||
old_length_string_p,
|
index_string_p,
|
||||||
false);
|
false);
|
||||||
ecma_deref_ecma_string (old_length_string_p);
|
ecma_deref_ecma_string (index_string_p);
|
||||||
|
|
||||||
// iii
|
|
||||||
if (ecma_is_completion_value_normal_false (delete_succeeded))
|
if (ecma_is_completion_value_normal_false (delete_succeeded))
|
||||||
{
|
{
|
||||||
JERRY_ASSERT (ecma_is_value_number (new_len_property_desc.value));
|
// iii.
|
||||||
|
new_len_uint32 = (index + 1u);
|
||||||
|
|
||||||
ecma_number_t *new_len_num_p = ecma_get_number_from_value (new_len_property_desc.value);
|
ecma_number_t *new_len_num_p = ecma_get_number_from_value (new_len_property_desc.value);
|
||||||
|
|
||||||
// 1.
|
// 1.
|
||||||
*new_len_num_p = ecma_uint32_to_number (old_len_uint32 + 1);
|
*new_len_num_p = ecma_uint32_to_number (index + 1u);
|
||||||
|
|
||||||
// 2.
|
// 2.
|
||||||
if (!new_writable)
|
if (!new_writable)
|
||||||
@@ -333,13 +364,17 @@ ecma_op_array_object_define_own_property (ecma_object_t *obj_p, /**< the array o
|
|||||||
JERRY_ASSERT (ecma_is_completion_value_normal_true (completion)
|
JERRY_ASSERT (ecma_is_completion_value_normal_true (completion)
|
||||||
|| ecma_is_completion_value_normal_false (completion));
|
|| ecma_is_completion_value_normal_false (completion));
|
||||||
|
|
||||||
reduce_succeeded = false;
|
is_reduce_succeeded = false;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!reduce_succeeded)
|
MEM_FINALIZE_LOCAL_ARRAY (array_index_values_p);
|
||||||
|
|
||||||
|
ecma_free_values_collection (array_index_props_p, true);
|
||||||
|
|
||||||
|
if (!is_reduce_succeeded)
|
||||||
{
|
{
|
||||||
ret_value = ecma_reject (is_throw);
|
ret_value = ecma_reject (is_throw);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -656,7 +656,7 @@ ecma_op_object_get_property_names (ecma_object_t *obj_p, /**< object */
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
JERRY_ASSERT (insertion_pos < array_index_name_pos);
|
JERRY_ASSERT (insertion_pos < array_index_name_pos);
|
||||||
JERRY_ASSERT (index < array_index_names_p[insertion_pos]);
|
JERRY_ASSERT (index >= array_index_names_p[insertion_pos]);
|
||||||
|
|
||||||
uint32_t move_pos = ++array_index_name_pos;
|
uint32_t move_pos = ++array_index_name_pos;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user