@@ -1300,28 +1300,20 @@ ecma_builtin_typedarray_prototype_index_of (ecma_typedarray_info_t *info_p, /**<
1300
1300
}
1301
1301
else
1302
1302
{
1303
- /* 6. 7. */
1304
- ecma_number_t num_var ;
1305
- if ( ECMA_IS_VALUE_ERROR ( ecma_op_to_integer ( args [ 1 ], & num_var )))
1303
+ if ( ECMA_IS_VALUE_ERROR ( ecma_builtin_helper_uint32_index_normalize ( args [ 1 ],
1304
+ info_p -> length ,
1305
+ & from_index )))
1306
1306
{
1307
1307
return ECMA_VALUE_ERROR ;
1308
1308
}
1309
- /* 8. */
1310
- if (num_var >= info_p -> length )
1311
- {
1312
- return ecma_make_integer_value (-1 );
1313
- }
1314
1309
1315
- /* 9. 10. */
1316
- from_index = ((num_var >= 0 ) ? (uint32_t ) num_var
1317
- : (uint32_t ) (info_p -> length + num_var ));
1318
1310
}
1319
1311
1320
1312
ecma_typedarray_getter_fn_t getter_cb = ecma_get_typedarray_getter_fn (info_p -> id );
1321
1313
1322
1314
/* 11. */
1323
- for (int32_t position = ( int32_t ) from_index * info_p -> element_size ;
1324
- ( uint32_t ) position < limit ;
1315
+ for (uint32_t position = from_index * info_p -> element_size ;
1316
+ position < limit ;
1325
1317
position += info_p -> element_size )
1326
1318
{
1327
1319
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,
1375
1367
}
1376
1368
else
1377
1369
{
1378
- /* 6. 7. */
1379
- ecma_number_t num_var ;
1380
- if (ECMA_IS_VALUE_ERROR (ecma_op_to_integer (args [1 ], & num_var )))
1370
+ if (ECMA_IS_VALUE_ERROR (ecma_builtin_helper_uint32_index_normalize (args [1 ],
1371
+ info_p -> length ,
1372
+ & from_index )))
1373
+ {
1374
+ return ECMA_VALUE_ERROR ;
1375
+ }
1376
+
1377
+ ecma_number_t to_int ;
1378
+
1379
+ if (ECMA_IS_VALUE_ERROR (ecma_op_to_integer (args [1 ], & to_int )))
1381
1380
{
1382
1381
return ECMA_VALUE_ERROR ;
1383
1382
}
1384
1383
1385
- if (!ecma_number_is_nan (num_var )
1386
- && - num_var > info_p -> length )
1384
+ if (info_p -> length + to_int < 0 )
1387
1385
{
1388
1386
return ecma_make_integer_value (-1 );
1389
1387
}
1390
1388
1391
- /* 8. 9. */
1392
- from_index = ((num_var >= 0 ) ? (uint32_t ) JERRY_MIN (num_var , info_p -> length - 1 )
1393
- : (uint32_t ) (info_p -> length + num_var ));
1389
+ from_index = JERRY_MIN (from_index , info_p -> length - 1 );
1394
1390
}
1395
1391
1396
1392
ecma_typedarray_getter_fn_t getter_cb = ecma_get_typedarray_getter_fn (info_p -> id );
1393
+ uint8_t * current_element_p = info_p -> buffer_p + from_index * info_p -> element_size ;
1397
1394
1398
1395
/* 10. */
1399
- for (int32_t position = (int32_t ) from_index * info_p -> element_size ;
1400
- position >= 0 ;
1401
- position += - info_p -> element_size )
1396
+ while (current_element_p >= info_p -> buffer_p )
1402
1397
{
1403
- ecma_value_t element = getter_cb (info_p -> buffer_p + position );
1398
+ ecma_value_t element = getter_cb (info_p -> buffer_p + from_index * info_p -> element_size );
1404
1399
1405
1400
if (ecma_op_same_value_zero (args [0 ], element , true))
1406
1401
{
1407
1402
ecma_free_value (element );
1408
- return ecma_make_number_value ((ecma_number_t ) position / info_p -> element_size );
1403
+ return ecma_make_number_value ((ecma_number_t ) from_index * info_p -> element_size / info_p -> element_size );
1409
1404
}
1410
1405
1411
1406
ecma_free_value (element );
1407
+ current_element_p -= info_p -> element_size ;
1408
+ from_index -- ;
1412
1409
}
1413
1410
1414
1411
/* 11. */
0 commit comments