@@ -767,6 +767,209 @@ ecma_builtin_typedarray_prototype_set (ecma_value_t this_arg, /**< this argument
767
767
return ret_val ;
768
768
} /* ecma_builtin_typedarray_prototype_set */
769
769
770
+ /**
771
+ * TypedArray.prototype's 'toString' single element operation routine based
772
+ * on the Array.prototype's 'toString' single element operation routine
773
+ *
774
+ * See also:
775
+ * ECMA-262 v5.1, 15.4.4.2
776
+ *
777
+ * @return ecma_value_t value
778
+ * Returned value must be freed with ecma_free_value.
779
+ */
780
+ static ecma_value_t
781
+ ecma_op_typedarray_get_to_string_at_index (ecma_object_t * obj_p , /**< this object */
782
+ uint32_t index ) /**< array index */
783
+ {
784
+ ecma_value_t ret_value = ECMA_VALUE_EMPTY ;
785
+ ecma_string_t * index_string_p = ecma_new_ecma_string_from_uint32 (index );
786
+
787
+ ECMA_TRY_CATCH (index_value ,
788
+ ecma_op_object_get (obj_p , index_string_p ),
789
+ ret_value );
790
+
791
+ if (ecma_is_value_undefined (index_value )
792
+ || ecma_is_value_null (index_value ))
793
+ {
794
+ ret_value = ecma_make_magic_string_value (LIT_MAGIC_STRING__EMPTY );
795
+ }
796
+ else
797
+ {
798
+ ret_value = ecma_op_to_string (index_value );
799
+ }
800
+
801
+ ECMA_FINALIZE (index_value );
802
+
803
+ ecma_deref_ecma_string (index_string_p );
804
+
805
+ return ret_value ;
806
+ } /* ecma_op_typedarray_get_to_string_at_index */
807
+
808
+ /**
809
+ * The TypedArray.prototype.toString's separator creation routine based on
810
+ * the Array.prototype.toString's separator routine
811
+ *
812
+ * See also:
813
+ * ECMA-262 v5.1, 15.4.4.2 4th step
814
+ *
815
+ * @return ecma value
816
+ * Returned value must be freed with ecma_free_value.
817
+ */
818
+ static ecma_value_t
819
+ ecma_op_typedarray_get_separator_string (ecma_value_t separator ) /**< possible separator */
820
+ {
821
+ if (ecma_is_value_undefined (separator ))
822
+ {
823
+ return ecma_make_magic_string_value (LIT_MAGIC_STRING_COMMA_CHAR );
824
+ }
825
+
826
+ return ecma_op_to_string (separator );
827
+ } /* ecma_op_typedarray_get_separator_string */
828
+
829
+ /**
830
+ * The TypedArray.prototype object's 'join' routine basen on
831
+ * the Array.porottype object's 'join'
832
+ *
833
+ * See also:
834
+ * ECMA-262 v5, 15.4.4.5
835
+ *
836
+ * @return ecma value
837
+ * Returned value must be freed with ecma_free_value.
838
+ */
839
+ static ecma_value_t
840
+ ecma_builtin_typedarray_prototype_join (const ecma_value_t this_arg , /**< this argument */
841
+ const ecma_value_t separator_arg ) /**< separator argument */
842
+ {
843
+ ecma_value_t ret_value = ECMA_VALUE_EMPTY ;
844
+
845
+ /* 1. */
846
+ ECMA_TRY_CATCH (obj_value ,
847
+ ecma_op_to_object (this_arg ),
848
+ ret_value );
849
+
850
+ ecma_object_t * obj_p = ecma_get_object_from_value (obj_value );
851
+
852
+ /* 2. */
853
+ ECMA_TRY_CATCH (length_value ,
854
+ ecma_op_object_get_by_magic_id (obj_p , LIT_MAGIC_STRING_LENGTH ),
855
+ ret_value );
856
+
857
+ ECMA_OP_TO_NUMBER_TRY_CATCH (length_number ,
858
+ length_value ,
859
+ ret_value );
860
+
861
+ /* 3. */
862
+ uint32_t length = ecma_number_to_uint32 (length_number );
863
+
864
+ /* 4-5. */
865
+ ECMA_TRY_CATCH (separator_value ,
866
+ ecma_op_typedarray_get_separator_string (separator_arg ),
867
+ ret_value );
868
+
869
+ if (length == 0 )
870
+ {
871
+ /* 6. */
872
+ ret_value = ecma_make_magic_string_value (LIT_MAGIC_STRING__EMPTY );
873
+ }
874
+ else
875
+ {
876
+ ecma_string_t * separator_string_p = ecma_get_string_from_value (separator_value );
877
+
878
+ /* 7-8. */
879
+ ECMA_TRY_CATCH (first_value ,
880
+ ecma_op_typedarray_get_to_string_at_index (obj_p , 0 ),
881
+ ret_value );
882
+
883
+ ecma_string_t * return_string_p = ecma_get_string_from_value (first_value );
884
+ ecma_ref_ecma_string (return_string_p );
885
+
886
+ /* 9-10. */
887
+ for (uint32_t k = 1 ; ecma_is_value_empty (ret_value ) && (k < length ); k ++ )
888
+ {
889
+ /* 10.a */
890
+ return_string_p = ecma_concat_ecma_strings (return_string_p , separator_string_p );
891
+
892
+ /* 10.b, 10.c */
893
+ ECMA_TRY_CATCH (next_string_value ,
894
+ ecma_op_typedarray_get_to_string_at_index (obj_p , k ),
895
+ ret_value );
896
+
897
+ /* 10.d */
898
+ ecma_string_t * next_string_p = ecma_get_string_from_value (next_string_value );
899
+ return_string_p = ecma_concat_ecma_strings (return_string_p , next_string_p );
900
+
901
+ ECMA_FINALIZE (next_string_value );
902
+ }
903
+
904
+ if (ecma_is_value_empty (ret_value ))
905
+ {
906
+ ret_value = ecma_make_string_value (return_string_p );
907
+ }
908
+ else
909
+ {
910
+ ecma_deref_ecma_string (return_string_p );
911
+ }
912
+
913
+ ECMA_FINALIZE (first_value );
914
+ }
915
+
916
+ ECMA_FINALIZE (separator_value );
917
+
918
+ ECMA_OP_TO_NUMBER_FINALIZE (length_number );
919
+
920
+ ECMA_FINALIZE (length_value );
921
+ ECMA_FINALIZE (obj_value );
922
+
923
+ return ret_value ;
924
+ } /* ecma_builtin_typedarray_prototype_join */
925
+
926
+
927
+ /**
928
+ * The TypedArray.prototype object's 'toString' routine basen on
929
+ * the Array.porottype object's 'toString'
930
+ *
931
+ * See also:
932
+ * ECMA-262 v5, 15.4.4.2
933
+ *
934
+ * @return ecma value
935
+ * Returned value must be freed with ecma_free_value.
936
+ */
937
+ static ecma_value_t
938
+ ecma_builtin_typedarray_prototype_object_to_string (ecma_value_t this_arg ) /**< this argument */
939
+ {
940
+ ecma_value_t ret_value = ECMA_VALUE_EMPTY ;
941
+
942
+ /* 1. */
943
+ ECMA_TRY_CATCH (obj_this_value ,
944
+ ecma_op_to_object (this_arg ),
945
+ ret_value );
946
+
947
+ ecma_object_t * obj_p = ecma_get_object_from_value (obj_this_value );
948
+
949
+ /* 2. */
950
+ ECMA_TRY_CATCH (join_value ,
951
+ ecma_op_object_get_by_magic_id (obj_p , LIT_MAGIC_STRING_JOIN ),
952
+ ret_value );
953
+
954
+ if (!ecma_op_is_callable (join_value ))
955
+ {
956
+ /* 3. */
957
+ ret_value = ecma_builtin_helper_object_to_string (this_arg );
958
+ }
959
+ else
960
+ {
961
+ /* 4. */
962
+ ecma_object_t * join_func_obj_p = ecma_get_object_from_value (join_value );
963
+
964
+ ret_value = ecma_op_function_call (join_func_obj_p , this_arg , NULL , 0 );
965
+ }
966
+
967
+ ECMA_FINALIZE (join_value );
968
+ ECMA_FINALIZE (obj_this_value );
969
+
970
+ return ret_value ;
971
+ } /* ecma_builtin_typedarray_prototype_object_to_string */
972
+
770
973
/**
771
974
* @}
772
975
* @}
0 commit comments