1425bb815Sopenharmony_ci/* Copyright JS Foundation and other contributors, http://js.foundation
2425bb815Sopenharmony_ci *
3425bb815Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4425bb815Sopenharmony_ci * you may not use this file except in compliance with the License.
5425bb815Sopenharmony_ci * You may obtain a copy of the License at
6425bb815Sopenharmony_ci *
7425bb815Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8425bb815Sopenharmony_ci *
9425bb815Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10425bb815Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS
11425bb815Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12425bb815Sopenharmony_ci * See the License for the specific language governing permissions and
13425bb815Sopenharmony_ci * limitations under the License.
14425bb815Sopenharmony_ci */
15425bb815Sopenharmony_ci
16425bb815Sopenharmony_ci#include "ecma-alloc.h"
17425bb815Sopenharmony_ci#include "ecma-builtin-helpers.h"
18425bb815Sopenharmony_ci#include "ecma-builtins.h"
19425bb815Sopenharmony_ci#include "ecma-function-object.h"
20425bb815Sopenharmony_ci#include "ecma-gc.h"
21425bb815Sopenharmony_ci#include "ecma-globals.h"
22425bb815Sopenharmony_ci#include "ecma-helpers.h"
23425bb815Sopenharmony_ci#include "ecma-lex-env.h"
24425bb815Sopenharmony_ci#include "ecma-objects.h"
25425bb815Sopenharmony_ci#include "ecma-objects-arguments.h"
26425bb815Sopenharmony_ci#include "ecma-objects-general.h"
27425bb815Sopenharmony_ci#include "ecma-try-catch-macro.h"
28425bb815Sopenharmony_ci#include "jrt.h"
29425bb815Sopenharmony_ci
30425bb815Sopenharmony_ci/** \addtogroup ecma ECMA
31425bb815Sopenharmony_ci * @{
32425bb815Sopenharmony_ci *
33425bb815Sopenharmony_ci * \addtogroup ecmafunctionobject ECMA Function object related routines
34425bb815Sopenharmony_ci * @{
35425bb815Sopenharmony_ci */
36425bb815Sopenharmony_ci
37425bb815Sopenharmony_ci/**
38425bb815Sopenharmony_ci * Arguments object creation operation.
39425bb815Sopenharmony_ci *
40425bb815Sopenharmony_ci * See also: ECMA-262 v5, 10.6
41425bb815Sopenharmony_ci */
42425bb815Sopenharmony_civoid
43425bb815Sopenharmony_ciecma_op_create_arguments_object (ecma_object_t *func_obj_p, /**< callee function */
44425bb815Sopenharmony_ci                                 ecma_object_t *lex_env_p, /**< lexical environment the Arguments
45425bb815Sopenharmony_ci                                                                object is created for */
46425bb815Sopenharmony_ci                                 const ecma_value_t *arguments_list_p, /**< arguments list */
47425bb815Sopenharmony_ci                                 ecma_length_t arguments_number, /**< length of arguments list */
48425bb815Sopenharmony_ci                                 const ecma_compiled_code_t *bytecode_data_p) /**< byte code */
49425bb815Sopenharmony_ci{
50425bb815Sopenharmony_ci  bool is_strict = (bytecode_data_p->status_flags & CBC_CODE_FLAGS_STRICT_MODE) != 0;
51425bb815Sopenharmony_ci
52425bb815Sopenharmony_ci  ecma_length_t formal_params_number;
53425bb815Sopenharmony_ci
54425bb815Sopenharmony_ci  if (bytecode_data_p->status_flags & CBC_CODE_FLAGS_UINT16_ARGUMENTS)
55425bb815Sopenharmony_ci  {
56425bb815Sopenharmony_ci    cbc_uint16_arguments_t *args_p = (cbc_uint16_arguments_t *) bytecode_data_p;
57425bb815Sopenharmony_ci
58425bb815Sopenharmony_ci    formal_params_number = args_p->argument_end;
59425bb815Sopenharmony_ci  }
60425bb815Sopenharmony_ci  else
61425bb815Sopenharmony_ci  {
62425bb815Sopenharmony_ci    cbc_uint8_arguments_t *args_p = (cbc_uint8_arguments_t *) bytecode_data_p;
63425bb815Sopenharmony_ci
64425bb815Sopenharmony_ci    formal_params_number = args_p->argument_end;
65425bb815Sopenharmony_ci  }
66425bb815Sopenharmony_ci
67425bb815Sopenharmony_ci  ecma_object_t *prototype_p = ecma_builtin_get (ECMA_BUILTIN_ID_OBJECT_PROTOTYPE);
68425bb815Sopenharmony_ci
69425bb815Sopenharmony_ci  ecma_object_t *obj_p;
70425bb815Sopenharmony_ci
71425bb815Sopenharmony_ci  if ((bytecode_data_p->status_flags & CBC_CODE_FLAGS_MAPPED_ARGUMENTS_NEEDED)
72425bb815Sopenharmony_ci      && arguments_number > 0
73425bb815Sopenharmony_ci      && formal_params_number > 0)
74425bb815Sopenharmony_ci  {
75425bb815Sopenharmony_ci    size_t formal_params_size = formal_params_number * sizeof (ecma_value_t);
76425bb815Sopenharmony_ci
77425bb815Sopenharmony_ci    obj_p = ecma_create_object (prototype_p,
78425bb815Sopenharmony_ci                                sizeof (ecma_extended_object_t) + formal_params_size,
79425bb815Sopenharmony_ci                                ECMA_OBJECT_TYPE_PSEUDO_ARRAY);
80425bb815Sopenharmony_ci
81425bb815Sopenharmony_ci    ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) obj_p;
82425bb815Sopenharmony_ci
83425bb815Sopenharmony_ci    ext_object_p->u.pseudo_array.type = ECMA_PSEUDO_ARRAY_ARGUMENTS;
84425bb815Sopenharmony_ci
85425bb815Sopenharmony_ci    ECMA_SET_INTERNAL_VALUE_POINTER (ext_object_p->u.pseudo_array.u2.lex_env_cp, lex_env_p);
86425bb815Sopenharmony_ci
87425bb815Sopenharmony_ci    ext_object_p->u.pseudo_array.u1.length = (uint16_t) formal_params_number;
88425bb815Sopenharmony_ci
89425bb815Sopenharmony_ci    ecma_value_t *arg_Literal_p = (ecma_value_t *) (ext_object_p + 1);
90425bb815Sopenharmony_ci
91425bb815Sopenharmony_ci    uint8_t *byte_p = (uint8_t *) bytecode_data_p;
92425bb815Sopenharmony_ci    byte_p += ((size_t) bytecode_data_p->size) << JMEM_ALIGNMENT_LOG;
93425bb815Sopenharmony_ci    byte_p -= formal_params_size;
94425bb815Sopenharmony_ci
95425bb815Sopenharmony_ci    memcpy (arg_Literal_p, byte_p, formal_params_size);
96425bb815Sopenharmony_ci
97425bb815Sopenharmony_ci    for (ecma_length_t i = 0; i < formal_params_number; i++)
98425bb815Sopenharmony_ci    {
99425bb815Sopenharmony_ci      if (arg_Literal_p[i] != ECMA_VALUE_EMPTY)
100425bb815Sopenharmony_ci      {
101425bb815Sopenharmony_ci        ecma_string_t *name_p = ecma_get_string_from_value (arg_Literal_p[i]);
102425bb815Sopenharmony_ci        ecma_ref_ecma_string (name_p);
103425bb815Sopenharmony_ci      }
104425bb815Sopenharmony_ci    }
105425bb815Sopenharmony_ci  }
106425bb815Sopenharmony_ci  else
107425bb815Sopenharmony_ci  {
108425bb815Sopenharmony_ci    obj_p = ecma_create_object (prototype_p, sizeof (ecma_extended_object_t), ECMA_OBJECT_TYPE_CLASS);
109425bb815Sopenharmony_ci
110425bb815Sopenharmony_ci    ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) obj_p;
111425bb815Sopenharmony_ci    ext_object_p->u.class_prop.class_id = LIT_MAGIC_STRING_ARGUMENTS_UL;
112425bb815Sopenharmony_ci  }
113425bb815Sopenharmony_ci
114425bb815Sopenharmony_ci  ecma_property_value_t *prop_value_p;
115425bb815Sopenharmony_ci
116425bb815Sopenharmony_ci  /* 11.a, 11.b */
117425bb815Sopenharmony_ci  for (ecma_length_t index = 0;
118425bb815Sopenharmony_ci       index < arguments_number;
119425bb815Sopenharmony_ci       index++)
120425bb815Sopenharmony_ci  {
121425bb815Sopenharmony_ci    ecma_string_t *index_string_p = ecma_new_ecma_string_from_uint32 (index);
122425bb815Sopenharmony_ci
123425bb815Sopenharmony_ci    prop_value_p = ecma_create_named_data_property (obj_p,
124425bb815Sopenharmony_ci                                                    index_string_p,
125425bb815Sopenharmony_ci                                                    ECMA_PROPERTY_CONFIGURABLE_ENUMERABLE_WRITABLE,
126425bb815Sopenharmony_ci                                                    NULL);
127425bb815Sopenharmony_ci
128425bb815Sopenharmony_ci    prop_value_p->value = ecma_copy_value_if_not_object (arguments_list_p[index]);
129425bb815Sopenharmony_ci
130425bb815Sopenharmony_ci    ecma_deref_ecma_string (index_string_p);
131425bb815Sopenharmony_ci  }
132425bb815Sopenharmony_ci
133425bb815Sopenharmony_ci  /* 7. */
134425bb815Sopenharmony_ci  prop_value_p = ecma_create_named_data_property (obj_p,
135425bb815Sopenharmony_ci                                                  ecma_get_magic_string (LIT_MAGIC_STRING_LENGTH),
136425bb815Sopenharmony_ci                                                  ECMA_PROPERTY_CONFIGURABLE_WRITABLE,
137425bb815Sopenharmony_ci                                                  NULL);
138425bb815Sopenharmony_ci
139425bb815Sopenharmony_ci  prop_value_p->value = ecma_make_uint32_value (arguments_number);
140425bb815Sopenharmony_ci
141425bb815Sopenharmony_ci  ecma_property_descriptor_t prop_desc = ecma_make_empty_property_descriptor ();
142425bb815Sopenharmony_ci
143425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015)
144425bb815Sopenharmony_ci  /* ECMAScript v6, 9.4.4.6.7, 9.4.4.7.22 */
145425bb815Sopenharmony_ci  ecma_string_t *symbol_p = ecma_op_get_global_symbol (LIT_GLOBAL_SYMBOL_ITERATOR);
146425bb815Sopenharmony_ci
147425bb815Sopenharmony_ci  prop_value_p = ecma_create_named_data_property (obj_p,
148425bb815Sopenharmony_ci                                                  symbol_p,
149425bb815Sopenharmony_ci                                                  ECMA_PROPERTY_CONFIGURABLE_WRITABLE,
150425bb815Sopenharmony_ci                                                  NULL);
151425bb815Sopenharmony_ci  ecma_deref_ecma_string (symbol_p);
152425bb815Sopenharmony_ci  prop_value_p->value = ecma_op_object_get_by_magic_id (ecma_builtin_get (ECMA_BUILTIN_ID_INTRINSIC_OBJECT),
153425bb815Sopenharmony_ci                                                        LIT_INTERNAL_MAGIC_STRING_ARRAY_PROTOTYPE_VALUES);
154425bb815Sopenharmony_ci
155425bb815Sopenharmony_ci  JERRY_ASSERT (ecma_is_value_object (prop_value_p->value));
156425bb815Sopenharmony_ci  ecma_deref_object (ecma_get_object_from_value (prop_value_p->value));
157425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015) */
158425bb815Sopenharmony_ci
159425bb815Sopenharmony_ci  /* 13. */
160425bb815Sopenharmony_ci  if (!is_strict)
161425bb815Sopenharmony_ci  {
162425bb815Sopenharmony_ci    prop_value_p = ecma_create_named_data_property (obj_p,
163425bb815Sopenharmony_ci                                                    ecma_get_magic_string (LIT_MAGIC_STRING_CALLEE),
164425bb815Sopenharmony_ci                                                    ECMA_PROPERTY_CONFIGURABLE_WRITABLE,
165425bb815Sopenharmony_ci                                                    NULL);
166425bb815Sopenharmony_ci
167425bb815Sopenharmony_ci    prop_value_p->value = ecma_make_object_value (func_obj_p);
168425bb815Sopenharmony_ci  }
169425bb815Sopenharmony_ci  else
170425bb815Sopenharmony_ci  {
171425bb815Sopenharmony_ci    ecma_object_t *thrower_p = ecma_builtin_get (ECMA_BUILTIN_ID_TYPE_ERROR_THROWER);
172425bb815Sopenharmony_ci
173425bb815Sopenharmony_ci    /* 14. */
174425bb815Sopenharmony_ci    prop_desc = ecma_make_empty_property_descriptor ();
175425bb815Sopenharmony_ci    {
176425bb815Sopenharmony_ci      prop_desc.flags = (ECMA_PROP_IS_GET_DEFINED
177425bb815Sopenharmony_ci                         | ECMA_PROP_IS_SET_DEFINED
178425bb815Sopenharmony_ci                         | ECMA_PROP_IS_ENUMERABLE_DEFINED
179425bb815Sopenharmony_ci                         | ECMA_PROP_IS_CONFIGURABLE_DEFINED);
180425bb815Sopenharmony_ci    }
181425bb815Sopenharmony_ci    prop_desc.set_p = thrower_p;
182425bb815Sopenharmony_ci    prop_desc.get_p = thrower_p;
183425bb815Sopenharmony_ci
184425bb815Sopenharmony_ci    ecma_value_t completion = ecma_op_object_define_own_property (obj_p,
185425bb815Sopenharmony_ci                                                                  ecma_get_magic_string (LIT_MAGIC_STRING_CALLEE),
186425bb815Sopenharmony_ci                                                                  &prop_desc);
187425bb815Sopenharmony_ci
188425bb815Sopenharmony_ci    JERRY_ASSERT (ecma_is_value_true (completion));
189425bb815Sopenharmony_ci
190425bb815Sopenharmony_ci    completion = ecma_op_object_define_own_property (obj_p,
191425bb815Sopenharmony_ci                                                     ecma_get_magic_string (LIT_MAGIC_STRING_CALLER),
192425bb815Sopenharmony_ci                                                     &prop_desc);
193425bb815Sopenharmony_ci    JERRY_ASSERT (ecma_is_value_true (completion));
194425bb815Sopenharmony_ci  }
195425bb815Sopenharmony_ci
196425bb815Sopenharmony_ci  ecma_string_t *arguments_string_p = ecma_get_magic_string (LIT_MAGIC_STRING_ARGUMENTS);
197425bb815Sopenharmony_ci
198425bb815Sopenharmony_ci  if (is_strict)
199425bb815Sopenharmony_ci  {
200425bb815Sopenharmony_ci    ecma_op_create_immutable_binding (lex_env_p,
201425bb815Sopenharmony_ci                                      arguments_string_p,
202425bb815Sopenharmony_ci                                      ecma_make_object_value (obj_p));
203425bb815Sopenharmony_ci  }
204425bb815Sopenharmony_ci  else
205425bb815Sopenharmony_ci  {
206425bb815Sopenharmony_ci    ecma_value_t completion = ecma_op_create_mutable_binding (lex_env_p,
207425bb815Sopenharmony_ci                                                              arguments_string_p,
208425bb815Sopenharmony_ci                                                              false);
209425bb815Sopenharmony_ci    JERRY_ASSERT (ecma_is_value_empty (completion));
210425bb815Sopenharmony_ci
211425bb815Sopenharmony_ci    completion = ecma_op_set_mutable_binding (lex_env_p,
212425bb815Sopenharmony_ci                                              arguments_string_p,
213425bb815Sopenharmony_ci                                              ecma_make_object_value (obj_p),
214425bb815Sopenharmony_ci                                              false);
215425bb815Sopenharmony_ci
216425bb815Sopenharmony_ci    JERRY_ASSERT (ecma_is_value_empty (completion));
217425bb815Sopenharmony_ci  }
218425bb815Sopenharmony_ci
219425bb815Sopenharmony_ci  ecma_deref_object (obj_p);
220425bb815Sopenharmony_ci} /* ecma_op_create_arguments_object */
221425bb815Sopenharmony_ci
222425bb815Sopenharmony_ci/**
223425bb815Sopenharmony_ci * [[DefineOwnProperty]] ecma Arguments object's operation
224425bb815Sopenharmony_ci *
225425bb815Sopenharmony_ci * See also:
226425bb815Sopenharmony_ci *          ECMA-262 v5, 8.6.2; ECMA-262 v5, Table 8
227425bb815Sopenharmony_ci *          ECMA-262 v5, 10.6
228425bb815Sopenharmony_ci *
229425bb815Sopenharmony_ci * @return ecma value
230425bb815Sopenharmony_ci *         Returned value must be freed with ecma_free_value
231425bb815Sopenharmony_ci */
232425bb815Sopenharmony_ciecma_value_t
233425bb815Sopenharmony_ciecma_op_arguments_object_define_own_property (ecma_object_t *object_p, /**< the object */
234425bb815Sopenharmony_ci                                              ecma_string_t *property_name_p, /**< property name */
235425bb815Sopenharmony_ci                                              const ecma_property_descriptor_t *property_desc_p) /**< property
236425bb815Sopenharmony_ci                                                                                                  *   descriptor */
237425bb815Sopenharmony_ci{
238425bb815Sopenharmony_ci  /* 3. */
239425bb815Sopenharmony_ci  ecma_value_t ret_value = ecma_op_general_object_define_own_property (object_p,
240425bb815Sopenharmony_ci                                                                       property_name_p,
241425bb815Sopenharmony_ci                                                                       property_desc_p);
242425bb815Sopenharmony_ci
243425bb815Sopenharmony_ci  if (ECMA_IS_VALUE_ERROR (ret_value))
244425bb815Sopenharmony_ci  {
245425bb815Sopenharmony_ci    return ret_value;
246425bb815Sopenharmony_ci  }
247425bb815Sopenharmony_ci
248425bb815Sopenharmony_ci  uint32_t index = ecma_string_get_array_index (property_name_p);
249425bb815Sopenharmony_ci
250425bb815Sopenharmony_ci  if (index == ECMA_STRING_NOT_ARRAY_INDEX)
251425bb815Sopenharmony_ci  {
252425bb815Sopenharmony_ci    return ret_value;
253425bb815Sopenharmony_ci  }
254425bb815Sopenharmony_ci
255425bb815Sopenharmony_ci  ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) object_p;
256425bb815Sopenharmony_ci
257425bb815Sopenharmony_ci  if (index >= ext_object_p->u.pseudo_array.u1.length)
258425bb815Sopenharmony_ci  {
259425bb815Sopenharmony_ci    return ret_value;
260425bb815Sopenharmony_ci  }
261425bb815Sopenharmony_ci
262425bb815Sopenharmony_ci  ecma_value_t *arg_Literal_p = (ecma_value_t *) (ext_object_p + 1);
263425bb815Sopenharmony_ci
264425bb815Sopenharmony_ci  if (arg_Literal_p[index] == ECMA_VALUE_EMPTY)
265425bb815Sopenharmony_ci  {
266425bb815Sopenharmony_ci    return ret_value;
267425bb815Sopenharmony_ci  }
268425bb815Sopenharmony_ci
269425bb815Sopenharmony_ci  ecma_string_t *name_p = ecma_get_string_from_value (arg_Literal_p[index]);
270425bb815Sopenharmony_ci
271425bb815Sopenharmony_ci  if (property_desc_p->flags & (ECMA_PROP_IS_GET_DEFINED | ECMA_PROP_IS_SET_DEFINED))
272425bb815Sopenharmony_ci  {
273425bb815Sopenharmony_ci    ecma_deref_ecma_string (name_p);
274425bb815Sopenharmony_ci    arg_Literal_p[index] = ECMA_VALUE_EMPTY;
275425bb815Sopenharmony_ci  }
276425bb815Sopenharmony_ci  else
277425bb815Sopenharmony_ci  {
278425bb815Sopenharmony_ci    if (property_desc_p->flags & ECMA_PROP_IS_VALUE_DEFINED)
279425bb815Sopenharmony_ci    {
280425bb815Sopenharmony_ci      /* emulating execution of function described by MakeArgSetter */
281425bb815Sopenharmony_ci      ecma_object_t *lex_env_p = ECMA_GET_INTERNAL_VALUE_POINTER (ecma_object_t,
282425bb815Sopenharmony_ci                                                                  ext_object_p->u.pseudo_array.u2.lex_env_cp);
283425bb815Sopenharmony_ci
284425bb815Sopenharmony_ci      ecma_value_t completion = ecma_op_set_mutable_binding (lex_env_p,
285425bb815Sopenharmony_ci                                                             name_p,
286425bb815Sopenharmony_ci                                                             property_desc_p->value,
287425bb815Sopenharmony_ci                                                             true);
288425bb815Sopenharmony_ci
289425bb815Sopenharmony_ci      JERRY_ASSERT (ecma_is_value_empty (completion));
290425bb815Sopenharmony_ci    }
291425bb815Sopenharmony_ci
292425bb815Sopenharmony_ci    if ((property_desc_p->flags & ECMA_PROP_IS_WRITABLE_DEFINED)
293425bb815Sopenharmony_ci        && !(property_desc_p->flags & ECMA_PROP_IS_WRITABLE))
294425bb815Sopenharmony_ci    {
295425bb815Sopenharmony_ci      ecma_deref_ecma_string (name_p);
296425bb815Sopenharmony_ci      arg_Literal_p[index] = ECMA_VALUE_EMPTY;
297425bb815Sopenharmony_ci    }
298425bb815Sopenharmony_ci  }
299425bb815Sopenharmony_ci
300425bb815Sopenharmony_ci  return ret_value;
301425bb815Sopenharmony_ci} /* ecma_op_arguments_object_define_own_property */
302425bb815Sopenharmony_ci
303425bb815Sopenharmony_ci/**
304425bb815Sopenharmony_ci * [[Delete]] ecma Arguments object's operation
305425bb815Sopenharmony_ci *
306425bb815Sopenharmony_ci * See also:
307425bb815Sopenharmony_ci *          ECMA-262 v5, 8.6.2; ECMA-262 v5, Table 8
308425bb815Sopenharmony_ci *          ECMA-262 v5, 10.6
309425bb815Sopenharmony_ci *
310425bb815Sopenharmony_ci * @return ecma value
311425bb815Sopenharmony_ci *         Returned value must be freed with ecma_free_value
312425bb815Sopenharmony_ci */
313425bb815Sopenharmony_ciecma_value_t
314425bb815Sopenharmony_ciecma_op_arguments_object_delete (ecma_object_t *object_p, /**< the object */
315425bb815Sopenharmony_ci                                 ecma_string_t *property_name_p, /**< property name */
316425bb815Sopenharmony_ci                                 bool is_throw) /**< flag that controls failure handling */
317425bb815Sopenharmony_ci{
318425bb815Sopenharmony_ci  /* 3. */
319425bb815Sopenharmony_ci  ecma_value_t ret_value = ecma_op_general_object_delete (object_p, property_name_p, is_throw);
320425bb815Sopenharmony_ci
321425bb815Sopenharmony_ci  if (ECMA_IS_VALUE_ERROR (ret_value))
322425bb815Sopenharmony_ci  {
323425bb815Sopenharmony_ci    return ret_value;
324425bb815Sopenharmony_ci  }
325425bb815Sopenharmony_ci
326425bb815Sopenharmony_ci  JERRY_ASSERT (ecma_is_value_boolean (ret_value));
327425bb815Sopenharmony_ci
328425bb815Sopenharmony_ci  if (ecma_is_value_true (ret_value))
329425bb815Sopenharmony_ci  {
330425bb815Sopenharmony_ci    uint32_t index = ecma_string_get_array_index (property_name_p);
331425bb815Sopenharmony_ci
332425bb815Sopenharmony_ci    if (index != ECMA_STRING_NOT_ARRAY_INDEX)
333425bb815Sopenharmony_ci    {
334425bb815Sopenharmony_ci      ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) object_p;
335425bb815Sopenharmony_ci
336425bb815Sopenharmony_ci      if (index < ext_object_p->u.pseudo_array.u1.length)
337425bb815Sopenharmony_ci      {
338425bb815Sopenharmony_ci        ecma_value_t *arg_Literal_p = (ecma_value_t *) (ext_object_p + 1);
339425bb815Sopenharmony_ci
340425bb815Sopenharmony_ci        if (arg_Literal_p[index] != ECMA_VALUE_EMPTY)
341425bb815Sopenharmony_ci        {
342425bb815Sopenharmony_ci          ecma_string_t *name_p = ecma_get_string_from_value (arg_Literal_p[index]);
343425bb815Sopenharmony_ci          ecma_deref_ecma_string (name_p);
344425bb815Sopenharmony_ci          arg_Literal_p[index] = ECMA_VALUE_EMPTY;
345425bb815Sopenharmony_ci        }
346425bb815Sopenharmony_ci      }
347425bb815Sopenharmony_ci    }
348425bb815Sopenharmony_ci
349425bb815Sopenharmony_ci    ret_value = ECMA_VALUE_TRUE;
350425bb815Sopenharmony_ci  }
351425bb815Sopenharmony_ci
352425bb815Sopenharmony_ci  return ret_value;
353425bb815Sopenharmony_ci} /* ecma_op_arguments_object_delete */
354425bb815Sopenharmony_ci
355425bb815Sopenharmony_ci/**
356425bb815Sopenharmony_ci * @}
357425bb815Sopenharmony_ci * @}
358425bb815Sopenharmony_ci */
359