diff --git a/jerry-core/ecma/builtin-objects/typedarray/ecma-builtin-typedarray-prototype.c b/jerry-core/ecma/builtin-objects/typedarray/ecma-builtin-typedarray-prototype.c
index 26b1f179e..1d2fb9f6f 100644
--- a/jerry-core/ecma/builtin-objects/typedarray/ecma-builtin-typedarray-prototype.c
+++ b/jerry-core/ecma/builtin-objects/typedarray/ecma-builtin-typedarray-prototype.c
@@ -1300,28 +1300,20 @@ ecma_builtin_typedarray_prototype_index_of (ecma_typedarray_info_t *info_p, /**<
}
else
{
- /* 6. 7. */
- ecma_number_t num_var;
- if (ECMA_IS_VALUE_ERROR (ecma_op_to_integer (args[1], &num_var)))
+ if (ECMA_IS_VALUE_ERROR (ecma_builtin_helper_uint32_index_normalize (args[1],
+ info_p->length,
+ &from_index)))
{
return ECMA_VALUE_ERROR;
}
- /* 8. */
- if (num_var >= info_p->length)
- {
- return ecma_make_integer_value (-1);
- }
- /* 9. 10. */
- from_index = ((num_var >= 0) ? (uint32_t) num_var
- : (uint32_t) (info_p->length + num_var));
}
ecma_typedarray_getter_fn_t getter_cb = ecma_get_typedarray_getter_fn (info_p->id);
/* 11. */
- for (int32_t position = (int32_t) from_index * info_p->element_size;
- (uint32_t) position < limit;
+ for (uint32_t position = from_index * info_p->element_size;
+ position < limit;
position += info_p->element_size)
{
ecma_value_t element = getter_cb (info_p->buffer_p + position);
@@ -1375,40 +1367,45 @@ ecma_builtin_typedarray_prototype_last_index_of (ecma_typedarray_info_t *info_p,
}
else
{
- /* 6. 7. */
- ecma_number_t num_var;
- if (ECMA_IS_VALUE_ERROR (ecma_op_to_integer (args[1], &num_var)))
+ if (ECMA_IS_VALUE_ERROR (ecma_builtin_helper_uint32_index_normalize (args[1],
+ info_p->length,
+ &from_index)))
{
return ECMA_VALUE_ERROR;
}
- if (!ecma_number_is_nan (num_var)
- && -num_var > info_p->length)
+ ecma_number_t to_int;
+
+ if (ECMA_IS_VALUE_ERROR (ecma_op_to_integer (args[1], &to_int)))
+ {
+ return ECMA_VALUE_ERROR;
+ }
+
+ if (info_p->length + to_int < 0)
{
return ecma_make_integer_value (-1);
}
- /* 8. 9. */
- from_index = ((num_var >= 0) ? (uint32_t) JERRY_MIN (num_var, info_p->length - 1)
- : (uint32_t) (info_p->length + num_var));
+ from_index = JERRY_MIN (from_index, info_p->length - 1);
}
ecma_typedarray_getter_fn_t getter_cb = ecma_get_typedarray_getter_fn (info_p->id);
+ uint8_t *current_element_p = info_p->buffer_p + from_index * info_p->element_size;
/* 10. */
- for (int32_t position = (int32_t) from_index * info_p->element_size;
- position >= 0;
- position += -info_p->element_size)
+ while (current_element_p >= info_p->buffer_p)
{
- ecma_value_t element = getter_cb (info_p->buffer_p + position);
+ ecma_value_t element = getter_cb (info_p->buffer_p + from_index * info_p->element_size);
if (ecma_op_same_value_zero (args[0], element, true))
{
ecma_free_value (element);
- return ecma_make_number_value ((ecma_number_t) position / info_p->element_size);
+ return ecma_make_number_value ((ecma_number_t) from_index * info_p->element_size / info_p->element_size);
}
ecma_free_value (element);
+ current_element_p -= info_p->element_size;
+ from_index--;
}
/* 11. */
diff --git a/tests/test262-esnext-excludelist.xml b/tests/test262-esnext-excludelist.xml
index 923aed867..98810d77a 100644
--- a/tests/test262-esnext-excludelist.xml
+++ b/tests/test262-esnext-excludelist.xml
@@ -220,8 +220,6 @@
-
-