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