@@ -2597,6 +2597,151 @@ ecma_builtin_array_prototype_object_reduce (ecma_value_t this_arg, /**< this arg
2597
2597
return ret_value;
2598
2598
} /* ecma_builtin_array_prototype_object_reduce */
2599
2599
2600
+ /* *
2601
+ * The Array.prototype object's 'reduceRight' routine
2602
+ *
2603
+ * See also:
2604
+ * ECMA-262 v5, 15.4.4.22
2605
+ *
2606
+ * @return completion value
2607
+ * Returned value must be freed with ecma_free_completion_value.
2608
+ */
2609
+ static ecma_completion_value_t
2610
+ ecma_builtin_array_prototype_object_reduce_right (ecma_value_t this_arg, /* *< this argument */
2611
+ ecma_value_t arg1, /* *< callbackfn */
2612
+ ecma_value_t arg2) /* *< initialValue */
2613
+ {
2614
+ ecma_completion_value_t ret_value = ecma_make_empty_completion_value ();
2615
+
2616
+ /* 1 */
2617
+ ECMA_TRY_CATCH (obj_this,
2618
+ ecma_op_to_object (this_arg),
2619
+ ret_value);
2620
+
2621
+ ecma_object_t *obj_p = ecma_get_object_from_value (obj_this);
2622
+ ecma_string_t *magic_string_length_p = ecma_get_magic_string (ECMA_MAGIC_STRING_LENGTH);
2623
+
2624
+ /* 2 */
2625
+ ECMA_TRY_CATCH (len_value,
2626
+ ecma_op_object_get (obj_p, magic_string_length_p),
2627
+ ret_value);
2628
+
2629
+ ECMA_OP_TO_NUMBER_TRY_CATCH (len_number, len_value, ret_value);
2630
+
2631
+ /* 3 */
2632
+ uint32_t len = ecma_number_to_uint32 (len_number);
2633
+
2634
+ /* 4 */
2635
+ if (!ecma_op_is_callable (arg1))
2636
+ {
2637
+ ret_value = ecma_make_throw_obj_completion_value (ecma_new_standard_error (ECMA_ERROR_TYPE));
2638
+ }
2639
+ else
2640
+ {
2641
+ ecma_object_t *func_object_p;
2642
+
2643
+ JERRY_ASSERT (ecma_is_value_object (arg1));
2644
+ func_object_p = ecma_get_object_from_value (arg1);
2645
+
2646
+ /* 5 */
2647
+ if (len_number == ECMA_NUMBER_ZERO && ecma_is_value_undefined (arg2))
2648
+ {
2649
+ ret_value = ecma_make_throw_obj_completion_value (ecma_new_standard_error (ECMA_ERROR_TYPE));
2650
+ }
2651
+ else
2652
+ {
2653
+ ecma_number_t *num_p = ecma_alloc_number ();
2654
+ ecma_value_t accumulator = ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED);
2655
+
2656
+ /* 6 */
2657
+ uint32_t index = len - 1 ;
2658
+ bool zero_reached = !len;
2659
+
2660
+ /* 7a */
2661
+ if (!ecma_is_value_undefined (arg2))
2662
+ {
2663
+ accumulator = ecma_copy_value (arg2, true );
2664
+ }
2665
+ else
2666
+ {
2667
+ /* 8a */
2668
+ bool k_present = false ;
2669
+ /* 8b */
2670
+ while (!k_present && !zero_reached && ecma_is_completion_value_empty (ret_value))
2671
+ {
2672
+ /* 8b-i */
2673
+ ecma_string_t *index_str_p = ecma_new_ecma_string_from_uint32 (index);
2674
+
2675
+ /* 8b-ii-iii */
2676
+ if ((k_present = (ecma_op_object_get_property (obj_p, index_str_p) != NULL )))
2677
+ {
2678
+ ECMA_TRY_CATCH (current_value, ecma_op_object_get (obj_p, index_str_p), ret_value);
2679
+ accumulator = ecma_copy_value (current_value, true );
2680
+ ECMA_FINALIZE (current_value);
2681
+ }
2682
+ /* 8b-iv */
2683
+ index ? --index : zero_reached = true ;
2684
+
2685
+ ecma_deref_ecma_string (index_str_p);
2686
+ }
2687
+ /* 8c */
2688
+ if (!k_present)
2689
+ {
2690
+ ret_value = ecma_make_throw_obj_completion_value (ecma_new_standard_error (ECMA_ERROR_TYPE));
2691
+ }
2692
+ }
2693
+ /* 9 */
2694
+ ecma_value_t current_index;
2695
+
2696
+ for (; !zero_reached && ecma_is_completion_value_empty (ret_value); index ? --index : zero_reached = true )
2697
+ {
2698
+ /* 9a */
2699
+ ecma_string_t *index_str_p = ecma_new_ecma_string_from_uint32 (index);
2700
+ /* 9b */
2701
+ if (ecma_op_object_get_property (obj_p, index_str_p) != NULL )
2702
+ {
2703
+ /* 9c-i */
2704
+ ECMA_TRY_CATCH (current_value, ecma_op_object_get (obj_p, index_str_p), ret_value);
2705
+ /* 9c-ii */
2706
+ *num_p = ecma_uint32_to_number (index);
2707
+ current_index = ecma_make_number_value (num_p);
2708
+ ecma_value_t call_args[] = {accumulator, current_value, current_index, obj_this};
2709
+
2710
+ ECMA_TRY_CATCH (call_value,
2711
+ ecma_op_function_call (func_object_p,
2712
+ ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED),
2713
+ call_args,
2714
+ 4 ),
2715
+ ret_value);
2716
+
2717
+ ecma_free_value (accumulator, true );
2718
+ accumulator = ecma_copy_value (call_value, true );
2719
+
2720
+ ECMA_FINALIZE (call_value);
2721
+ ECMA_FINALIZE (current_value);
2722
+ }
2723
+ ecma_deref_ecma_string (index_str_p);
2724
+ /* 9d in for loop */
2725
+ }
2726
+
2727
+ if (ecma_is_completion_value_empty (ret_value))
2728
+ {
2729
+ ret_value = ecma_make_normal_completion_value (ecma_copy_value (accumulator, true ));
2730
+ }
2731
+
2732
+ ecma_free_value (accumulator, true );
2733
+ ecma_dealloc_number (num_p);
2734
+ }
2735
+ }
2736
+
2737
+ ECMA_OP_TO_NUMBER_FINALIZE (len_number);
2738
+ ECMA_FINALIZE (len_value);
2739
+ ecma_deref_ecma_string (magic_string_length_p);
2740
+ ECMA_FINALIZE (obj_this);
2741
+
2742
+ return ret_value;
2743
+ } /* ecma_builtin_array_prototype_object_reduce */
2744
+
2600
2745
/* *
2601
2746
* @}
2602
2747
* @}
0 commit comments