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-exceptions.h" 17425bb815Sopenharmony_ci#include "ecma-function-object.h" 18425bb815Sopenharmony_ci#include "ecma-gc.h" 19425bb815Sopenharmony_ci#include "ecma-globals.h" 20425bb815Sopenharmony_ci#include "ecma-helpers.h" 21425bb815Sopenharmony_ci#include "ecma-lcache.h" 22425bb815Sopenharmony_ci#include "ecma-lex-env.h" 23425bb815Sopenharmony_ci#include "ecma-objects.h" 24425bb815Sopenharmony_ci#include "ecma-proxy-object.h" 25425bb815Sopenharmony_ci#include "ecma-reference.h" 26425bb815Sopenharmony_ci#include "jrt.h" 27425bb815Sopenharmony_ci 28425bb815Sopenharmony_ci/** \addtogroup ecma ECMA 29425bb815Sopenharmony_ci * @{ 30425bb815Sopenharmony_ci * 31425bb815Sopenharmony_ci * \addtogroup references ECMA-Reference 32425bb815Sopenharmony_ci * @{ 33425bb815Sopenharmony_ci */ 34425bb815Sopenharmony_ci 35425bb815Sopenharmony_ci/** 36425bb815Sopenharmony_ci * Resolve syntactic reference. 37425bb815Sopenharmony_ci * 38425bb815Sopenharmony_ci * @return ECMA_OBJECT_POINTER_ERROR - if the operation fails 39425bb815Sopenharmony_ci * pointer to lexical environment - if the reference's base is resolved sucessfully, 40425bb815Sopenharmony_ci * NULL - otherwise. 41425bb815Sopenharmony_ci */ 42425bb815Sopenharmony_ciecma_object_t * 43425bb815Sopenharmony_ciecma_op_resolve_reference_base (ecma_object_t *lex_env_p, /**< starting lexical environment */ 44425bb815Sopenharmony_ci ecma_string_t *name_p) /**< identifier's name */ 45425bb815Sopenharmony_ci{ 46425bb815Sopenharmony_ci JERRY_ASSERT (lex_env_p != NULL); 47425bb815Sopenharmony_ci 48425bb815Sopenharmony_ci while (true) 49425bb815Sopenharmony_ci { 50425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015) 51425bb815Sopenharmony_ci if (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_HOME_OBJECT_BOUND) 52425bb815Sopenharmony_ci { 53425bb815Sopenharmony_ci JERRY_ASSERT (lex_env_p->u2.outer_reference_cp != JMEM_CP_NULL); 54425bb815Sopenharmony_ci lex_env_p = ECMA_GET_NON_NULL_POINTER (ecma_object_t, lex_env_p->u2.outer_reference_cp); 55425bb815Sopenharmony_ci } 56425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015) */ 57425bb815Sopenharmony_ci 58425bb815Sopenharmony_ci ecma_value_t has_binding = ecma_op_has_binding (lex_env_p, name_p); 59425bb815Sopenharmony_ci 60425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015_BUILTIN_PROXY) 61425bb815Sopenharmony_ci if (ECMA_IS_VALUE_ERROR (has_binding)) 62425bb815Sopenharmony_ci { 63425bb815Sopenharmony_ci return ECMA_OBJECT_POINTER_ERROR; 64425bb815Sopenharmony_ci } 65425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015_BUILTIN_PROXY) */ 66425bb815Sopenharmony_ci 67425bb815Sopenharmony_ci if (ecma_is_value_true (has_binding)) 68425bb815Sopenharmony_ci { 69425bb815Sopenharmony_ci return lex_env_p; 70425bb815Sopenharmony_ci } 71425bb815Sopenharmony_ci 72425bb815Sopenharmony_ci if (lex_env_p->u2.outer_reference_cp == JMEM_CP_NULL) 73425bb815Sopenharmony_ci { 74425bb815Sopenharmony_ci return NULL; 75425bb815Sopenharmony_ci } 76425bb815Sopenharmony_ci 77425bb815Sopenharmony_ci lex_env_p = ECMA_GET_NON_NULL_POINTER (ecma_object_t, lex_env_p->u2.outer_reference_cp); 78425bb815Sopenharmony_ci } 79425bb815Sopenharmony_ci} /* ecma_op_resolve_reference_base */ 80425bb815Sopenharmony_ci 81425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015) 82425bb815Sopenharmony_ci/** 83425bb815Sopenharmony_ci * Perform GetThisEnvironment and GetSuperBase operations 84425bb815Sopenharmony_ci * 85425bb815Sopenharmony_ci * See also: ECMAScript v6, 8.1.1.3.5 86425bb815Sopenharmony_ci * 87425bb815Sopenharmony_ci * @return ECMA_VALUE_ERROR - if the operation fails 88425bb815Sopenharmony_ci * ECMA_VALUE_UNDEFINED - if the home object is null 89425bb815Sopenharmony_ci * value of the [[HomeObject]].[[Prototype]] internal slot - otherwise 90425bb815Sopenharmony_ci */ 91425bb815Sopenharmony_ciecma_value_t 92425bb815Sopenharmony_ciecma_op_resolve_super_base (ecma_object_t *lex_env_p) /**< starting lexical environment */ 93425bb815Sopenharmony_ci{ 94425bb815Sopenharmony_ci JERRY_ASSERT (lex_env_p != NULL); 95425bb815Sopenharmony_ci 96425bb815Sopenharmony_ci while (true) 97425bb815Sopenharmony_ci { 98425bb815Sopenharmony_ci if (ecma_get_lex_env_type (lex_env_p) == ECMA_LEXICAL_ENVIRONMENT_HOME_OBJECT_BOUND) 99425bb815Sopenharmony_ci { 100425bb815Sopenharmony_ci ecma_object_t *home_p = ECMA_GET_NON_NULL_POINTER (ecma_object_t, lex_env_p->u1.home_object_cp); 101425bb815Sopenharmony_ci 102425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015_BUILTIN_PROXY) 103425bb815Sopenharmony_ci if (ECMA_OBJECT_IS_PROXY (home_p)) 104425bb815Sopenharmony_ci { 105425bb815Sopenharmony_ci return ecma_proxy_object_get_prototype_of (home_p); 106425bb815Sopenharmony_ci } 107425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015_BUILTIN_PROXY) */ 108425bb815Sopenharmony_ci 109425bb815Sopenharmony_ci jmem_cpointer_t proto_cp = ecma_op_ordinary_object_get_prototype_of (home_p); 110425bb815Sopenharmony_ci 111425bb815Sopenharmony_ci if (proto_cp == JMEM_CP_NULL) 112425bb815Sopenharmony_ci { 113425bb815Sopenharmony_ci return ECMA_VALUE_NULL; 114425bb815Sopenharmony_ci } 115425bb815Sopenharmony_ci 116425bb815Sopenharmony_ci ecma_object_t *proto_p = ECMA_GET_NON_NULL_POINTER (ecma_object_t, proto_cp); 117425bb815Sopenharmony_ci ecma_ref_object (proto_p); 118425bb815Sopenharmony_ci 119425bb815Sopenharmony_ci return ecma_make_object_value (proto_p); 120425bb815Sopenharmony_ci } 121425bb815Sopenharmony_ci 122425bb815Sopenharmony_ci if (lex_env_p->u2.outer_reference_cp == JMEM_CP_NULL) 123425bb815Sopenharmony_ci { 124425bb815Sopenharmony_ci break; 125425bb815Sopenharmony_ci } 126425bb815Sopenharmony_ci 127425bb815Sopenharmony_ci lex_env_p = ECMA_GET_NON_NULL_POINTER (ecma_object_t, lex_env_p->u2.outer_reference_cp); 128425bb815Sopenharmony_ci } 129425bb815Sopenharmony_ci 130425bb815Sopenharmony_ci return ECMA_VALUE_UNDEFINED; 131425bb815Sopenharmony_ci} /* ecma_op_resolve_super_base */ 132425bb815Sopenharmony_ci 133425bb815Sopenharmony_ci/** 134425bb815Sopenharmony_ci * Helper method for HasBindig operation 135425bb815Sopenharmony_ci * 136425bb815Sopenharmony_ci * See also: 137425bb815Sopenharmony_ci * ECMA-262 v6, 8.1.1.2.1 steps 7-9; 138425bb815Sopenharmony_ci * 139425bb815Sopenharmony_ci * @return ECMA_VALUE_TRUE - if the property is unscopable 140425bb815Sopenharmony_ci * ECMA_VALUE_FALSE - if a the property is not unscopable 141425bb815Sopenharmony_ci * ECMA_VALUE_ERROR - otherwise 142425bb815Sopenharmony_ci */ 143425bb815Sopenharmony_cistatic ecma_value_t 144425bb815Sopenharmony_ciecma_op_is_prop_unscopable (ecma_object_t *binding_obj_p, /**< binding object */ 145425bb815Sopenharmony_ci ecma_string_t *prop_name_p) /**< property's name */ 146425bb815Sopenharmony_ci{ 147425bb815Sopenharmony_ci ecma_value_t unscopables = ecma_op_object_get_by_symbol_id (binding_obj_p, LIT_GLOBAL_SYMBOL_UNSCOPABLES); 148425bb815Sopenharmony_ci 149425bb815Sopenharmony_ci if (ECMA_IS_VALUE_ERROR (unscopables)) 150425bb815Sopenharmony_ci { 151425bb815Sopenharmony_ci return unscopables; 152425bb815Sopenharmony_ci } 153425bb815Sopenharmony_ci 154425bb815Sopenharmony_ci if (ecma_is_value_object (unscopables)) 155425bb815Sopenharmony_ci { 156425bb815Sopenharmony_ci ecma_object_t *unscopables_obj_p = ecma_get_object_from_value (unscopables); 157425bb815Sopenharmony_ci ecma_value_t get_unscopables_value = ecma_op_object_get (unscopables_obj_p, prop_name_p); 158425bb815Sopenharmony_ci ecma_deref_object (unscopables_obj_p); 159425bb815Sopenharmony_ci 160425bb815Sopenharmony_ci if (ECMA_IS_VALUE_ERROR (get_unscopables_value)) 161425bb815Sopenharmony_ci { 162425bb815Sopenharmony_ci return get_unscopables_value; 163425bb815Sopenharmony_ci } 164425bb815Sopenharmony_ci 165425bb815Sopenharmony_ci bool is_blocked = ecma_op_to_boolean (get_unscopables_value); 166425bb815Sopenharmony_ci 167425bb815Sopenharmony_ci ecma_free_value (get_unscopables_value); 168425bb815Sopenharmony_ci 169425bb815Sopenharmony_ci return ecma_make_boolean_value (is_blocked); 170425bb815Sopenharmony_ci } 171425bb815Sopenharmony_ci 172425bb815Sopenharmony_ci ecma_free_value (unscopables); 173425bb815Sopenharmony_ci 174425bb815Sopenharmony_ci return ECMA_VALUE_FALSE; 175425bb815Sopenharmony_ci} /* ecma_op_is_prop_unscopable */ 176425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015) */ 177425bb815Sopenharmony_ci 178425bb815Sopenharmony_ci/** 179425bb815Sopenharmony_ci * Helper method for HasBindig operation 180425bb815Sopenharmony_ci * 181425bb815Sopenharmony_ci * See also: 182425bb815Sopenharmony_ci * ECMA-262 v6, 8.1.1.2.1 steps 7-9; 183425bb815Sopenharmony_ci * 184425bb815Sopenharmony_ci * @return ECMA_VALUE_TRUE - if the property is unscopable 185425bb815Sopenharmony_ci * ECMA_VALUE_FALSE - if a the property is not unscopable 186425bb815Sopenharmony_ci * ECMA_VALUE_ERROR - otherwise 187425bb815Sopenharmony_ci */ 188425bb815Sopenharmony_ci 189425bb815Sopenharmony_ci/** 190425bb815Sopenharmony_ci * Resolve value corresponding to the given object environment reference. 191425bb815Sopenharmony_ci * 192425bb815Sopenharmony_ci * Note: the steps are already include the HasBindig operation steps 193425bb815Sopenharmony_ci * 194425bb815Sopenharmony_ci * See also: 195425bb815Sopenharmony_ci * ECMA-262 v6, 8.1.1.2.1 196425bb815Sopenharmony_ci * 197425bb815Sopenharmony_ci * @return ECMA_VALUE_ERROR - if the operation fails 198425bb815Sopenharmony_ci * ECMA_VALUE_NOT_FOUND - if the binding not exists or blocked via @@unscopables 199425bb815Sopenharmony_ci * result of the binding - otherwise 200425bb815Sopenharmony_ci */ 201425bb815Sopenharmony_ciecma_value_t 202425bb815Sopenharmony_ciecma_op_object_bound_environment_resolve_reference_value (ecma_object_t *lex_env_p, /**< lexical environment */ 203425bb815Sopenharmony_ci ecma_string_t *name_p) /**< variable name */ 204425bb815Sopenharmony_ci{ 205425bb815Sopenharmony_ci ecma_object_t *binding_obj_p = ecma_get_lex_env_binding_object (lex_env_p); 206425bb815Sopenharmony_ci ecma_value_t found_binding; 207425bb815Sopenharmony_ci 208425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015_BUILTIN_PROXY) 209425bb815Sopenharmony_ci if (ECMA_OBJECT_IS_PROXY (binding_obj_p)) 210425bb815Sopenharmony_ci { 211425bb815Sopenharmony_ci found_binding = ecma_proxy_object_has (binding_obj_p, name_p); 212425bb815Sopenharmony_ci 213425bb815Sopenharmony_ci if (!ecma_is_value_true (found_binding)) 214425bb815Sopenharmony_ci { 215425bb815Sopenharmony_ci return ECMA_IS_VALUE_ERROR (found_binding) ? found_binding : ECMA_VALUE_NOT_FOUND; 216425bb815Sopenharmony_ci } 217425bb815Sopenharmony_ci } 218425bb815Sopenharmony_ci else 219425bb815Sopenharmony_ci { 220425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015_BUILTIN_PROXY) */ 221425bb815Sopenharmony_ci found_binding = ecma_op_object_find (binding_obj_p, name_p); 222425bb815Sopenharmony_ci 223425bb815Sopenharmony_ci if (ECMA_IS_VALUE_ERROR (found_binding) || !ecma_is_value_found (found_binding)) 224425bb815Sopenharmony_ci { 225425bb815Sopenharmony_ci return found_binding; 226425bb815Sopenharmony_ci } 227425bb815Sopenharmony_ci 228425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015) 229425bb815Sopenharmony_ci if (JERRY_LIKELY (lex_env_p == ecma_get_global_scope ())) 230425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015) */ 231425bb815Sopenharmony_ci { 232425bb815Sopenharmony_ci return found_binding; 233425bb815Sopenharmony_ci } 234425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015_BUILTIN_PROXY) 235425bb815Sopenharmony_ci } 236425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015_BUILTIN_PROXY) */ 237425bb815Sopenharmony_ci 238425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015) 239425bb815Sopenharmony_ci ecma_value_t blocked = ecma_op_is_prop_unscopable (binding_obj_p, name_p); 240425bb815Sopenharmony_ci 241425bb815Sopenharmony_ci if (ecma_is_value_false (blocked)) 242425bb815Sopenharmony_ci { 243425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015_BUILTIN_PROXY) 244425bb815Sopenharmony_ci if (ECMA_OBJECT_IS_PROXY (binding_obj_p)) 245425bb815Sopenharmony_ci { 246425bb815Sopenharmony_ci return ecma_proxy_object_get (binding_obj_p, name_p, ecma_make_object_value (binding_obj_p)); 247425bb815Sopenharmony_ci } 248425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015_BUILTIN_PROXY) */ 249425bb815Sopenharmony_ci return found_binding; 250425bb815Sopenharmony_ci } 251425bb815Sopenharmony_ci 252425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015_BUILTIN_PROXY) 253425bb815Sopenharmony_ci if (!ECMA_OBJECT_IS_PROXY (binding_obj_p)) 254425bb815Sopenharmony_ci { 255425bb815Sopenharmony_ci ecma_free_value (found_binding); 256425bb815Sopenharmony_ci } 257425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015_BUILTIN_PROXY) */ 258425bb815Sopenharmony_ci 259425bb815Sopenharmony_ci return ECMA_IS_VALUE_ERROR (blocked) ? blocked : ECMA_VALUE_NOT_FOUND; 260425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015) */ 261425bb815Sopenharmony_ci} /* ecma_op_object_bound_environment_resolve_reference_value */ 262425bb815Sopenharmony_ci 263425bb815Sopenharmony_ci/** 264425bb815Sopenharmony_ci * Resolve value corresponding to reference. 265425bb815Sopenharmony_ci * 266425bb815Sopenharmony_ci * @return value of the reference 267425bb815Sopenharmony_ci */ 268425bb815Sopenharmony_ciecma_value_t 269425bb815Sopenharmony_ciecma_op_resolve_reference_value (ecma_object_t *lex_env_p, /**< starting lexical environment */ 270425bb815Sopenharmony_ci ecma_string_t *name_p) /**< identifier's name */ 271425bb815Sopenharmony_ci{ 272425bb815Sopenharmony_ci JERRY_ASSERT (lex_env_p != NULL); 273425bb815Sopenharmony_ci 274425bb815Sopenharmony_ci while (true) 275425bb815Sopenharmony_ci { 276425bb815Sopenharmony_ci ecma_lexical_environment_type_t lex_env_type = ecma_get_lex_env_type (lex_env_p); 277425bb815Sopenharmony_ci 278425bb815Sopenharmony_ci if (lex_env_type == ECMA_LEXICAL_ENVIRONMENT_DECLARATIVE) 279425bb815Sopenharmony_ci { 280425bb815Sopenharmony_ci ecma_property_t *property_p = ecma_find_named_property (lex_env_p, name_p); 281425bb815Sopenharmony_ci 282425bb815Sopenharmony_ci if (property_p != NULL) 283425bb815Sopenharmony_ci { 284425bb815Sopenharmony_ci ecma_property_value_t *property_value_p = ECMA_PROPERTY_VALUE_PTR (property_p); 285425bb815Sopenharmony_ci 286425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015) 287425bb815Sopenharmony_ci if (JERRY_UNLIKELY (property_value_p->value == ECMA_VALUE_UNINITIALIZED)) 288425bb815Sopenharmony_ci { 289425bb815Sopenharmony_ci return ecma_raise_reference_error (ECMA_ERR_MSG ("Variables declared by let/const must be" 290425bb815Sopenharmony_ci " initialized before reading their value.")); 291425bb815Sopenharmony_ci } 292425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015) */ 293425bb815Sopenharmony_ci 294425bb815Sopenharmony_ci return ecma_fast_copy_value (property_value_p->value); 295425bb815Sopenharmony_ci } 296425bb815Sopenharmony_ci } 297425bb815Sopenharmony_ci else if (lex_env_type == ECMA_LEXICAL_ENVIRONMENT_THIS_OBJECT_BOUND) 298425bb815Sopenharmony_ci { 299425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015) 300425bb815Sopenharmony_ci bool lcache_lookup_allowed = (lex_env_p == ecma_get_global_environment ()); 301425bb815Sopenharmony_ci#else /* !ENABLED (JERRY_ES2015)*/ 302425bb815Sopenharmony_ci bool lcache_lookup_allowed = true; 303425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015) */ 304425bb815Sopenharmony_ci 305425bb815Sopenharmony_ci if (lcache_lookup_allowed) 306425bb815Sopenharmony_ci { 307425bb815Sopenharmony_ci#if ENABLED (JERRY_LCACHE) 308425bb815Sopenharmony_ci ecma_object_t *binding_obj_p = ecma_get_lex_env_binding_object (lex_env_p); 309425bb815Sopenharmony_ci ecma_property_t *property_p = ecma_lcache_lookup (binding_obj_p, name_p); 310425bb815Sopenharmony_ci 311425bb815Sopenharmony_ci if (property_p != NULL) 312425bb815Sopenharmony_ci { 313425bb815Sopenharmony_ci ecma_property_value_t *prop_value_p = ECMA_PROPERTY_VALUE_PTR (property_p); 314425bb815Sopenharmony_ci 315425bb815Sopenharmony_ci if (ECMA_PROPERTY_GET_TYPE (*property_p) == ECMA_PROPERTY_TYPE_NAMEDDATA) 316425bb815Sopenharmony_ci { 317425bb815Sopenharmony_ci return ecma_fast_copy_value (prop_value_p->value); 318425bb815Sopenharmony_ci } 319425bb815Sopenharmony_ci 320425bb815Sopenharmony_ci JERRY_ASSERT (ECMA_PROPERTY_GET_TYPE (*property_p) == ECMA_PROPERTY_TYPE_NAMEDACCESSOR); 321425bb815Sopenharmony_ci 322425bb815Sopenharmony_ci ecma_getter_setter_pointers_t *get_set_pair_p = ecma_get_named_accessor_property (prop_value_p); 323425bb815Sopenharmony_ci 324425bb815Sopenharmony_ci if (get_set_pair_p->getter_cp == JMEM_CP_NULL) 325425bb815Sopenharmony_ci { 326425bb815Sopenharmony_ci return ECMA_VALUE_UNDEFINED; 327425bb815Sopenharmony_ci } 328425bb815Sopenharmony_ci 329425bb815Sopenharmony_ci ecma_object_t *getter_p = ECMA_GET_NON_NULL_POINTER (ecma_object_t, get_set_pair_p->getter_cp); 330425bb815Sopenharmony_ci 331425bb815Sopenharmony_ci ecma_value_t base_value = ecma_make_object_value (binding_obj_p); 332425bb815Sopenharmony_ci return ecma_op_function_call (getter_p, base_value, NULL, 0); 333425bb815Sopenharmony_ci } 334425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_LCACHE) */ 335425bb815Sopenharmony_ci } 336425bb815Sopenharmony_ci 337425bb815Sopenharmony_ci ecma_value_t result = ecma_op_object_bound_environment_resolve_reference_value (lex_env_p, name_p); 338425bb815Sopenharmony_ci 339425bb815Sopenharmony_ci if (ecma_is_value_found (result)) 340425bb815Sopenharmony_ci { 341425bb815Sopenharmony_ci /* Note: the result may contains ECMA_VALUE_ERROR */ 342425bb815Sopenharmony_ci return result; 343425bb815Sopenharmony_ci } 344425bb815Sopenharmony_ci } 345425bb815Sopenharmony_ci else 346425bb815Sopenharmony_ci { 347425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015) 348425bb815Sopenharmony_ci JERRY_ASSERT (lex_env_type == ECMA_LEXICAL_ENVIRONMENT_HOME_OBJECT_BOUND); 349425bb815Sopenharmony_ci#else /* !ENABLED (JERRY_ES2015) */ 350425bb815Sopenharmony_ci JERRY_UNREACHABLE (); 351425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015) */ 352425bb815Sopenharmony_ci } 353425bb815Sopenharmony_ci 354425bb815Sopenharmony_ci if (lex_env_p->u2.outer_reference_cp == JMEM_CP_NULL) 355425bb815Sopenharmony_ci { 356425bb815Sopenharmony_ci break; 357425bb815Sopenharmony_ci } 358425bb815Sopenharmony_ci 359425bb815Sopenharmony_ci lex_env_p = ECMA_GET_NON_NULL_POINTER (ecma_object_t, lex_env_p->u2.outer_reference_cp); 360425bb815Sopenharmony_ci } 361425bb815Sopenharmony_ci 362425bb815Sopenharmony_ci#if ENABLED (JERRY_ERROR_MESSAGES) 363425bb815Sopenharmony_ci ecma_value_t name_val = ecma_make_string_value (name_p); 364425bb815Sopenharmony_ci ecma_value_t error_value = ecma_raise_standard_error_with_format (ECMA_ERROR_REFERENCE, 365425bb815Sopenharmony_ci "% is not defined", 366425bb815Sopenharmony_ci name_val); 367425bb815Sopenharmony_ci#else /* ENABLED (JERRY_ERROR_MESSAGES) */ 368425bb815Sopenharmony_ci ecma_value_t error_value = ecma_raise_reference_error (NULL); 369425bb815Sopenharmony_ci#endif /* !ENABLED (JERRY_ERROR_MESSAGES) */ 370425bb815Sopenharmony_ci return error_value; 371425bb815Sopenharmony_ci} /* ecma_op_resolve_reference_value */ 372425bb815Sopenharmony_ci 373425bb815Sopenharmony_ci/** 374425bb815Sopenharmony_ci * @} 375425bb815Sopenharmony_ci * @} 376425bb815Sopenharmony_ci */ 377