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-conversion.h"
20425bb815Sopenharmony_ci#include "ecma-exceptions.h"
21425bb815Sopenharmony_ci#include "ecma-gc.h"
22425bb815Sopenharmony_ci#include "ecma-globals.h"
23425bb815Sopenharmony_ci#include "ecma-helpers.h"
24425bb815Sopenharmony_ci#include "ecma-objects.h"
25425bb815Sopenharmony_ci#include "ecma-proxy-object.h"
26425bb815Sopenharmony_ci#include "ecma-objects-general.h"
27425bb815Sopenharmony_ci#include "jrt.h"
28425bb815Sopenharmony_ci#include "ecma-builtin-object.h"
29425bb815Sopenharmony_ci
30425bb815Sopenharmony_ci#define ECMA_BUILTINS_INTERNAL
31425bb815Sopenharmony_ci#include "ecma-builtins-internal.h"
32425bb815Sopenharmony_ci
33425bb815Sopenharmony_ci/**
34425bb815Sopenharmony_ci * This object has a custom dispatch function.
35425bb815Sopenharmony_ci */
36425bb815Sopenharmony_ci#define BUILTIN_CUSTOM_DISPATCH
37425bb815Sopenharmony_ci
38425bb815Sopenharmony_ci/**
39425bb815Sopenharmony_ci * List of built-in routine identifiers.
40425bb815Sopenharmony_ci */
41425bb815Sopenharmony_cienum
42425bb815Sopenharmony_ci{
43425bb815Sopenharmony_ci  ECMA_OBJECT_ROUTINE_START = ECMA_BUILTIN_ID__COUNT - 1,
44425bb815Sopenharmony_ci
45425bb815Sopenharmony_ci  ECMA_OBJECT_ROUTINE_CREATE,
46425bb815Sopenharmony_ci  ECMA_OBJECT_ROUTINE_IS,
47425bb815Sopenharmony_ci  ECMA_OBJECT_ROUTINE_SET_PROTOTYPE_OF,
48425bb815Sopenharmony_ci
49425bb815Sopenharmony_ci  /* These should be in this order. */
50425bb815Sopenharmony_ci  ECMA_OBJECT_ROUTINE_DEFINE_PROPERTY,
51425bb815Sopenharmony_ci  ECMA_OBJECT_ROUTINE_DEFINE_PROPERTIES,
52425bb815Sopenharmony_ci
53425bb815Sopenharmony_ci  /* These should be in this order. */
54425bb815Sopenharmony_ci  ECMA_OBJECT_ROUTINE_ASSIGN,
55425bb815Sopenharmony_ci  ECMA_OBJECT_ROUTINE_GET_OWN_PROPERTY_DESCRIPTOR,
56425bb815Sopenharmony_ci  ECMA_OBJECT_ROUTINE_GET_OWN_PROPERTY_NAMES,
57425bb815Sopenharmony_ci  ECMA_OBJECT_ROUTINE_GET_OWN_PROPERTY_SYMBOLS,
58425bb815Sopenharmony_ci  ECMA_OBJECT_ROUTINE_GET_PROTOTYPE_OF,
59425bb815Sopenharmony_ci  ECMA_OBJECT_ROUTINE_KEYS,
60425bb815Sopenharmony_ci
61425bb815Sopenharmony_ci  /* These should be in this order. */
62425bb815Sopenharmony_ci  ECMA_OBJECT_ROUTINE_FREEZE,
63425bb815Sopenharmony_ci  ECMA_OBJECT_ROUTINE_PREVENT_EXTENSIONS,
64425bb815Sopenharmony_ci  ECMA_OBJECT_ROUTINE_SEAL,
65425bb815Sopenharmony_ci
66425bb815Sopenharmony_ci  /* These should be in this order. */
67425bb815Sopenharmony_ci  ECMA_OBJECT_ROUTINE_IS_EXTENSIBLE,
68425bb815Sopenharmony_ci  ECMA_OBJECT_ROUTINE_IS_FROZEN,
69425bb815Sopenharmony_ci  ECMA_OBJECT_ROUTINE_IS_SEALED,
70425bb815Sopenharmony_ci};
71425bb815Sopenharmony_ci
72425bb815Sopenharmony_ci#define BUILTIN_INC_HEADER_NAME "ecma-builtin-object.inc.h"
73425bb815Sopenharmony_ci#define BUILTIN_UNDERSCORED_ID object
74425bb815Sopenharmony_ci#include "ecma-builtin-internal-routines-template.inc.h"
75425bb815Sopenharmony_ci
76425bb815Sopenharmony_ci/** \addtogroup ecma ECMA
77425bb815Sopenharmony_ci * @{
78425bb815Sopenharmony_ci *
79425bb815Sopenharmony_ci * \addtogroup ecmabuiltins
80425bb815Sopenharmony_ci * @{
81425bb815Sopenharmony_ci *
82425bb815Sopenharmony_ci * \addtogroup object ECMA Object object built-in
83425bb815Sopenharmony_ci * @{
84425bb815Sopenharmony_ci */
85425bb815Sopenharmony_ci
86425bb815Sopenharmony_ci/**
87425bb815Sopenharmony_ci * Handle calling [[Call]] of built-in Object object
88425bb815Sopenharmony_ci *
89425bb815Sopenharmony_ci * @return ecma value
90425bb815Sopenharmony_ci */
91425bb815Sopenharmony_ciecma_value_t
92425bb815Sopenharmony_ciecma_builtin_object_dispatch_call (const ecma_value_t *arguments_list_p, /**< arguments list */
93425bb815Sopenharmony_ci                                   ecma_length_t arguments_list_len) /**< number of arguments */
94425bb815Sopenharmony_ci{
95425bb815Sopenharmony_ci  JERRY_ASSERT (arguments_list_len == 0 || arguments_list_p != NULL);
96425bb815Sopenharmony_ci
97425bb815Sopenharmony_ci  if (arguments_list_len == 0
98425bb815Sopenharmony_ci      || ecma_is_value_undefined (arguments_list_p[0])
99425bb815Sopenharmony_ci      || ecma_is_value_null (arguments_list_p[0]))
100425bb815Sopenharmony_ci  {
101425bb815Sopenharmony_ci    return ecma_builtin_object_dispatch_construct (arguments_list_p, arguments_list_len);
102425bb815Sopenharmony_ci  }
103425bb815Sopenharmony_ci
104425bb815Sopenharmony_ci  return ecma_op_to_object (arguments_list_p[0]);
105425bb815Sopenharmony_ci} /* ecma_builtin_object_dispatch_call */
106425bb815Sopenharmony_ci
107425bb815Sopenharmony_ci/**
108425bb815Sopenharmony_ci * Handle calling [[Construct]] of built-in Object object
109425bb815Sopenharmony_ci *
110425bb815Sopenharmony_ci * @return ecma value
111425bb815Sopenharmony_ci */
112425bb815Sopenharmony_ciecma_value_t
113425bb815Sopenharmony_ciecma_builtin_object_dispatch_construct (const ecma_value_t *arguments_list_p, /**< arguments list */
114425bb815Sopenharmony_ci                                        ecma_length_t arguments_list_len) /**< number of arguments */
115425bb815Sopenharmony_ci{
116425bb815Sopenharmony_ci  JERRY_ASSERT (arguments_list_len == 0 || arguments_list_p != NULL);
117425bb815Sopenharmony_ci
118425bb815Sopenharmony_ci  if (arguments_list_len == 0)
119425bb815Sopenharmony_ci  {
120425bb815Sopenharmony_ci    ecma_object_t *obj_p = ecma_op_create_object_object_noarg ();
121425bb815Sopenharmony_ci
122425bb815Sopenharmony_ci    return ecma_make_object_value (obj_p);
123425bb815Sopenharmony_ci  }
124425bb815Sopenharmony_ci
125425bb815Sopenharmony_ci  return ecma_op_create_object_object_arg (arguments_list_p[0]);
126425bb815Sopenharmony_ci} /* ecma_builtin_object_dispatch_construct */
127425bb815Sopenharmony_ci
128425bb815Sopenharmony_ci/**
129425bb815Sopenharmony_ci * The Object object's 'getPrototypeOf' routine
130425bb815Sopenharmony_ci *
131425bb815Sopenharmony_ci * See also:
132425bb815Sopenharmony_ci *          ECMA-262 v5, 15.2.3.2
133425bb815Sopenharmony_ci *
134425bb815Sopenharmony_ci * @return ecma value
135425bb815Sopenharmony_ci *         Returned value must be freed with ecma_free_value.
136425bb815Sopenharmony_ci */
137425bb815Sopenharmony_ciecma_value_t
138425bb815Sopenharmony_ciecma_builtin_object_object_get_prototype_of (ecma_object_t *obj_p) /**< routine's argument */
139425bb815Sopenharmony_ci{
140425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015_BUILTIN_PROXY)
141425bb815Sopenharmony_ci  if (ECMA_OBJECT_IS_PROXY (obj_p))
142425bb815Sopenharmony_ci  {
143425bb815Sopenharmony_ci    return ecma_proxy_object_get_prototype_of (obj_p);
144425bb815Sopenharmony_ci  }
145425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015_BUILTIN_PROXY) */
146425bb815Sopenharmony_ci
147425bb815Sopenharmony_ci  jmem_cpointer_t proto_cp = ecma_op_ordinary_object_get_prototype_of (obj_p);
148425bb815Sopenharmony_ci
149425bb815Sopenharmony_ci  if (proto_cp != JMEM_CP_NULL)
150425bb815Sopenharmony_ci  {
151425bb815Sopenharmony_ci    ecma_object_t *prototype_p = ECMA_GET_NON_NULL_POINTER (ecma_object_t, proto_cp);
152425bb815Sopenharmony_ci    ecma_ref_object (prototype_p);
153425bb815Sopenharmony_ci    return ecma_make_object_value (prototype_p);
154425bb815Sopenharmony_ci  }
155425bb815Sopenharmony_ci
156425bb815Sopenharmony_ci  return ECMA_VALUE_NULL;
157425bb815Sopenharmony_ci} /* ecma_builtin_object_object_get_prototype_of */
158425bb815Sopenharmony_ci
159425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015)
160425bb815Sopenharmony_ci/**
161425bb815Sopenharmony_ci * The Object object's 'setPrototypeOf' routine
162425bb815Sopenharmony_ci *
163425bb815Sopenharmony_ci * See also:
164425bb815Sopenharmony_ci *          ES2015 19.1.2.18
165425bb815Sopenharmony_ci *
166425bb815Sopenharmony_ci * @return ecma value
167425bb815Sopenharmony_ci *         Returned value must be freed with ecma_free_value.
168425bb815Sopenharmony_ci */
169425bb815Sopenharmony_ciecma_value_t
170425bb815Sopenharmony_ciecma_builtin_object_object_set_prototype_of (ecma_value_t arg1, /**< routine's first argument */
171425bb815Sopenharmony_ci                                             ecma_value_t arg2) /**< routine's second argument */
172425bb815Sopenharmony_ci{
173425bb815Sopenharmony_ci  /* 1., 2. */
174425bb815Sopenharmony_ci  if (ECMA_IS_VALUE_ERROR (ecma_op_check_object_coercible (arg1)))
175425bb815Sopenharmony_ci  {
176425bb815Sopenharmony_ci    return ECMA_VALUE_ERROR;
177425bb815Sopenharmony_ci  }
178425bb815Sopenharmony_ci
179425bb815Sopenharmony_ci  /* 3. */
180425bb815Sopenharmony_ci  if (!ecma_is_value_object (arg2) && !ecma_is_value_null (arg2))
181425bb815Sopenharmony_ci  {
182425bb815Sopenharmony_ci    return ecma_raise_type_error (ECMA_ERR_MSG ("proto is neither Object nor Null."));
183425bb815Sopenharmony_ci  }
184425bb815Sopenharmony_ci
185425bb815Sopenharmony_ci  /* 4. */
186425bb815Sopenharmony_ci  if (!ecma_is_value_object (arg1))
187425bb815Sopenharmony_ci  {
188425bb815Sopenharmony_ci    return ecma_copy_value (arg1);
189425bb815Sopenharmony_ci  }
190425bb815Sopenharmony_ci
191425bb815Sopenharmony_ci  ecma_object_t *obj_p = ecma_get_object_from_value (arg1);
192425bb815Sopenharmony_ci  ecma_value_t status;
193425bb815Sopenharmony_ci
194425bb815Sopenharmony_ci  /* 5. */
195425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015_BUILTIN_PROXY)
196425bb815Sopenharmony_ci  if (ECMA_OBJECT_IS_PROXY (obj_p))
197425bb815Sopenharmony_ci  {
198425bb815Sopenharmony_ci    status = ecma_proxy_object_set_prototype_of (obj_p, arg2);
199425bb815Sopenharmony_ci
200425bb815Sopenharmony_ci    if (ECMA_IS_VALUE_ERROR (status))
201425bb815Sopenharmony_ci    {
202425bb815Sopenharmony_ci      return status;
203425bb815Sopenharmony_ci    }
204425bb815Sopenharmony_ci  }
205425bb815Sopenharmony_ci  else
206425bb815Sopenharmony_ci  {
207425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015_BUILTIN_PROXY) */
208425bb815Sopenharmony_ci    status = ecma_op_ordinary_object_set_prototype_of (obj_p, arg2);
209425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015_BUILTIN_PROXY)
210425bb815Sopenharmony_ci  }
211425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015_BUILTIN_PROXY) */
212425bb815Sopenharmony_ci
213425bb815Sopenharmony_ci  if (ecma_is_value_false (status))
214425bb815Sopenharmony_ci  {
215425bb815Sopenharmony_ci    return ecma_raise_type_error (ECMA_ERR_MSG ("Cannot set [[Prototype]]."));
216425bb815Sopenharmony_ci  }
217425bb815Sopenharmony_ci
218425bb815Sopenharmony_ci  JERRY_ASSERT (ecma_is_value_true (status));
219425bb815Sopenharmony_ci  ecma_ref_object (obj_p);
220425bb815Sopenharmony_ci
221425bb815Sopenharmony_ci  return arg1;
222425bb815Sopenharmony_ci} /* ecma_builtin_object_object_set_prototype_of */
223425bb815Sopenharmony_ci
224425bb815Sopenharmony_ci/**
225425bb815Sopenharmony_ci * The Object object's set __proto__ routine
226425bb815Sopenharmony_ci *
227425bb815Sopenharmony_ci * See also:
228425bb815Sopenharmony_ci *          ECMA-262 v6, B.2.2.1.2
229425bb815Sopenharmony_ci *
230425bb815Sopenharmony_ci * @return ecma value
231425bb815Sopenharmony_ci *         Returned value must be freed with ecma_free_value.
232425bb815Sopenharmony_ci */
233425bb815Sopenharmony_ciecma_value_t
234425bb815Sopenharmony_ciecma_builtin_object_object_set_proto (ecma_value_t arg1, /**< routine's first argument */
235425bb815Sopenharmony_ci                                      ecma_value_t arg2) /**< routine's second argument */
236425bb815Sopenharmony_ci{
237425bb815Sopenharmony_ci  /* 1., 2. */
238425bb815Sopenharmony_ci  if (ECMA_IS_VALUE_ERROR (ecma_op_check_object_coercible (arg1)))
239425bb815Sopenharmony_ci  {
240425bb815Sopenharmony_ci    return ECMA_VALUE_ERROR;
241425bb815Sopenharmony_ci  }
242425bb815Sopenharmony_ci
243425bb815Sopenharmony_ci  /* 3. */
244425bb815Sopenharmony_ci  if (!ecma_is_value_object (arg2) && !ecma_is_value_null (arg2))
245425bb815Sopenharmony_ci  {
246425bb815Sopenharmony_ci    return ECMA_VALUE_UNDEFINED;
247425bb815Sopenharmony_ci  }
248425bb815Sopenharmony_ci
249425bb815Sopenharmony_ci  /* 4. */
250425bb815Sopenharmony_ci  if (!ecma_is_value_object (arg1))
251425bb815Sopenharmony_ci  {
252425bb815Sopenharmony_ci    return ECMA_VALUE_UNDEFINED;
253425bb815Sopenharmony_ci  }
254425bb815Sopenharmony_ci
255425bb815Sopenharmony_ci  ecma_object_t *obj_p = ecma_get_object_from_value (arg1);
256425bb815Sopenharmony_ci  ecma_value_t status;
257425bb815Sopenharmony_ci
258425bb815Sopenharmony_ci  /* 5. */
259425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015_BUILTIN_PROXY)
260425bb815Sopenharmony_ci  if (ECMA_OBJECT_IS_PROXY (obj_p))
261425bb815Sopenharmony_ci  {
262425bb815Sopenharmony_ci    status = ecma_proxy_object_set_prototype_of (obj_p, arg2);
263425bb815Sopenharmony_ci
264425bb815Sopenharmony_ci    if (ECMA_IS_VALUE_ERROR (status))
265425bb815Sopenharmony_ci    {
266425bb815Sopenharmony_ci      return status;
267425bb815Sopenharmony_ci    }
268425bb815Sopenharmony_ci  }
269425bb815Sopenharmony_ci  else
270425bb815Sopenharmony_ci  {
271425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015_BUILTIN_PROXY) */
272425bb815Sopenharmony_ci    status = ecma_op_ordinary_object_set_prototype_of (obj_p, arg2);
273425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015_BUILTIN_PROXY)
274425bb815Sopenharmony_ci  }
275425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015_BUILTIN_PROXY) */
276425bb815Sopenharmony_ci
277425bb815Sopenharmony_ci  if (ecma_is_value_false (status))
278425bb815Sopenharmony_ci  {
279425bb815Sopenharmony_ci    return ecma_raise_type_error (ECMA_ERR_MSG ("Cannot set [[Prototype]]."));
280425bb815Sopenharmony_ci  }
281425bb815Sopenharmony_ci
282425bb815Sopenharmony_ci  JERRY_ASSERT (ecma_is_value_true (status));
283425bb815Sopenharmony_ci
284425bb815Sopenharmony_ci  return ECMA_VALUE_UNDEFINED;
285425bb815Sopenharmony_ci} /* ecma_builtin_object_object_set_proto */
286425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015) */
287425bb815Sopenharmony_ci
288425bb815Sopenharmony_ci/**
289425bb815Sopenharmony_ci * The Object object's 'getOwnPropertyNames' routine
290425bb815Sopenharmony_ci *
291425bb815Sopenharmony_ci * See also:
292425bb815Sopenharmony_ci *          ECMA-262 v5, 15.2.3.4
293425bb815Sopenharmony_ci *
294425bb815Sopenharmony_ci * @return ecma value
295425bb815Sopenharmony_ci *         Returned value must be freed with ecma_free_value.
296425bb815Sopenharmony_ci */
297425bb815Sopenharmony_cistatic ecma_value_t
298425bb815Sopenharmony_ciecma_builtin_object_object_get_own_property_names (ecma_object_t *obj_p) /**< routine's argument */
299425bb815Sopenharmony_ci{
300425bb815Sopenharmony_ci  return ecma_builtin_helper_object_get_properties (obj_p, ECMA_LIST_NO_OPTS);
301425bb815Sopenharmony_ci} /* ecma_builtin_object_object_get_own_property_names */
302425bb815Sopenharmony_ci
303425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015)
304425bb815Sopenharmony_ci
305425bb815Sopenharmony_ci/**
306425bb815Sopenharmony_ci * The Object object's 'getOwnPropertySymbols' routine
307425bb815Sopenharmony_ci *
308425bb815Sopenharmony_ci * See also:
309425bb815Sopenharmony_ci *          ECMA-262 v6, 19.1.2.7
310425bb815Sopenharmony_ci *
311425bb815Sopenharmony_ci * @return ecma value
312425bb815Sopenharmony_ci *         Returned value must be freed with ecma_free_value.
313425bb815Sopenharmony_ci */
314425bb815Sopenharmony_cistatic ecma_value_t
315425bb815Sopenharmony_ciecma_builtin_object_object_get_own_property_symbols (ecma_object_t *obj_p) /**< routine's argument */
316425bb815Sopenharmony_ci{
317425bb815Sopenharmony_ci  return ecma_builtin_helper_object_get_properties (obj_p, ECMA_LIST_SYMBOLS_ONLY);
318425bb815Sopenharmony_ci} /* ecma_builtin_object_object_get_own_property_symbols */
319425bb815Sopenharmony_ci
320425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015) */
321425bb815Sopenharmony_ci
322425bb815Sopenharmony_ci/**
323425bb815Sopenharmony_ci * SetIntegrityLevel operation
324425bb815Sopenharmony_ci *
325425bb815Sopenharmony_ci * See also:
326425bb815Sopenharmony_ci *          ECMA-262 v6, 7.3.14
327425bb815Sopenharmony_ci *
328425bb815Sopenharmony_ci * @return ECMA_VALUE_ERROR - if the operation raised an error
329425bb815Sopenharmony_ci *         ECMA_VALUE_{TRUE/FALSE} - depends on whether the integrity level has been set sucessfully
330425bb815Sopenharmony_ci */
331425bb815Sopenharmony_cistatic ecma_value_t
332425bb815Sopenharmony_ciecma_builtin_object_set_integrity_level (ecma_object_t *obj_p, /**< object */
333425bb815Sopenharmony_ci                                         bool is_seal) /**< true - set "sealed"
334425bb815Sopenharmony_ci                                                        *   false - set "frozen" */
335425bb815Sopenharmony_ci{
336425bb815Sopenharmony_ci  /* 3. */
337425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015_BUILTIN_PROXY)
338425bb815Sopenharmony_ci  if (ECMA_OBJECT_IS_PROXY (obj_p))
339425bb815Sopenharmony_ci  {
340425bb815Sopenharmony_ci    ecma_value_t status = ecma_proxy_object_prevent_extensions (obj_p);
341425bb815Sopenharmony_ci
342425bb815Sopenharmony_ci    if (!ecma_is_value_true (status))
343425bb815Sopenharmony_ci    {
344425bb815Sopenharmony_ci      return status;
345425bb815Sopenharmony_ci    }
346425bb815Sopenharmony_ci  }
347425bb815Sopenharmony_ci  else
348425bb815Sopenharmony_ci  {
349425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015_BUILTIN_PROXY) */
350425bb815Sopenharmony_ci    ecma_op_ordinary_object_prevent_extensions (obj_p);
351425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015_BUILTIN_PROXY)
352425bb815Sopenharmony_ci  }
353425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015_BUILTIN_PROXY) */
354425bb815Sopenharmony_ci
355425bb815Sopenharmony_ci  /* 6. */
356425bb815Sopenharmony_ci  uint32_t opts = ECMA_LIST_CONVERT_FAST_ARRAYS;
357425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015)
358425bb815Sopenharmony_ci  opts |= ECMA_LIST_SYMBOLS;
359425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015) */
360425bb815Sopenharmony_ci
361425bb815Sopenharmony_ci  ecma_collection_t *props_p = ecma_op_object_get_property_names (obj_p, opts);
362425bb815Sopenharmony_ci
363425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015_BUILTIN_PROXY)
364425bb815Sopenharmony_ci  if (props_p == NULL)
365425bb815Sopenharmony_ci  {
366425bb815Sopenharmony_ci    return ECMA_VALUE_ERROR;
367425bb815Sopenharmony_ci  }
368425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015_BUILTIN_PROXY) */
369425bb815Sopenharmony_ci
370425bb815Sopenharmony_ci  ecma_value_t *buffer_p = props_p->buffer_p;
371425bb815Sopenharmony_ci
372425bb815Sopenharmony_ci  if (is_seal)
373425bb815Sopenharmony_ci  {
374425bb815Sopenharmony_ci    /* 8.a */
375425bb815Sopenharmony_ci    for (uint32_t i = 0; i < props_p->item_count; i++)
376425bb815Sopenharmony_ci    {
377425bb815Sopenharmony_ci      ecma_string_t *property_name_p = ecma_get_prop_name_from_value (buffer_p[i]);
378425bb815Sopenharmony_ci
379425bb815Sopenharmony_ci      ecma_property_descriptor_t prop_desc;
380425bb815Sopenharmony_ci      ecma_value_t status = ecma_op_object_get_own_property_descriptor (obj_p, property_name_p, &prop_desc);
381425bb815Sopenharmony_ci
382425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015_BUILTIN_PROXY)
383425bb815Sopenharmony_ci      if (ECMA_IS_VALUE_ERROR (status))
384425bb815Sopenharmony_ci      {
385425bb815Sopenharmony_ci        break;
386425bb815Sopenharmony_ci      }
387425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015_BUILTIN_PROXY) */
388425bb815Sopenharmony_ci
389425bb815Sopenharmony_ci      if (ecma_is_value_false (status))
390425bb815Sopenharmony_ci      {
391425bb815Sopenharmony_ci        continue;
392425bb815Sopenharmony_ci      }
393425bb815Sopenharmony_ci
394425bb815Sopenharmony_ci      prop_desc.flags &= (uint16_t) ~ECMA_PROP_IS_CONFIGURABLE;
395425bb815Sopenharmony_ci      prop_desc.flags |= ECMA_PROP_IS_THROW;
396425bb815Sopenharmony_ci
397425bb815Sopenharmony_ci      /* 8.a.i */
398425bb815Sopenharmony_ci      ecma_value_t define_own_prop_ret = ecma_op_object_define_own_property (obj_p,
399425bb815Sopenharmony_ci                                                                             property_name_p,
400425bb815Sopenharmony_ci                                                                             &prop_desc);
401425bb815Sopenharmony_ci
402425bb815Sopenharmony_ci      ecma_free_property_descriptor (&prop_desc);
403425bb815Sopenharmony_ci
404425bb815Sopenharmony_ci      /* 8.a.ii */
405425bb815Sopenharmony_ci      if (ECMA_IS_VALUE_ERROR (define_own_prop_ret))
406425bb815Sopenharmony_ci      {
407425bb815Sopenharmony_ci        ecma_collection_free (props_p);
408425bb815Sopenharmony_ci        return define_own_prop_ret;
409425bb815Sopenharmony_ci      }
410425bb815Sopenharmony_ci
411425bb815Sopenharmony_ci      ecma_free_value (define_own_prop_ret);
412425bb815Sopenharmony_ci    }
413425bb815Sopenharmony_ci  }
414425bb815Sopenharmony_ci  else
415425bb815Sopenharmony_ci  {
416425bb815Sopenharmony_ci    /* 9.a */
417425bb815Sopenharmony_ci    for (uint32_t i = 0; i < props_p->item_count; i++)
418425bb815Sopenharmony_ci    {
419425bb815Sopenharmony_ci      ecma_string_t *property_name_p = ecma_get_prop_name_from_value (buffer_p[i]);
420425bb815Sopenharmony_ci
421425bb815Sopenharmony_ci      /* 9.1 */
422425bb815Sopenharmony_ci      ecma_property_descriptor_t prop_desc;
423425bb815Sopenharmony_ci      ecma_value_t status = ecma_op_object_get_own_property_descriptor (obj_p, property_name_p, &prop_desc);
424425bb815Sopenharmony_ci
425425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015_BUILTIN_PROXY)
426425bb815Sopenharmony_ci      if (ECMA_IS_VALUE_ERROR (status))
427425bb815Sopenharmony_ci      {
428425bb815Sopenharmony_ci        break;
429425bb815Sopenharmony_ci      }
430425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015_BUILTIN_PROXY) */
431425bb815Sopenharmony_ci
432425bb815Sopenharmony_ci      if (ecma_is_value_false (status))
433425bb815Sopenharmony_ci      {
434425bb815Sopenharmony_ci        continue;
435425bb815Sopenharmony_ci      }
436425bb815Sopenharmony_ci
437425bb815Sopenharmony_ci      /* 9.2 */
438425bb815Sopenharmony_ci      if ((prop_desc.flags & (ECMA_PROP_IS_WRITABLE_DEFINED | ECMA_PROP_IS_WRITABLE))
439425bb815Sopenharmony_ci          == (ECMA_PROP_IS_WRITABLE_DEFINED | ECMA_PROP_IS_WRITABLE))
440425bb815Sopenharmony_ci      {
441425bb815Sopenharmony_ci        prop_desc.flags &= (uint16_t) ~ECMA_PROP_IS_WRITABLE;
442425bb815Sopenharmony_ci      }
443425bb815Sopenharmony_ci
444425bb815Sopenharmony_ci      prop_desc.flags &= (uint16_t) ~ECMA_PROP_IS_CONFIGURABLE;
445425bb815Sopenharmony_ci      prop_desc.flags |= ECMA_PROP_IS_THROW;
446425bb815Sopenharmony_ci
447425bb815Sopenharmony_ci      /* 9.3 */
448425bb815Sopenharmony_ci      ecma_value_t define_own_prop_ret = ecma_op_object_define_own_property (obj_p,
449425bb815Sopenharmony_ci                                                                             property_name_p,
450425bb815Sopenharmony_ci                                                                             &prop_desc);
451425bb815Sopenharmony_ci
452425bb815Sopenharmony_ci      ecma_free_property_descriptor (&prop_desc);
453425bb815Sopenharmony_ci
454425bb815Sopenharmony_ci      /* 9.4 */
455425bb815Sopenharmony_ci      if (ECMA_IS_VALUE_ERROR (define_own_prop_ret))
456425bb815Sopenharmony_ci      {
457425bb815Sopenharmony_ci        ecma_collection_free (props_p);
458425bb815Sopenharmony_ci        return define_own_prop_ret;
459425bb815Sopenharmony_ci      }
460425bb815Sopenharmony_ci
461425bb815Sopenharmony_ci      ecma_free_value (define_own_prop_ret);
462425bb815Sopenharmony_ci    }
463425bb815Sopenharmony_ci
464425bb815Sopenharmony_ci  }
465425bb815Sopenharmony_ci
466425bb815Sopenharmony_ci  ecma_collection_free (props_p);
467425bb815Sopenharmony_ci
468425bb815Sopenharmony_ci  return ECMA_VALUE_TRUE;
469425bb815Sopenharmony_ci} /* ecma_builtin_object_set_integrity_level */
470425bb815Sopenharmony_ci
471425bb815Sopenharmony_ci/**
472425bb815Sopenharmony_ci * The Object object's 'seal' routine
473425bb815Sopenharmony_ci *
474425bb815Sopenharmony_ci * See also:
475425bb815Sopenharmony_ci *          ECMA-262 v5, 15.2.3.8
476425bb815Sopenharmony_ci *
477425bb815Sopenharmony_ci * @return ecma value
478425bb815Sopenharmony_ci *         Returned value must be freed with ecma_free_value.
479425bb815Sopenharmony_ci */
480425bb815Sopenharmony_cistatic ecma_value_t
481425bb815Sopenharmony_ciecma_builtin_object_object_seal (ecma_object_t *obj_p) /**< routine's argument */
482425bb815Sopenharmony_ci{
483425bb815Sopenharmony_ci  ecma_value_t status = ecma_builtin_object_set_integrity_level (obj_p, true);
484425bb815Sopenharmony_ci
485425bb815Sopenharmony_ci  if (ECMA_IS_VALUE_ERROR (status))
486425bb815Sopenharmony_ci  {
487425bb815Sopenharmony_ci    return status;
488425bb815Sopenharmony_ci  }
489425bb815Sopenharmony_ci
490425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015_BUILTIN_PROXY)
491425bb815Sopenharmony_ci  if (ecma_is_value_false (status))
492425bb815Sopenharmony_ci  {
493425bb815Sopenharmony_ci    return ecma_raise_type_error (ECMA_ERR_MSG ("Object cannot be sealed."));
494425bb815Sopenharmony_ci  }
495425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015_BUILTIN_PROXY) */
496425bb815Sopenharmony_ci
497425bb815Sopenharmony_ci  /* 4. */
498425bb815Sopenharmony_ci  ecma_ref_object (obj_p);
499425bb815Sopenharmony_ci  return ecma_make_object_value (obj_p);
500425bb815Sopenharmony_ci} /* ecma_builtin_object_object_seal */
501425bb815Sopenharmony_ci
502425bb815Sopenharmony_ci/**
503425bb815Sopenharmony_ci * The Object object's 'freeze' routine
504425bb815Sopenharmony_ci *
505425bb815Sopenharmony_ci * See also:
506425bb815Sopenharmony_ci *          ECMA-262 v5, 15.2.3.9
507425bb815Sopenharmony_ci *
508425bb815Sopenharmony_ci * @return ecma value
509425bb815Sopenharmony_ci *         Returned value must be freed with ecma_free_value.
510425bb815Sopenharmony_ci */
511425bb815Sopenharmony_cistatic ecma_value_t
512425bb815Sopenharmony_ciecma_builtin_object_object_freeze (ecma_object_t *obj_p) /**< routine's argument */
513425bb815Sopenharmony_ci{
514425bb815Sopenharmony_ci  ecma_value_t status = ecma_builtin_object_set_integrity_level (obj_p, false);
515425bb815Sopenharmony_ci
516425bb815Sopenharmony_ci  if (ECMA_IS_VALUE_ERROR (status))
517425bb815Sopenharmony_ci  {
518425bb815Sopenharmony_ci    return status;
519425bb815Sopenharmony_ci  }
520425bb815Sopenharmony_ci
521425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015_BUILTIN_PROXY)
522425bb815Sopenharmony_ci  if (ecma_is_value_false (status))
523425bb815Sopenharmony_ci  {
524425bb815Sopenharmony_ci    return ecma_raise_type_error (ECMA_ERR_MSG ("Object cannot be frozen."));
525425bb815Sopenharmony_ci  }
526425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015_BUILTIN_PROXY) */
527425bb815Sopenharmony_ci
528425bb815Sopenharmony_ci  /* 4. */
529425bb815Sopenharmony_ci  ecma_ref_object (obj_p);
530425bb815Sopenharmony_ci  return ecma_make_object_value (obj_p);
531425bb815Sopenharmony_ci} /* ecma_builtin_object_object_freeze */
532425bb815Sopenharmony_ci
533425bb815Sopenharmony_ci/**
534425bb815Sopenharmony_ci * The Object object's 'preventExtensions' routine
535425bb815Sopenharmony_ci *
536425bb815Sopenharmony_ci * See also:
537425bb815Sopenharmony_ci *          ECMA-262 v5, 15.2.3.10
538425bb815Sopenharmony_ci *
539425bb815Sopenharmony_ci * @return ecma value
540425bb815Sopenharmony_ci *         Returned value must be freed with ecma_free_value.
541425bb815Sopenharmony_ci */
542425bb815Sopenharmony_ciecma_value_t
543425bb815Sopenharmony_ciecma_builtin_object_object_prevent_extensions (ecma_object_t *obj_p) /**< routine's argument */
544425bb815Sopenharmony_ci{
545425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015_BUILTIN_PROXY)
546425bb815Sopenharmony_ci  if (ECMA_OBJECT_IS_PROXY (obj_p))
547425bb815Sopenharmony_ci  {
548425bb815Sopenharmony_ci    ecma_value_t status = ecma_proxy_object_prevent_extensions (obj_p);
549425bb815Sopenharmony_ci
550425bb815Sopenharmony_ci    if (ECMA_IS_VALUE_ERROR (status))
551425bb815Sopenharmony_ci    {
552425bb815Sopenharmony_ci      return status;
553425bb815Sopenharmony_ci    }
554425bb815Sopenharmony_ci
555425bb815Sopenharmony_ci    if (ecma_is_value_false (status))
556425bb815Sopenharmony_ci    {
557425bb815Sopenharmony_ci      return ecma_raise_type_error (ECMA_ERR_MSG ("Cannot set [[Extensible]] property of the object."));
558425bb815Sopenharmony_ci    }
559425bb815Sopenharmony_ci
560425bb815Sopenharmony_ci    JERRY_ASSERT (ecma_is_value_true (status));
561425bb815Sopenharmony_ci  }
562425bb815Sopenharmony_ci  else
563425bb815Sopenharmony_ci  {
564425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015_BUILTIN_PROXY) */
565425bb815Sopenharmony_ci    ecma_op_ordinary_object_prevent_extensions (obj_p);
566425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015_BUILTIN_PROXY)
567425bb815Sopenharmony_ci  }
568425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015_BUILTIN_PROXY) */
569425bb815Sopenharmony_ci  ecma_ref_object (obj_p);
570425bb815Sopenharmony_ci
571425bb815Sopenharmony_ci  return ecma_make_object_value (obj_p);
572425bb815Sopenharmony_ci} /* ecma_builtin_object_object_prevent_extensions */
573425bb815Sopenharmony_ci
574425bb815Sopenharmony_ci/**
575425bb815Sopenharmony_ci * The Object object's 'isSealed' and 'isFrozen' routines
576425bb815Sopenharmony_ci *
577425bb815Sopenharmony_ci * See also:
578425bb815Sopenharmony_ci *         ECMA-262 v5, 15.2.3.11
579425bb815Sopenharmony_ci *         ECMA-262 v5, 15.2.3.12
580425bb815Sopenharmony_ci *
581425bb815Sopenharmony_ci * @return ecma value
582425bb815Sopenharmony_ci *         Returned value must be freed with ecma_free_value.
583425bb815Sopenharmony_ci */
584425bb815Sopenharmony_cistatic ecma_value_t
585425bb815Sopenharmony_ciecma_builtin_object_test_integrity_level (ecma_object_t *obj_p, /**< routine's argument */
586425bb815Sopenharmony_ci                                          int mode) /**< routine mode */
587425bb815Sopenharmony_ci{
588425bb815Sopenharmony_ci  JERRY_ASSERT (mode == ECMA_OBJECT_ROUTINE_IS_FROZEN || mode == ECMA_OBJECT_ROUTINE_IS_SEALED);
589425bb815Sopenharmony_ci
590425bb815Sopenharmony_ci  /* 3. */
591425bb815Sopenharmony_ci  bool is_extensible;
592425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015_BUILTIN_PROXY)
593425bb815Sopenharmony_ci  if (ECMA_OBJECT_IS_PROXY (obj_p))
594425bb815Sopenharmony_ci  {
595425bb815Sopenharmony_ci    ecma_value_t status = ecma_proxy_object_is_extensible (obj_p);
596425bb815Sopenharmony_ci
597425bb815Sopenharmony_ci    if (ECMA_IS_VALUE_ERROR (status))
598425bb815Sopenharmony_ci    {
599425bb815Sopenharmony_ci      return status;
600425bb815Sopenharmony_ci    }
601425bb815Sopenharmony_ci
602425bb815Sopenharmony_ci    is_extensible = ecma_is_value_true (status);
603425bb815Sopenharmony_ci  }
604425bb815Sopenharmony_ci  else
605425bb815Sopenharmony_ci  {
606425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015_BUILTIN_PROXY) */
607425bb815Sopenharmony_ci    is_extensible = ecma_op_ordinary_object_is_extensible (obj_p);
608425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015_BUILTIN_PROXY)
609425bb815Sopenharmony_ci  }
610425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015_BUILTIN_PROXY) */
611425bb815Sopenharmony_ci
612425bb815Sopenharmony_ci  if (is_extensible)
613425bb815Sopenharmony_ci  {
614425bb815Sopenharmony_ci    return ECMA_VALUE_FALSE;
615425bb815Sopenharmony_ci  }
616425bb815Sopenharmony_ci
617425bb815Sopenharmony_ci  /* the value can be updated in the loop below */
618425bb815Sopenharmony_ci  ecma_value_t ret_value = ECMA_VALUE_TRUE;
619425bb815Sopenharmony_ci
620425bb815Sopenharmony_ci  /* 2. */
621425bb815Sopenharmony_ci  ecma_collection_t *props_p = ecma_op_object_get_property_names (obj_p, ECMA_LIST_NO_OPTS);
622425bb815Sopenharmony_ci
623425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015_BUILTIN_PROXY)
624425bb815Sopenharmony_ci  if (props_p == NULL)
625425bb815Sopenharmony_ci  {
626425bb815Sopenharmony_ci    return ECMA_VALUE_ERROR;
627425bb815Sopenharmony_ci  }
628425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015_BUILTIN_PROXY) */
629425bb815Sopenharmony_ci
630425bb815Sopenharmony_ci  ecma_value_t *buffer_p = props_p->buffer_p;
631425bb815Sopenharmony_ci
632425bb815Sopenharmony_ci  for (uint32_t i = 0; i < props_p->item_count; i++)
633425bb815Sopenharmony_ci  {
634425bb815Sopenharmony_ci    ecma_string_t *property_name_p = ecma_get_string_from_value (buffer_p[i]);
635425bb815Sopenharmony_ci
636425bb815Sopenharmony_ci    /* 2.a */
637425bb815Sopenharmony_ci    ecma_property_descriptor_t prop_desc;
638425bb815Sopenharmony_ci    ecma_value_t status = ecma_op_object_get_own_property_descriptor (obj_p, property_name_p, &prop_desc);
639425bb815Sopenharmony_ci
640425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015_BUILTIN_PROXY)
641425bb815Sopenharmony_ci    if (ECMA_IS_VALUE_ERROR (status))
642425bb815Sopenharmony_ci    {
643425bb815Sopenharmony_ci      ret_value = status;
644425bb815Sopenharmony_ci      break;
645425bb815Sopenharmony_ci    }
646425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015_BUILTIN_PROXY) */
647425bb815Sopenharmony_ci
648425bb815Sopenharmony_ci    if (ecma_is_value_false (status))
649425bb815Sopenharmony_ci    {
650425bb815Sopenharmony_ci      continue;
651425bb815Sopenharmony_ci    }
652425bb815Sopenharmony_ci
653425bb815Sopenharmony_ci    bool is_writable_data = ((prop_desc.flags & (ECMA_PROP_IS_VALUE_DEFINED | ECMA_PROP_IS_WRITABLE))
654425bb815Sopenharmony_ci                             == (ECMA_PROP_IS_VALUE_DEFINED | ECMA_PROP_IS_WRITABLE));
655425bb815Sopenharmony_ci    bool is_configurable = (prop_desc.flags & ECMA_PROP_IS_CONFIGURABLE);
656425bb815Sopenharmony_ci
657425bb815Sopenharmony_ci    ecma_free_property_descriptor (&prop_desc);
658425bb815Sopenharmony_ci
659425bb815Sopenharmony_ci    /* 2.b for isFrozen */
660425bb815Sopenharmony_ci    /* 2.b for isSealed, 2.c for isFrozen */
661425bb815Sopenharmony_ci    if ((mode == ECMA_OBJECT_ROUTINE_IS_FROZEN && is_writable_data)
662425bb815Sopenharmony_ci        || is_configurable)
663425bb815Sopenharmony_ci    {
664425bb815Sopenharmony_ci      ret_value = ECMA_VALUE_FALSE;
665425bb815Sopenharmony_ci      break;
666425bb815Sopenharmony_ci    }
667425bb815Sopenharmony_ci  }
668425bb815Sopenharmony_ci
669425bb815Sopenharmony_ci  ecma_collection_free (props_p);
670425bb815Sopenharmony_ci
671425bb815Sopenharmony_ci  return ret_value;
672425bb815Sopenharmony_ci} /* ecma_builtin_object_test_integrity_level */
673425bb815Sopenharmony_ci
674425bb815Sopenharmony_ci/**
675425bb815Sopenharmony_ci * The Object object's 'isExtensible' routine
676425bb815Sopenharmony_ci *
677425bb815Sopenharmony_ci * See also:
678425bb815Sopenharmony_ci *          ECMA-262 v5, 15.2.3.13
679425bb815Sopenharmony_ci *
680425bb815Sopenharmony_ci * @return ecma value
681425bb815Sopenharmony_ci *         Returned value must be freed with ecma_free_value.
682425bb815Sopenharmony_ci */
683425bb815Sopenharmony_ciecma_value_t
684425bb815Sopenharmony_ciecma_builtin_object_object_is_extensible (ecma_object_t *obj_p) /**< routine's argument */
685425bb815Sopenharmony_ci{
686425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015_BUILTIN_PROXY)
687425bb815Sopenharmony_ci  if (ECMA_OBJECT_IS_PROXY (obj_p))
688425bb815Sopenharmony_ci  {
689425bb815Sopenharmony_ci    return ecma_proxy_object_is_extensible (obj_p);
690425bb815Sopenharmony_ci  }
691425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015_BUILTIN_PROXY) */
692425bb815Sopenharmony_ci
693425bb815Sopenharmony_ci  return ecma_make_boolean_value (ecma_op_ordinary_object_is_extensible (obj_p));
694425bb815Sopenharmony_ci} /* ecma_builtin_object_object_is_extensible */
695425bb815Sopenharmony_ci
696425bb815Sopenharmony_ci/**
697425bb815Sopenharmony_ci * The Object object's 'keys' routine
698425bb815Sopenharmony_ci *
699425bb815Sopenharmony_ci * See also:
700425bb815Sopenharmony_ci *          ECMA-262 v5, 15.2.3.14
701425bb815Sopenharmony_ci *
702425bb815Sopenharmony_ci * @return ecma value
703425bb815Sopenharmony_ci *         Returned value must be freed with ecma_free_value.
704425bb815Sopenharmony_ci */
705425bb815Sopenharmony_cistatic ecma_value_t
706425bb815Sopenharmony_ciecma_builtin_object_object_keys (ecma_object_t *obj_p) /**< routine's argument */
707425bb815Sopenharmony_ci{
708425bb815Sopenharmony_ci  return ecma_builtin_helper_object_get_properties (obj_p, ECMA_LIST_ENUMERABLE);
709425bb815Sopenharmony_ci} /* ecma_builtin_object_object_keys */
710425bb815Sopenharmony_ci
711425bb815Sopenharmony_ci/**
712425bb815Sopenharmony_ci * The Object object's 'getOwnPropertyDescriptor' routine
713425bb815Sopenharmony_ci *
714425bb815Sopenharmony_ci * See also:
715425bb815Sopenharmony_ci *          ECMA-262 v5, 15.2.3.3
716425bb815Sopenharmony_ci *
717425bb815Sopenharmony_ci * @return ecma value
718425bb815Sopenharmony_ci *         Returned value must be freed with ecma_free_value.
719425bb815Sopenharmony_ci */
720425bb815Sopenharmony_ciecma_value_t
721425bb815Sopenharmony_ciecma_builtin_object_object_get_own_property_descriptor (ecma_object_t *obj_p, /**< routine's first argument */
722425bb815Sopenharmony_ci                                                        ecma_string_t *name_str_p) /**< routine's second argument */
723425bb815Sopenharmony_ci{
724425bb815Sopenharmony_ci  /* 3. */
725425bb815Sopenharmony_ci  ecma_property_descriptor_t prop_desc;
726425bb815Sopenharmony_ci
727425bb815Sopenharmony_ci  ecma_value_t status = ecma_op_object_get_own_property_descriptor (obj_p, name_str_p, &prop_desc);
728425bb815Sopenharmony_ci
729425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015_BUILTIN_PROXY)
730425bb815Sopenharmony_ci  if (ECMA_IS_VALUE_ERROR (status))
731425bb815Sopenharmony_ci  {
732425bb815Sopenharmony_ci    return status;
733425bb815Sopenharmony_ci  }
734425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015_BUILTIN_PROXY) */
735425bb815Sopenharmony_ci
736425bb815Sopenharmony_ci  if (ecma_is_value_true (status))
737425bb815Sopenharmony_ci  {
738425bb815Sopenharmony_ci    /* 4. */
739425bb815Sopenharmony_ci    ecma_object_t *desc_obj_p = ecma_op_from_property_descriptor (&prop_desc);
740425bb815Sopenharmony_ci
741425bb815Sopenharmony_ci    ecma_free_property_descriptor (&prop_desc);
742425bb815Sopenharmony_ci
743425bb815Sopenharmony_ci    return ecma_make_object_value (desc_obj_p);
744425bb815Sopenharmony_ci  }
745425bb815Sopenharmony_ci
746425bb815Sopenharmony_ci  return ECMA_VALUE_UNDEFINED;
747425bb815Sopenharmony_ci} /* ecma_builtin_object_object_get_own_property_descriptor */
748425bb815Sopenharmony_ci
749425bb815Sopenharmony_ci/**
750425bb815Sopenharmony_ci * The Object object's 'defineProperties' routine
751425bb815Sopenharmony_ci *
752425bb815Sopenharmony_ci * See also:
753425bb815Sopenharmony_ci *          ECMA-262 v5, 15.2.3.7
754425bb815Sopenharmony_ci *
755425bb815Sopenharmony_ci * @return ecma value
756425bb815Sopenharmony_ci *         Returned value must be freed with ecma_free_value.
757425bb815Sopenharmony_ci */
758425bb815Sopenharmony_cistatic ecma_value_t
759425bb815Sopenharmony_ciecma_builtin_object_object_define_properties (ecma_object_t *obj_p, /**< routine's first argument */
760425bb815Sopenharmony_ci                                              ecma_value_t arg2) /**< routine's second argument */
761425bb815Sopenharmony_ci{
762425bb815Sopenharmony_ci  /* 2. */
763425bb815Sopenharmony_ci  ecma_value_t props = ecma_op_to_object (arg2);
764425bb815Sopenharmony_ci
765425bb815Sopenharmony_ci  if (ECMA_IS_VALUE_ERROR (props))
766425bb815Sopenharmony_ci  {
767425bb815Sopenharmony_ci    return props;
768425bb815Sopenharmony_ci  }
769425bb815Sopenharmony_ci
770425bb815Sopenharmony_ci  ecma_object_t *props_p = ecma_get_object_from_value (props);
771425bb815Sopenharmony_ci  /* 3. */
772425bb815Sopenharmony_ci  ecma_collection_t *prop_names_p = ecma_op_object_get_property_names (props_p, ECMA_LIST_CONVERT_FAST_ARRAYS
773425bb815Sopenharmony_ci                                                                                | ECMA_LIST_ENUMERABLE);
774425bb815Sopenharmony_ci  ecma_value_t ret_value = ECMA_VALUE_ERROR;
775425bb815Sopenharmony_ci
776425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015_BUILTIN_PROXY)
777425bb815Sopenharmony_ci  if (prop_names_p == NULL)
778425bb815Sopenharmony_ci  {
779425bb815Sopenharmony_ci    ecma_deref_object (props_p);
780425bb815Sopenharmony_ci    return ret_value;
781425bb815Sopenharmony_ci  }
782425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015_BUILTIN_PROXY) */
783425bb815Sopenharmony_ci
784425bb815Sopenharmony_ci  ecma_value_t *buffer_p = prop_names_p->buffer_p;
785425bb815Sopenharmony_ci
786425bb815Sopenharmony_ci  /* 4. */
787425bb815Sopenharmony_ci  JMEM_DEFINE_LOCAL_ARRAY (property_descriptors, prop_names_p->item_count, ecma_property_descriptor_t);
788425bb815Sopenharmony_ci  uint32_t property_descriptor_number = 0;
789425bb815Sopenharmony_ci
790425bb815Sopenharmony_ci  for (uint32_t i = 0; i < prop_names_p->item_count; i++)
791425bb815Sopenharmony_ci  {
792425bb815Sopenharmony_ci    /* 5.a */
793425bb815Sopenharmony_ci    ecma_value_t desc_obj = ecma_op_object_get (props_p, ecma_get_string_from_value (buffer_p[i]));
794425bb815Sopenharmony_ci
795425bb815Sopenharmony_ci    if (ECMA_IS_VALUE_ERROR (desc_obj))
796425bb815Sopenharmony_ci    {
797425bb815Sopenharmony_ci      goto cleanup;
798425bb815Sopenharmony_ci    }
799425bb815Sopenharmony_ci
800425bb815Sopenharmony_ci    /* 5.b */
801425bb815Sopenharmony_ci    ecma_value_t conv_result = ecma_op_to_property_descriptor (desc_obj,
802425bb815Sopenharmony_ci                                                               &property_descriptors[property_descriptor_number]);
803425bb815Sopenharmony_ci
804425bb815Sopenharmony_ci    property_descriptors[property_descriptor_number].flags |= ECMA_PROP_IS_THROW;
805425bb815Sopenharmony_ci
806425bb815Sopenharmony_ci    ecma_free_value (desc_obj);
807425bb815Sopenharmony_ci
808425bb815Sopenharmony_ci    if (ECMA_IS_VALUE_ERROR (conv_result))
809425bb815Sopenharmony_ci    {
810425bb815Sopenharmony_ci      goto cleanup;
811425bb815Sopenharmony_ci    }
812425bb815Sopenharmony_ci
813425bb815Sopenharmony_ci    property_descriptor_number++;
814425bb815Sopenharmony_ci
815425bb815Sopenharmony_ci    ecma_free_value (conv_result);
816425bb815Sopenharmony_ci  }
817425bb815Sopenharmony_ci
818425bb815Sopenharmony_ci  /* 6. */
819425bb815Sopenharmony_ci  buffer_p = prop_names_p->buffer_p;
820425bb815Sopenharmony_ci
821425bb815Sopenharmony_ci  for (uint32_t i = 0; i < prop_names_p->item_count; i++)
822425bb815Sopenharmony_ci  {
823425bb815Sopenharmony_ci    ecma_value_t define_own_prop_ret =  ecma_op_object_define_own_property (obj_p,
824425bb815Sopenharmony_ci                                                                            ecma_get_string_from_value (buffer_p[i]),
825425bb815Sopenharmony_ci                                                                            &property_descriptors[i]);
826425bb815Sopenharmony_ci    if (ECMA_IS_VALUE_ERROR (define_own_prop_ret))
827425bb815Sopenharmony_ci    {
828425bb815Sopenharmony_ci      goto cleanup;
829425bb815Sopenharmony_ci    }
830425bb815Sopenharmony_ci
831425bb815Sopenharmony_ci    ecma_free_value (define_own_prop_ret);
832425bb815Sopenharmony_ci  }
833425bb815Sopenharmony_ci
834425bb815Sopenharmony_ci  ecma_ref_object (obj_p);
835425bb815Sopenharmony_ci  ret_value = ecma_make_object_value (obj_p);
836425bb815Sopenharmony_ci
837425bb815Sopenharmony_cicleanup:
838425bb815Sopenharmony_ci  /* Clean up. */
839425bb815Sopenharmony_ci  for (uint32_t index = 0;
840425bb815Sopenharmony_ci       index < property_descriptor_number;
841425bb815Sopenharmony_ci       index++)
842425bb815Sopenharmony_ci  {
843425bb815Sopenharmony_ci    ecma_free_property_descriptor (&property_descriptors[index]);
844425bb815Sopenharmony_ci  }
845425bb815Sopenharmony_ci
846425bb815Sopenharmony_ci  JMEM_FINALIZE_LOCAL_ARRAY (property_descriptors);
847425bb815Sopenharmony_ci
848425bb815Sopenharmony_ci  ecma_collection_free (prop_names_p);
849425bb815Sopenharmony_ci
850425bb815Sopenharmony_ci  ecma_deref_object (props_p);
851425bb815Sopenharmony_ci
852425bb815Sopenharmony_ci  return ret_value;
853425bb815Sopenharmony_ci} /* ecma_builtin_object_object_define_properties */
854425bb815Sopenharmony_ci
855425bb815Sopenharmony_ci/**
856425bb815Sopenharmony_ci * The Object object's 'create' routine
857425bb815Sopenharmony_ci *
858425bb815Sopenharmony_ci * See also:
859425bb815Sopenharmony_ci *          ECMA-262 v5, 15.2.3.5
860425bb815Sopenharmony_ci *
861425bb815Sopenharmony_ci * @return ecma value
862425bb815Sopenharmony_ci *         Returned value must be freed with ecma_free_value.
863425bb815Sopenharmony_ci */
864425bb815Sopenharmony_cistatic ecma_value_t
865425bb815Sopenharmony_ciecma_builtin_object_object_create (ecma_value_t arg1, /**< routine's first argument */
866425bb815Sopenharmony_ci                                   ecma_value_t arg2) /**< routine's second argument */
867425bb815Sopenharmony_ci{
868425bb815Sopenharmony_ci  /* 1. */
869425bb815Sopenharmony_ci  if (!ecma_is_value_object (arg1) && !ecma_is_value_null (arg1))
870425bb815Sopenharmony_ci  {
871425bb815Sopenharmony_ci    return ecma_raise_type_error (ECMA_ERR_MSG ("Argument is not an object."));
872425bb815Sopenharmony_ci  }
873425bb815Sopenharmony_ci
874425bb815Sopenharmony_ci  ecma_object_t *obj_p = NULL;
875425bb815Sopenharmony_ci
876425bb815Sopenharmony_ci  if (!ecma_is_value_null (arg1))
877425bb815Sopenharmony_ci  {
878425bb815Sopenharmony_ci    obj_p = ecma_get_object_from_value (arg1);
879425bb815Sopenharmony_ci  }
880425bb815Sopenharmony_ci  /* 2-3. */
881425bb815Sopenharmony_ci  ecma_object_t *result_obj_p = ecma_op_create_object_object_noarg_and_set_prototype (obj_p);
882425bb815Sopenharmony_ci
883425bb815Sopenharmony_ci  /* 4. */
884425bb815Sopenharmony_ci  if (!ecma_is_value_undefined (arg2))
885425bb815Sopenharmony_ci  {
886425bb815Sopenharmony_ci    ecma_value_t obj = ecma_builtin_object_object_define_properties (result_obj_p, arg2);
887425bb815Sopenharmony_ci
888425bb815Sopenharmony_ci    if (ECMA_IS_VALUE_ERROR (obj))
889425bb815Sopenharmony_ci    {
890425bb815Sopenharmony_ci      ecma_deref_object (result_obj_p);
891425bb815Sopenharmony_ci      return obj;
892425bb815Sopenharmony_ci    }
893425bb815Sopenharmony_ci
894425bb815Sopenharmony_ci    ecma_free_value (obj);
895425bb815Sopenharmony_ci  }
896425bb815Sopenharmony_ci
897425bb815Sopenharmony_ci  /* 5. */
898425bb815Sopenharmony_ci  return ecma_make_object_value (result_obj_p);
899425bb815Sopenharmony_ci} /* ecma_builtin_object_object_create */
900425bb815Sopenharmony_ci
901425bb815Sopenharmony_ci/**
902425bb815Sopenharmony_ci * The Object object's 'defineProperty' routine
903425bb815Sopenharmony_ci *
904425bb815Sopenharmony_ci * See also:
905425bb815Sopenharmony_ci *          ECMA-262 v5, 15.2.3.6
906425bb815Sopenharmony_ci *
907425bb815Sopenharmony_ci * @return ecma value
908425bb815Sopenharmony_ci *         Returned value must be freed with ecma_free_value.
909425bb815Sopenharmony_ci */
910425bb815Sopenharmony_ciecma_value_t
911425bb815Sopenharmony_ciecma_builtin_object_object_define_property (ecma_object_t *obj_p, /**< routine's first argument */
912425bb815Sopenharmony_ci                                            ecma_string_t *name_str_p, /**< routine's second argument */
913425bb815Sopenharmony_ci                                            ecma_value_t arg3) /**< routine's third argument */
914425bb815Sopenharmony_ci{
915425bb815Sopenharmony_ci  ecma_property_descriptor_t prop_desc;
916425bb815Sopenharmony_ci
917425bb815Sopenharmony_ci  ecma_value_t conv_result = ecma_op_to_property_descriptor (arg3, &prop_desc);
918425bb815Sopenharmony_ci
919425bb815Sopenharmony_ci  if (ECMA_IS_VALUE_ERROR (conv_result))
920425bb815Sopenharmony_ci  {
921425bb815Sopenharmony_ci    return conv_result;
922425bb815Sopenharmony_ci  }
923425bb815Sopenharmony_ci
924425bb815Sopenharmony_ci  prop_desc.flags |= ECMA_PROP_IS_THROW;
925425bb815Sopenharmony_ci
926425bb815Sopenharmony_ci  ecma_value_t define_own_prop_ret = ecma_op_object_define_own_property (obj_p,
927425bb815Sopenharmony_ci                                                                         name_str_p,
928425bb815Sopenharmony_ci                                                                         &prop_desc);
929425bb815Sopenharmony_ci
930425bb815Sopenharmony_ci  ecma_free_property_descriptor (&prop_desc);
931425bb815Sopenharmony_ci  ecma_free_value (conv_result);
932425bb815Sopenharmony_ci
933425bb815Sopenharmony_ci  if (ECMA_IS_VALUE_ERROR (define_own_prop_ret))
934425bb815Sopenharmony_ci  {
935425bb815Sopenharmony_ci    return define_own_prop_ret;
936425bb815Sopenharmony_ci  }
937425bb815Sopenharmony_ci
938425bb815Sopenharmony_ci  ecma_ref_object (obj_p);
939425bb815Sopenharmony_ci  ecma_free_value (define_own_prop_ret);
940425bb815Sopenharmony_ci
941425bb815Sopenharmony_ci  return ecma_make_object_value (obj_p);
942425bb815Sopenharmony_ci} /* ecma_builtin_object_object_define_property */
943425bb815Sopenharmony_ci
944425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015)
945425bb815Sopenharmony_ci
946425bb815Sopenharmony_ci/**
947425bb815Sopenharmony_ci * The Object object's 'assign' routine
948425bb815Sopenharmony_ci *
949425bb815Sopenharmony_ci * See also:
950425bb815Sopenharmony_ci *          ECMA-262 v6, 19.1.2.1
951425bb815Sopenharmony_ci *
952425bb815Sopenharmony_ci * @return ecma value
953425bb815Sopenharmony_ci *         Returned value must be freed with ecma_free_value.
954425bb815Sopenharmony_ci */
955425bb815Sopenharmony_cistatic ecma_value_t
956425bb815Sopenharmony_ciecma_builtin_object_object_assign (ecma_object_t *target_p, /**< target object */
957425bb815Sopenharmony_ci                                   const ecma_value_t arguments_list_p[], /**< arguments list */
958425bb815Sopenharmony_ci                                   ecma_length_t arguments_list_len) /**< number of arguments */
959425bb815Sopenharmony_ci{
960425bb815Sopenharmony_ci  ecma_value_t ret_value = ECMA_VALUE_EMPTY;
961425bb815Sopenharmony_ci
962425bb815Sopenharmony_ci  /* 4-5. */
963425bb815Sopenharmony_ci  for (uint32_t i = 0; i < arguments_list_len && ecma_is_value_empty (ret_value); i++)
964425bb815Sopenharmony_ci  {
965425bb815Sopenharmony_ci    ecma_value_t next_source = arguments_list_p[i];
966425bb815Sopenharmony_ci
967425bb815Sopenharmony_ci    /* 5.a */
968425bb815Sopenharmony_ci    if (ecma_is_value_undefined (next_source) || ecma_is_value_null (next_source))
969425bb815Sopenharmony_ci    {
970425bb815Sopenharmony_ci      continue;
971425bb815Sopenharmony_ci    }
972425bb815Sopenharmony_ci
973425bb815Sopenharmony_ci    /* 5.b.i */
974425bb815Sopenharmony_ci    ecma_value_t from_value = ecma_op_to_object (next_source);
975425bb815Sopenharmony_ci    /* null and undefied cases are handled above, so this must be a valid object */
976425bb815Sopenharmony_ci    JERRY_ASSERT (!ECMA_IS_VALUE_ERROR (from_value));
977425bb815Sopenharmony_ci
978425bb815Sopenharmony_ci    ecma_object_t *from_obj_p = ecma_get_object_from_value (from_value);
979425bb815Sopenharmony_ci
980425bb815Sopenharmony_ci    /* 5.b.iii */
981425bb815Sopenharmony_ci    ecma_collection_t *props_p = ecma_op_object_get_property_names (from_obj_p, ECMA_LIST_CONVERT_FAST_ARRAYS
982425bb815Sopenharmony_ci                                                                                | ECMA_LIST_ENUMERABLE
983425bb815Sopenharmony_ci                                                                                | ECMA_LIST_SYMBOLS);
984425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015_BUILTIN_PROXY)
985425bb815Sopenharmony_ci    if (props_p == NULL)
986425bb815Sopenharmony_ci    {
987425bb815Sopenharmony_ci      ecma_deref_object (from_obj_p);
988425bb815Sopenharmony_ci      return ECMA_VALUE_ERROR;
989425bb815Sopenharmony_ci    }
990425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015_BUILTIN_PROXY) */
991425bb815Sopenharmony_ci
992425bb815Sopenharmony_ci    ecma_value_t *buffer_p = props_p->buffer_p;
993425bb815Sopenharmony_ci
994425bb815Sopenharmony_ci    for (uint32_t j = 0; (j < props_p->item_count) && ecma_is_value_empty (ret_value); j++)
995425bb815Sopenharmony_ci    {
996425bb815Sopenharmony_ci      ecma_string_t *property_name_p = ecma_get_prop_name_from_value (buffer_p[j]);
997425bb815Sopenharmony_ci
998425bb815Sopenharmony_ci      /* 5.c.i-ii */
999425bb815Sopenharmony_ci      ecma_property_descriptor_t prop_desc;
1000425bb815Sopenharmony_ci      ecma_value_t desc_status = ecma_op_object_get_own_property_descriptor (from_obj_p, property_name_p, &prop_desc);
1001425bb815Sopenharmony_ci
1002425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015_BUILTIN_PROXY)
1003425bb815Sopenharmony_ci      if (ECMA_IS_VALUE_ERROR (desc_status))
1004425bb815Sopenharmony_ci      {
1005425bb815Sopenharmony_ci        ret_value = desc_status;
1006425bb815Sopenharmony_ci        break;
1007425bb815Sopenharmony_ci      }
1008425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015_BUILTIN_PROXY) */
1009425bb815Sopenharmony_ci
1010425bb815Sopenharmony_ci      if (ecma_is_value_false (desc_status))
1011425bb815Sopenharmony_ci      {
1012425bb815Sopenharmony_ci        continue;
1013425bb815Sopenharmony_ci      }
1014425bb815Sopenharmony_ci
1015425bb815Sopenharmony_ci      /* 5.c.iii */
1016425bb815Sopenharmony_ci      if ((prop_desc.flags & ECMA_PROP_IS_ENUMERABLE)
1017425bb815Sopenharmony_ci          && (((prop_desc.flags & ECMA_PROP_IS_VALUE_DEFINED) && !ecma_is_value_undefined (prop_desc.value))
1018425bb815Sopenharmony_ci              || (prop_desc.flags & ECMA_PROP_IS_GET_DEFINED)))
1019425bb815Sopenharmony_ci      {
1020425bb815Sopenharmony_ci        /* 5.c.iii.1 */
1021425bb815Sopenharmony_ci        ecma_value_t prop_value = ecma_op_object_get (from_obj_p, property_name_p);
1022425bb815Sopenharmony_ci
1023425bb815Sopenharmony_ci        /* 5.c.iii.2 */
1024425bb815Sopenharmony_ci        if (ECMA_IS_VALUE_ERROR (prop_value))
1025425bb815Sopenharmony_ci        {
1026425bb815Sopenharmony_ci          ret_value = prop_value;
1027425bb815Sopenharmony_ci        }
1028425bb815Sopenharmony_ci        else
1029425bb815Sopenharmony_ci        {
1030425bb815Sopenharmony_ci          /* 5.c.iii.3 */
1031425bb815Sopenharmony_ci          ecma_value_t status = ecma_op_object_put (target_p, property_name_p, prop_value, true);
1032425bb815Sopenharmony_ci
1033425bb815Sopenharmony_ci          /* 5.c.iii.4 */
1034425bb815Sopenharmony_ci          if (ECMA_IS_VALUE_ERROR (status))
1035425bb815Sopenharmony_ci          {
1036425bb815Sopenharmony_ci            ret_value = status;
1037425bb815Sopenharmony_ci          }
1038425bb815Sopenharmony_ci        }
1039425bb815Sopenharmony_ci
1040425bb815Sopenharmony_ci        ecma_free_value (prop_value);
1041425bb815Sopenharmony_ci        ecma_free_property_descriptor (&prop_desc);
1042425bb815Sopenharmony_ci      }
1043425bb815Sopenharmony_ci    }
1044425bb815Sopenharmony_ci
1045425bb815Sopenharmony_ci    ecma_deref_object (from_obj_p);
1046425bb815Sopenharmony_ci    ecma_collection_free (props_p);
1047425bb815Sopenharmony_ci  }
1048425bb815Sopenharmony_ci
1049425bb815Sopenharmony_ci  /* 6. */
1050425bb815Sopenharmony_ci  if (ecma_is_value_empty (ret_value))
1051425bb815Sopenharmony_ci  {
1052425bb815Sopenharmony_ci    ecma_ref_object (target_p);
1053425bb815Sopenharmony_ci    return ecma_make_object_value (target_p);
1054425bb815Sopenharmony_ci  }
1055425bb815Sopenharmony_ci
1056425bb815Sopenharmony_ci  return ret_value;
1057425bb815Sopenharmony_ci} /* ecma_builtin_object_object_assign */
1058425bb815Sopenharmony_ci
1059425bb815Sopenharmony_ci/**
1060425bb815Sopenharmony_ci * The Object object's 'is' routine
1061425bb815Sopenharmony_ci *
1062425bb815Sopenharmony_ci * See also:
1063425bb815Sopenharmony_ci *          ECMA-262 v6, 19.1.2.10
1064425bb815Sopenharmony_ci *
1065425bb815Sopenharmony_ci * @return ecma value
1066425bb815Sopenharmony_ci *         Returned value must be freed with ecma_free_value.
1067425bb815Sopenharmony_ci */
1068425bb815Sopenharmony_cistatic ecma_value_t
1069425bb815Sopenharmony_ciecma_builtin_object_object_is (ecma_value_t arg1, /**< routine's first argument */
1070425bb815Sopenharmony_ci                               ecma_value_t arg2) /**< routine's second argument */
1071425bb815Sopenharmony_ci{
1072425bb815Sopenharmony_ci  return ecma_op_same_value (arg1, arg2) ? ECMA_VALUE_TRUE : ECMA_VALUE_FALSE;
1073425bb815Sopenharmony_ci} /* ecma_builtin_object_object_is */
1074425bb815Sopenharmony_ci
1075425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015) */
1076425bb815Sopenharmony_ci
1077425bb815Sopenharmony_ci/**
1078425bb815Sopenharmony_ci * Dispatcher of the built-in's routines
1079425bb815Sopenharmony_ci *
1080425bb815Sopenharmony_ci * @return ecma value
1081425bb815Sopenharmony_ci *         Returned value must be freed with ecma_free_value.
1082425bb815Sopenharmony_ci */
1083425bb815Sopenharmony_ciecma_value_t
1084425bb815Sopenharmony_ciecma_builtin_object_dispatch_routine (uint16_t builtin_routine_id, /**< built-in wide routine
1085425bb815Sopenharmony_ci                                                                    *   identifier */
1086425bb815Sopenharmony_ci                                      ecma_value_t this_arg, /**< 'this' argument value */
1087425bb815Sopenharmony_ci                                      const ecma_value_t arguments_list_p[], /**< list of arguments
1088425bb815Sopenharmony_ci                                                                              *   passed to routine */
1089425bb815Sopenharmony_ci                                      ecma_length_t arguments_number) /**< length of arguments' list */
1090425bb815Sopenharmony_ci{
1091425bb815Sopenharmony_ci  JERRY_UNUSED (this_arg);
1092425bb815Sopenharmony_ci  JERRY_UNUSED (arguments_list_p);
1093425bb815Sopenharmony_ci  JERRY_UNUSED (arguments_number);
1094425bb815Sopenharmony_ci
1095425bb815Sopenharmony_ci  ecma_value_t arg1 = arguments_list_p[0];
1096425bb815Sopenharmony_ci  ecma_value_t arg2 = arguments_list_p[1];
1097425bb815Sopenharmony_ci
1098425bb815Sopenharmony_ci  /* No specialization for the arguments */
1099425bb815Sopenharmony_ci  switch (builtin_routine_id)
1100425bb815Sopenharmony_ci  {
1101425bb815Sopenharmony_ci    case ECMA_OBJECT_ROUTINE_CREATE:
1102425bb815Sopenharmony_ci    {
1103425bb815Sopenharmony_ci      return ecma_builtin_object_object_create (arg1, arg2);
1104425bb815Sopenharmony_ci    }
1105425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015)
1106425bb815Sopenharmony_ci    case ECMA_OBJECT_ROUTINE_SET_PROTOTYPE_OF:
1107425bb815Sopenharmony_ci    {
1108425bb815Sopenharmony_ci      return ecma_builtin_object_object_set_prototype_of (arg1, arg2);
1109425bb815Sopenharmony_ci    }
1110425bb815Sopenharmony_ci    case ECMA_OBJECT_ROUTINE_IS:
1111425bb815Sopenharmony_ci    {
1112425bb815Sopenharmony_ci      return ecma_builtin_object_object_is (arg1, arg2);
1113425bb815Sopenharmony_ci    }
1114425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015) */
1115425bb815Sopenharmony_ci    default:
1116425bb815Sopenharmony_ci    {
1117425bb815Sopenharmony_ci      break;
1118425bb815Sopenharmony_ci    }
1119425bb815Sopenharmony_ci  }
1120425bb815Sopenharmony_ci
1121425bb815Sopenharmony_ci  ecma_object_t *obj_p;
1122425bb815Sopenharmony_ci#if !ENABLED (JERRY_ES2015)
1123425bb815Sopenharmony_ci  if (!ecma_is_value_object (arg1))
1124425bb815Sopenharmony_ci  {
1125425bb815Sopenharmony_ci    return ecma_raise_type_error (ECMA_ERR_MSG ("Argument is not an object."));
1126425bb815Sopenharmony_ci  }
1127425bb815Sopenharmony_ci#endif /* !ENABLED (JERRY_ES2015) */
1128425bb815Sopenharmony_ci
1129425bb815Sopenharmony_ci  if (builtin_routine_id <= ECMA_OBJECT_ROUTINE_DEFINE_PROPERTIES)
1130425bb815Sopenharmony_ci  {
1131425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015)
1132425bb815Sopenharmony_ci    if (!ecma_is_value_object (arg1))
1133425bb815Sopenharmony_ci    {
1134425bb815Sopenharmony_ci      return ecma_raise_type_error (ECMA_ERR_MSG ("Argument is not an object."));
1135425bb815Sopenharmony_ci    }
1136425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015) */
1137425bb815Sopenharmony_ci
1138425bb815Sopenharmony_ci    obj_p = ecma_get_object_from_value (arg1);
1139425bb815Sopenharmony_ci
1140425bb815Sopenharmony_ci    if (builtin_routine_id == ECMA_OBJECT_ROUTINE_DEFINE_PROPERTY)
1141425bb815Sopenharmony_ci    {
1142425bb815Sopenharmony_ci      ecma_string_t *prop_name_p = ecma_op_to_prop_name (arg2);
1143425bb815Sopenharmony_ci
1144425bb815Sopenharmony_ci      if (prop_name_p == NULL)
1145425bb815Sopenharmony_ci      {
1146425bb815Sopenharmony_ci        return ECMA_VALUE_ERROR;
1147425bb815Sopenharmony_ci      }
1148425bb815Sopenharmony_ci
1149425bb815Sopenharmony_ci      ecma_value_t result = ecma_builtin_object_object_define_property (obj_p, prop_name_p, arguments_list_p[2]);
1150425bb815Sopenharmony_ci
1151425bb815Sopenharmony_ci      ecma_deref_ecma_string (prop_name_p);
1152425bb815Sopenharmony_ci      return result;
1153425bb815Sopenharmony_ci    }
1154425bb815Sopenharmony_ci
1155425bb815Sopenharmony_ci    JERRY_ASSERT (builtin_routine_id == ECMA_OBJECT_ROUTINE_DEFINE_PROPERTIES);
1156425bb815Sopenharmony_ci    return ecma_builtin_object_object_define_properties (obj_p, arg2);
1157425bb815Sopenharmony_ci  }
1158425bb815Sopenharmony_ci  else if (builtin_routine_id <= ECMA_OBJECT_ROUTINE_KEYS)
1159425bb815Sopenharmony_ci  {
1160425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015)
1161425bb815Sopenharmony_ci    ecma_value_t object = ecma_op_to_object (arg1);
1162425bb815Sopenharmony_ci    if (ECMA_IS_VALUE_ERROR (object))
1163425bb815Sopenharmony_ci    {
1164425bb815Sopenharmony_ci      return object;
1165425bb815Sopenharmony_ci    }
1166425bb815Sopenharmony_ci
1167425bb815Sopenharmony_ci    obj_p = ecma_get_object_from_value (object);
1168425bb815Sopenharmony_ci#else /* !ENABLED (JERRY_ES2015) */
1169425bb815Sopenharmony_ci    obj_p = ecma_get_object_from_value (arg1);
1170425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015) */
1171425bb815Sopenharmony_ci
1172425bb815Sopenharmony_ci    ecma_value_t result;
1173425bb815Sopenharmony_ci    switch (builtin_routine_id)
1174425bb815Sopenharmony_ci    {
1175425bb815Sopenharmony_ci      case ECMA_OBJECT_ROUTINE_GET_PROTOTYPE_OF:
1176425bb815Sopenharmony_ci      {
1177425bb815Sopenharmony_ci        result = ecma_builtin_object_object_get_prototype_of (obj_p);
1178425bb815Sopenharmony_ci        break;
1179425bb815Sopenharmony_ci      }
1180425bb815Sopenharmony_ci      case ECMA_OBJECT_ROUTINE_GET_OWN_PROPERTY_NAMES:
1181425bb815Sopenharmony_ci      {
1182425bb815Sopenharmony_ci        result = ecma_builtin_object_object_get_own_property_names (obj_p);
1183425bb815Sopenharmony_ci        break;
1184425bb815Sopenharmony_ci      }
1185425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015)
1186425bb815Sopenharmony_ci      case ECMA_OBJECT_ROUTINE_ASSIGN:
1187425bb815Sopenharmony_ci      {
1188425bb815Sopenharmony_ci        result = ecma_builtin_object_object_assign (obj_p, arguments_list_p + 1, arguments_number - 1);
1189425bb815Sopenharmony_ci        break;
1190425bb815Sopenharmony_ci      }
1191425bb815Sopenharmony_ci      case ECMA_OBJECT_ROUTINE_GET_OWN_PROPERTY_SYMBOLS:
1192425bb815Sopenharmony_ci      {
1193425bb815Sopenharmony_ci        result = ecma_builtin_object_object_get_own_property_symbols (obj_p);
1194425bb815Sopenharmony_ci        break;
1195425bb815Sopenharmony_ci      }
1196425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015) */
1197425bb815Sopenharmony_ci      case ECMA_OBJECT_ROUTINE_KEYS:
1198425bb815Sopenharmony_ci      {
1199425bb815Sopenharmony_ci        result = ecma_builtin_object_object_keys (obj_p);
1200425bb815Sopenharmony_ci        break;
1201425bb815Sopenharmony_ci      }
1202425bb815Sopenharmony_ci      case ECMA_OBJECT_ROUTINE_GET_OWN_PROPERTY_DESCRIPTOR:
1203425bb815Sopenharmony_ci      {
1204425bb815Sopenharmony_ci        ecma_string_t *prop_name_p = ecma_op_to_prop_name (arg2);
1205425bb815Sopenharmony_ci
1206425bb815Sopenharmony_ci        if (prop_name_p == NULL)
1207425bb815Sopenharmony_ci        {
1208425bb815Sopenharmony_ci          result = ECMA_VALUE_ERROR;
1209425bb815Sopenharmony_ci          break;
1210425bb815Sopenharmony_ci        }
1211425bb815Sopenharmony_ci
1212425bb815Sopenharmony_ci        result = ecma_builtin_object_object_get_own_property_descriptor (obj_p, prop_name_p);
1213425bb815Sopenharmony_ci        ecma_deref_ecma_string (prop_name_p);
1214425bb815Sopenharmony_ci        break;
1215425bb815Sopenharmony_ci      }
1216425bb815Sopenharmony_ci      default:
1217425bb815Sopenharmony_ci      {
1218425bb815Sopenharmony_ci        JERRY_UNREACHABLE ();
1219425bb815Sopenharmony_ci      }
1220425bb815Sopenharmony_ci    }
1221425bb815Sopenharmony_ci
1222425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015)
1223425bb815Sopenharmony_ci    ecma_deref_object (obj_p);
1224425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015) */
1225425bb815Sopenharmony_ci    return result;
1226425bb815Sopenharmony_ci  }
1227425bb815Sopenharmony_ci  else if (builtin_routine_id <= ECMA_OBJECT_ROUTINE_SEAL)
1228425bb815Sopenharmony_ci  {
1229425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015)
1230425bb815Sopenharmony_ci    if (!ecma_is_value_object (arg1))
1231425bb815Sopenharmony_ci    {
1232425bb815Sopenharmony_ci      return ecma_copy_value (arg1);
1233425bb815Sopenharmony_ci    }
1234425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015) */
1235425bb815Sopenharmony_ci
1236425bb815Sopenharmony_ci    obj_p = ecma_get_object_from_value (arg1);
1237425bb815Sopenharmony_ci    switch (builtin_routine_id)
1238425bb815Sopenharmony_ci    {
1239425bb815Sopenharmony_ci      case ECMA_OBJECT_ROUTINE_SEAL:
1240425bb815Sopenharmony_ci      {
1241425bb815Sopenharmony_ci        return ecma_builtin_object_object_seal (obj_p);
1242425bb815Sopenharmony_ci      }
1243425bb815Sopenharmony_ci      case ECMA_OBJECT_ROUTINE_FREEZE:
1244425bb815Sopenharmony_ci      {
1245425bb815Sopenharmony_ci        return ecma_builtin_object_object_freeze (obj_p);
1246425bb815Sopenharmony_ci      }
1247425bb815Sopenharmony_ci      case ECMA_OBJECT_ROUTINE_PREVENT_EXTENSIONS:
1248425bb815Sopenharmony_ci      {
1249425bb815Sopenharmony_ci        return ecma_builtin_object_object_prevent_extensions (obj_p);
1250425bb815Sopenharmony_ci      }
1251425bb815Sopenharmony_ci      default:
1252425bb815Sopenharmony_ci      {
1253425bb815Sopenharmony_ci        JERRY_UNREACHABLE ();
1254425bb815Sopenharmony_ci      }
1255425bb815Sopenharmony_ci    }
1256425bb815Sopenharmony_ci  }
1257425bb815Sopenharmony_ci  else
1258425bb815Sopenharmony_ci  {
1259425bb815Sopenharmony_ci    JERRY_ASSERT (builtin_routine_id <= ECMA_OBJECT_ROUTINE_IS_SEALED);
1260425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015)
1261425bb815Sopenharmony_ci    if (!ecma_is_value_object (arg1))
1262425bb815Sopenharmony_ci    {
1263425bb815Sopenharmony_ci      return ecma_make_boolean_value (builtin_routine_id != ECMA_OBJECT_ROUTINE_IS_EXTENSIBLE);
1264425bb815Sopenharmony_ci    }
1265425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015) */
1266425bb815Sopenharmony_ci
1267425bb815Sopenharmony_ci    obj_p = ecma_get_object_from_value (arg1);
1268425bb815Sopenharmony_ci    switch (builtin_routine_id)
1269425bb815Sopenharmony_ci    {
1270425bb815Sopenharmony_ci      case ECMA_OBJECT_ROUTINE_IS_SEALED:
1271425bb815Sopenharmony_ci      case ECMA_OBJECT_ROUTINE_IS_FROZEN:
1272425bb815Sopenharmony_ci      {
1273425bb815Sopenharmony_ci        return ecma_builtin_object_test_integrity_level (obj_p, builtin_routine_id);
1274425bb815Sopenharmony_ci      }
1275425bb815Sopenharmony_ci      case ECMA_OBJECT_ROUTINE_IS_EXTENSIBLE:
1276425bb815Sopenharmony_ci      {
1277425bb815Sopenharmony_ci        return ecma_builtin_object_object_is_extensible (obj_p);
1278425bb815Sopenharmony_ci      }
1279425bb815Sopenharmony_ci      default:
1280425bb815Sopenharmony_ci      {
1281425bb815Sopenharmony_ci        JERRY_UNREACHABLE ();
1282425bb815Sopenharmony_ci      }
1283425bb815Sopenharmony_ci    }
1284425bb815Sopenharmony_ci  }
1285425bb815Sopenharmony_ci} /* ecma_builtin_object_dispatch_routine */
1286425bb815Sopenharmony_ci
1287425bb815Sopenharmony_ci/**
1288425bb815Sopenharmony_ci * @}
1289425bb815Sopenharmony_ci * @}
1290425bb815Sopenharmony_ci * @}
1291425bb815Sopenharmony_ci */
1292