@@ -412,9 +412,7 @@ ecma_builtin_typedarray_prototype_filter (ecma_value_t this_arg, /**< this objec
412
412
return ecma_op_create_typedarray_with_type_and_length (info_p -> id , 0 );
413
413
}
414
414
415
- JMEM_DEFINE_LOCAL_ARRAY (pass_value_list_p , info_p -> length * info_p -> element_size , lit_utf8_byte_t );
416
-
417
- lit_utf8_byte_t * pass_value_p = pass_value_list_p ;
415
+ ecma_collection_t * collected_p = ecma_new_collection ();
418
416
uint32_t byte_pos = 0 ;
419
417
420
418
for (uint32_t index = 0 ; index < info_p -> length ; index ++ )
@@ -429,50 +427,63 @@ ecma_builtin_typedarray_prototype_filter (ecma_value_t this_arg, /**< this objec
429
427
ecma_value_t call_value = ecma_op_function_call (func_object_p , cb_this_arg , call_args , 3 );
430
428
431
429
ecma_fast_free_value (current_index );
432
- ecma_fast_free_value (get_value );
433
430
434
431
if (ECMA_IS_VALUE_ERROR (call_value ))
435
432
{
433
+ ecma_fast_free_value (get_value );
436
434
goto cleanup ;
437
435
}
438
436
439
437
if (ecma_arraybuffer_is_detached (info_p -> array_buffer_p ))
440
438
{
441
439
ecma_free_value (call_value );
440
+ ecma_fast_free_value (get_value );
442
441
ecma_raise_type_error (ECMA_ERR_MSG (ecma_error_arraybuffer_is_detached ));
443
442
goto cleanup ;
444
443
}
445
444
446
445
if (ecma_op_to_boolean (call_value ))
447
446
{
448
- memcpy (pass_value_p , info_p -> buffer_p + byte_pos , info_p -> element_size );
449
- pass_value_p += info_p -> element_size ;
447
+ ecma_collection_push_back (collected_p , get_value );
448
+ }
449
+ else
450
+ {
451
+ ecma_fast_free_value (get_value );
450
452
}
451
453
452
454
byte_pos += info_p -> element_size ;
453
-
454
- ecma_free_value (call_value );
455
+ ecma_fast_free_value (call_value );
455
456
}
456
457
457
- uint32_t pass_num = (uint32_t ) ((pass_value_p - pass_value_list_p ) >> info_p -> shift );
458
-
459
- ecma_value_t collected = ecma_make_number_value (pass_num );
458
+ ecma_value_t collected = ecma_make_number_value (collected_p -> item_count );
460
459
ret_value = ecma_typedarray_species_create (this_arg , & collected , 1 );
461
460
ecma_free_value (collected );
462
461
463
462
if (!ECMA_IS_VALUE_ERROR (ret_value ))
464
463
{
465
464
ecma_object_t * obj_p = ecma_get_object_from_value (ret_value );
465
+ ecma_typedarray_info_t target_info = ecma_typedarray_get_info (obj_p );
466
466
467
- JERRY_ASSERT (ecma_typedarray_get_offset ( obj_p ) == 0 );
467
+ JERRY_ASSERT (target_info . offset == 0 );
468
468
469
- memcpy (ecma_typedarray_get_buffer (obj_p ),
470
- pass_value_list_p ,
471
- (size_t ) (pass_value_p - pass_value_list_p ));
469
+ ecma_typedarray_setter_fn_t target_typedarray_setter_cb = ecma_get_typedarray_setter_fn (target_info .id );
470
+ uint32_t target_byte_index = 0 ;
471
+ for (uint32_t idx = 0 ; idx < collected_p -> item_count ; idx ++ )
472
+ {
473
+ ecma_value_t set_element = target_typedarray_setter_cb (target_info .buffer_p + target_byte_index ,
474
+ collected_p -> buffer_p [idx ]);
475
+
476
+ if (ECMA_IS_VALUE_ERROR (set_element ))
477
+ {
478
+ goto cleanup ;
479
+ }
480
+
481
+ target_byte_index += target_info .element_size ;
482
+ }
472
483
}
473
484
474
485
cleanup :
475
- JMEM_FINALIZE_LOCAL_ARRAY ( pass_value_list_p );
486
+ ecma_collection_free ( collected_p );
476
487
477
488
return ret_value ;
478
489
} /* ecma_builtin_typedarray_prototype_filter */
0 commit comments