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