@@ -91,129 +91,48 @@ ecma_builtin_array_prototype_object_concat (ecma_value_t this_arg, /**< this arg
9191 ecma_length_t args_number) /* *< number of arguments */
9292{
9393 ecma_completion_value_t ret_value = ecma_make_empty_completion_value ();
94+
9495 /* 1. */
9596 ECMA_TRY_CATCH (obj_this,
9697 ecma_op_to_object (this_arg),
9798 ret_value);
9899
99- ecma_object_t *obj_p = ecma_get_object_from_value (obj_this);
100- ecma_string_t *magic_string_length_p = ecma_get_magic_string (LIT_MAGIC_STRING_LENGTH);
101-
102- ECMA_TRY_CATCH (len_value,
103- ecma_op_object_get (obj_p, magic_string_length_p),
104- ret_value);
105-
106- ECMA_OP_TO_NUMBER_TRY_CATCH (len_number, len_value, ret_value);
107-
108- uint32_t len = ecma_number_to_uint32 (len_number);
109-
110- uint32_t new_array_index = 0 ;
111-
112100 /* 2. */
113101 ecma_completion_value_t new_array = ecma_op_create_array_object (0 , 0 , false );
114102 ecma_object_t *new_array_p = ecma_get_object_from_completion_value (new_array);
103+ uint32_t new_length = 0 ;
115104
105+ /* 5.b - 5.c for this_arg */
106+ ECMA_TRY_CATCH (concat_this_value,
107+ ecma_builtin_helper_array_concat_value (new_array_p, &new_length, obj_this),
108+ ret_value);
116109
117- for (uint32_t index = 0 ;
118- index < len && ecma_is_completion_value_empty (ret_value);
119- index++, new_array_index++)
120- {
121- ecma_string_t *index_string_p = ecma_new_ecma_string_from_uint32 (index);
122- ECMA_TRY_CATCH (get_value, ecma_op_object_get (obj_p, index_string_p), ret_value);
123-
124- /* Using [[Put]] is equvalent to [[DefineOwnProperty]] in this case, so we use it for simplicity. */
125- ecma_completion_value_t put_comp = ecma_op_object_put (new_array_p,
126- index_string_p,
127- get_value,
128- false );
129- JERRY_ASSERT (ecma_is_completion_value_normal (put_comp));
130- ecma_free_completion_value (put_comp);
131-
132- ECMA_FINALIZE (get_value);
133- ecma_deref_ecma_string (index_string_p);
134- }
135-
110+ /* 5. */
136111 for (uint32_t arg_index = 0 ;
137112 arg_index < args_number && ecma_is_completion_value_empty (ret_value);
138113 arg_index++)
139114 {
140- /* 5.b */
141- if (ecma_is_value_object (args[arg_index]) &&
142- (ecma_object_get_class_name (ecma_get_object_from_value (args[arg_index])) == LIT_MAGIC_STRING_ARRAY_UL))
143- {
144- /* 5.b.ii */
145- ECMA_TRY_CATCH (arg_len_value,
146- ecma_op_object_get (ecma_get_object_from_value (args[arg_index]),
147- magic_string_length_p),
148- ret_value);
149- ECMA_OP_TO_NUMBER_TRY_CATCH (arg_len_number, arg_len_value, ret_value);
150-
151- uint32_t arg_len = ecma_number_to_uint32 (arg_len_number);
152-
153- for (uint32_t array_index = 0 ;
154- array_index < arg_len && ecma_is_completion_value_empty (ret_value);
155- array_index++, new_array_index++)
156- {
157- ecma_string_t *array_index_string_p = ecma_new_ecma_string_from_uint32 (array_index);
158-
159- /* 5.b.iii.2 */
160- if (ecma_op_object_get_property (ecma_get_object_from_value (args[arg_index]),
161- array_index_string_p) != NULL )
162- {
163- ecma_string_t *new_array_index_string_p = ecma_new_ecma_string_from_uint32 (new_array_index);
164-
165- ECMA_TRY_CATCH (get_value,
166- ecma_op_object_get (ecma_get_object_from_value (args[arg_index]),
167- array_index_string_p),
168- ret_value);
169-
170- /* Using [[Put]] is equvalent to [[DefineOwnProperty]] in this case, so we use it for simplicity. */
171- ecma_completion_value_t put_comp = ecma_op_object_put (new_array_p,
172- new_array_index_string_p,
173- get_value,
174- false );
175- JERRY_ASSERT (ecma_is_completion_value_normal (put_comp));
176- ecma_free_completion_value (put_comp);
177-
178- ECMA_FINALIZE (get_value);
179- ecma_deref_ecma_string (new_array_index_string_p);
180- }
181-
182- ecma_deref_ecma_string (array_index_string_p);
183- }
184-
185- ECMA_OP_TO_NUMBER_FINALIZE (len_number);
186- ECMA_FINALIZE (arg_len_value);
187- }
188- else
189- {
190- ecma_string_t *new_array_index_string_p = ecma_new_ecma_string_from_uint32 (new_array_index);
191-
192- /* Using [[Put]] is equvalent to [[DefineOwnProperty]] in this case, so we use it for simplicity. */
193- ecma_completion_value_t put_comp = ecma_op_object_put (new_array_p,
194- new_array_index_string_p,
195- args[arg_index],
196- false );
197- JERRY_ASSERT (ecma_is_completion_value_normal (put_comp));
198- ecma_free_completion_value (put_comp);
199-
200- ecma_deref_ecma_string (new_array_index_string_p);
201- new_array_index++;
202- }
115+ ECMA_TRY_CATCH (concat_value,
116+ ecma_builtin_helper_array_concat_value (new_array_p, &new_length, args[arg_index]),
117+ ret_value);
118+ ECMA_FINALIZE (concat_value);
203119 }
204120
121+ ECMA_FINALIZE (concat_this_value);
122+
205123 if (ecma_is_completion_value_empty (ret_value))
206124 {
125+ ECMA_TRY_CATCH (set_length_value,
126+ ecma_builtin_array_prototype_helper_set_length (new_array_p, new_length),
127+ ret_value);
207128 ret_value = new_array;
129+ ECMA_FINALIZE (set_length_value);
208130 }
209131 else
210132 {
211133 ecma_free_completion_value (new_array);
212134 }
213135
214- ECMA_OP_TO_NUMBER_FINALIZE (len_number);
215- ECMA_FINALIZE (len_value);
216- ecma_deref_ecma_string (magic_string_length_p);
217136 ECMA_FINALIZE (obj_this);
218137
219138 return ret_value;
0 commit comments