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-exceptions.h"
18425bb815Sopenharmony_ci#include "ecma-gc.h"
19425bb815Sopenharmony_ci#include "ecma-globals.h"
20425bb815Sopenharmony_ci#include "ecma-helpers.h"
21425bb815Sopenharmony_ci#include "jrt.h"
22425bb815Sopenharmony_ci#include "jrt-bit-fields.h"
23425bb815Sopenharmony_ci#include "vm-defines.h"
24425bb815Sopenharmony_ci
25425bb815Sopenharmony_ci#include "ecma-function-object.h"
26425bb815Sopenharmony_ci
27425bb815Sopenharmony_ciJERRY_STATIC_ASSERT (ECMA_TYPE___MAX <= ECMA_VALUE_TYPE_MASK,
28425bb815Sopenharmony_ci                     ecma_types_must_be_less_than_mask);
29425bb815Sopenharmony_ci
30425bb815Sopenharmony_ciJERRY_STATIC_ASSERT ((ECMA_VALUE_TYPE_MASK + 1) == (1 << ECMA_VALUE_SHIFT),
31425bb815Sopenharmony_ci                     ecma_value_part_must_start_after_flags);
32425bb815Sopenharmony_ci
33425bb815Sopenharmony_ciJERRY_STATIC_ASSERT (ECMA_VALUE_SHIFT <= JMEM_ALIGNMENT_LOG,
34425bb815Sopenharmony_ci                     ecma_value_shift_must_be_less_than_or_equal_than_mem_alignment_log);
35425bb815Sopenharmony_ci
36425bb815Sopenharmony_ciJERRY_STATIC_ASSERT (sizeof (jmem_cpointer_t) <= sizeof (ecma_value_t),
37425bb815Sopenharmony_ci                     size_of_jmem_cpointer_t_must_be_less_or_equal_to_the_size_of_ecma_value_t);
38425bb815Sopenharmony_ci
39425bb815Sopenharmony_ciJERRY_STATIC_ASSERT (sizeof (jmem_cpointer_t) <= sizeof (jmem_cpointer_tag_t),
40425bb815Sopenharmony_ci                     size_of_jmem_cpointer_t_must_be_less_or_equal_to_the_size_of_jmem_cpointer_tag_t);
41425bb815Sopenharmony_ci
42425bb815Sopenharmony_ci#ifdef ECMA_VALUE_CAN_STORE_UINTPTR_VALUE_DIRECTLY
43425bb815Sopenharmony_ci
44425bb815Sopenharmony_ci/* cppcheck-suppress zerodiv */
45425bb815Sopenharmony_ciJERRY_STATIC_ASSERT (sizeof (uintptr_t) <= sizeof (ecma_value_t),
46425bb815Sopenharmony_ci                     uintptr_t_must_fit_in_ecma_value_t);
47425bb815Sopenharmony_ci
48425bb815Sopenharmony_ci#else /* !ECMA_VALUE_CAN_STORE_UINTPTR_VALUE_DIRECTLY */
49425bb815Sopenharmony_ci
50425bb815Sopenharmony_ciJERRY_STATIC_ASSERT (sizeof (uintptr_t) > sizeof (ecma_value_t),
51425bb815Sopenharmony_ci                     uintptr_t_must_not_fit_in_ecma_value_t);
52425bb815Sopenharmony_ci
53425bb815Sopenharmony_ci#endif /* ECMA_VALUE_CAN_STORE_UINTPTR_VALUE_DIRECTLY */
54425bb815Sopenharmony_ci
55425bb815Sopenharmony_ciJERRY_STATIC_ASSERT ((ECMA_VALUE_FALSE | (1 << ECMA_DIRECT_SHIFT)) == ECMA_VALUE_TRUE
56425bb815Sopenharmony_ci                     && ECMA_VALUE_FALSE != ECMA_VALUE_TRUE,
57425bb815Sopenharmony_ci                     only_the_lowest_bit_must_be_different_for_simple_value_true_and_false);
58425bb815Sopenharmony_ci
59425bb815Sopenharmony_ci/** \addtogroup ecma ECMA
60425bb815Sopenharmony_ci * @{
61425bb815Sopenharmony_ci *
62425bb815Sopenharmony_ci * \addtogroup ecmahelpers Helpers for operations with ECMA data types
63425bb815Sopenharmony_ci * @{
64425bb815Sopenharmony_ci */
65425bb815Sopenharmony_ci
66425bb815Sopenharmony_ci/**
67425bb815Sopenharmony_ci * Get type field of ecma value
68425bb815Sopenharmony_ci *
69425bb815Sopenharmony_ci * @return type field
70425bb815Sopenharmony_ci */
71425bb815Sopenharmony_ciextern inline ecma_type_t JERRY_ATTR_CONST JERRY_ATTR_ALWAYS_INLINE
72425bb815Sopenharmony_ciecma_get_value_type_field (ecma_value_t value) /**< ecma value */
73425bb815Sopenharmony_ci{
74425bb815Sopenharmony_ci  return value & ECMA_VALUE_TYPE_MASK;
75425bb815Sopenharmony_ci} /* ecma_get_value_type_field */
76425bb815Sopenharmony_ci
77425bb815Sopenharmony_ci/**
78425bb815Sopenharmony_ci * Convert a pointer into an ecma value.
79425bb815Sopenharmony_ci *
80425bb815Sopenharmony_ci * @return ecma value
81425bb815Sopenharmony_ci */
82425bb815Sopenharmony_cistatic inline ecma_value_t JERRY_ATTR_PURE JERRY_ATTR_ALWAYS_INLINE
83425bb815Sopenharmony_ciecma_pointer_to_ecma_value (const void *ptr) /**< pointer */
84425bb815Sopenharmony_ci{
85425bb815Sopenharmony_ci#ifdef ECMA_VALUE_CAN_STORE_UINTPTR_VALUE_DIRECTLY
86425bb815Sopenharmony_ci
87425bb815Sopenharmony_ci  JERRY_ASSERT (ptr != NULL);
88425bb815Sopenharmony_ci  uintptr_t uint_ptr = (uintptr_t) ptr;
89425bb815Sopenharmony_ci  JERRY_ASSERT ((uint_ptr & ECMA_VALUE_TYPE_MASK) == 0);
90425bb815Sopenharmony_ci  return (ecma_value_t) uint_ptr;
91425bb815Sopenharmony_ci
92425bb815Sopenharmony_ci#else /* !ECMA_VALUE_CAN_STORE_UINTPTR_VALUE_DIRECTLY */
93425bb815Sopenharmony_ci
94425bb815Sopenharmony_ci  jmem_cpointer_t ptr_cp;
95425bb815Sopenharmony_ci  ECMA_SET_NON_NULL_POINTER (ptr_cp, ptr);
96425bb815Sopenharmony_ci  return ((ecma_value_t) ptr_cp) << ECMA_VALUE_SHIFT;
97425bb815Sopenharmony_ci
98425bb815Sopenharmony_ci#endif /* ECMA_VALUE_CAN_STORE_UINTPTR_VALUE_DIRECTLY */
99425bb815Sopenharmony_ci} /* ecma_pointer_to_ecma_value */
100425bb815Sopenharmony_ci
101425bb815Sopenharmony_ci/**
102425bb815Sopenharmony_ci * Get a pointer from an ecma value
103425bb815Sopenharmony_ci *
104425bb815Sopenharmony_ci * @return pointer
105425bb815Sopenharmony_ci */
106425bb815Sopenharmony_cistatic inline void * JERRY_ATTR_PURE JERRY_ATTR_ALWAYS_INLINE
107425bb815Sopenharmony_ciecma_get_pointer_from_ecma_value (ecma_value_t value) /**< value */
108425bb815Sopenharmony_ci{
109425bb815Sopenharmony_ci#ifdef ECMA_VALUE_CAN_STORE_UINTPTR_VALUE_DIRECTLY
110425bb815Sopenharmony_ci  void *ptr = (void *) (uintptr_t) ((value) & ~ECMA_VALUE_TYPE_MASK);
111425bb815Sopenharmony_ci  JERRY_ASSERT (ptr != NULL);
112425bb815Sopenharmony_ci  return ptr;
113425bb815Sopenharmony_ci#else /* !ECMA_VALUE_CAN_STORE_UINTPTR_VALUE_DIRECTLY */
114425bb815Sopenharmony_ci  return ECMA_GET_NON_NULL_POINTER (void, value >> ECMA_VALUE_SHIFT);
115425bb815Sopenharmony_ci#endif /* ECMA_VALUE_CAN_STORE_UINTPTR_VALUE_DIRECTLY */
116425bb815Sopenharmony_ci} /* ecma_get_pointer_from_ecma_value */
117425bb815Sopenharmony_ci
118425bb815Sopenharmony_ci/**
119425bb815Sopenharmony_ci * Check if the value is direct ecma-value.
120425bb815Sopenharmony_ci *
121425bb815Sopenharmony_ci * @return true - if the value is a direct value,
122425bb815Sopenharmony_ci *         false - otherwise
123425bb815Sopenharmony_ci */
124425bb815Sopenharmony_ciinline bool JERRY_ATTR_CONST JERRY_ATTR_ALWAYS_INLINE
125425bb815Sopenharmony_ciecma_is_value_direct (ecma_value_t value) /**< ecma value */
126425bb815Sopenharmony_ci{
127425bb815Sopenharmony_ci  return (ecma_get_value_type_field (value) == ECMA_TYPE_DIRECT);
128425bb815Sopenharmony_ci} /* ecma_is_value_direct */
129425bb815Sopenharmony_ci
130425bb815Sopenharmony_ci/**
131425bb815Sopenharmony_ci * Check if the value is simple ecma-value.
132425bb815Sopenharmony_ci *
133425bb815Sopenharmony_ci * @return true - if the value is a simple value,
134425bb815Sopenharmony_ci *         false - otherwise
135425bb815Sopenharmony_ci */
136425bb815Sopenharmony_ciinline bool JERRY_ATTR_CONST JERRY_ATTR_ALWAYS_INLINE
137425bb815Sopenharmony_ciecma_is_value_simple (ecma_value_t value) /**< ecma value */
138425bb815Sopenharmony_ci{
139425bb815Sopenharmony_ci  return (value & ECMA_DIRECT_TYPE_MASK) == ECMA_DIRECT_TYPE_SIMPLE_VALUE;
140425bb815Sopenharmony_ci} /* ecma_is_value_simple */
141425bb815Sopenharmony_ci
142425bb815Sopenharmony_ci/**
143425bb815Sopenharmony_ci * Check whether the value is a given simple value.
144425bb815Sopenharmony_ci *
145425bb815Sopenharmony_ci * @return true - if the value is equal to the given simple value,
146425bb815Sopenharmony_ci *         false - otherwise
147425bb815Sopenharmony_ci */
148425bb815Sopenharmony_cistatic inline bool JERRY_ATTR_CONST JERRY_ATTR_ALWAYS_INLINE
149425bb815Sopenharmony_ciecma_is_value_equal_to_simple_value (ecma_value_t value, /**< ecma value */
150425bb815Sopenharmony_ci                                     ecma_value_t simple_value) /**< simple value */
151425bb815Sopenharmony_ci{
152425bb815Sopenharmony_ci  return value == simple_value;
153425bb815Sopenharmony_ci} /* ecma_is_value_equal_to_simple_value */
154425bb815Sopenharmony_ci
155425bb815Sopenharmony_ci/**
156425bb815Sopenharmony_ci * Check if the value is empty.
157425bb815Sopenharmony_ci *
158425bb815Sopenharmony_ci * @return true - if the value contains implementation-defined empty simple value,
159425bb815Sopenharmony_ci *         false - otherwise
160425bb815Sopenharmony_ci */
161425bb815Sopenharmony_ciinline bool JERRY_ATTR_CONST JERRY_ATTR_ALWAYS_INLINE
162425bb815Sopenharmony_ciecma_is_value_empty (ecma_value_t value) /**< ecma value */
163425bb815Sopenharmony_ci{
164425bb815Sopenharmony_ci  return ecma_is_value_equal_to_simple_value (value, ECMA_VALUE_EMPTY);
165425bb815Sopenharmony_ci} /* ecma_is_value_empty */
166425bb815Sopenharmony_ci
167425bb815Sopenharmony_ci/**
168425bb815Sopenharmony_ci * Check if the value is undefined.
169425bb815Sopenharmony_ci *
170425bb815Sopenharmony_ci * @return true - if the value contains ecma-undefined simple value,
171425bb815Sopenharmony_ci *         false - otherwise
172425bb815Sopenharmony_ci */
173425bb815Sopenharmony_ciinline bool JERRY_ATTR_CONST JERRY_ATTR_ALWAYS_INLINE
174425bb815Sopenharmony_ciecma_is_value_undefined (ecma_value_t value) /**< ecma value */
175425bb815Sopenharmony_ci{
176425bb815Sopenharmony_ci  return ecma_is_value_equal_to_simple_value (value, ECMA_VALUE_UNDEFINED);
177425bb815Sopenharmony_ci} /* ecma_is_value_undefined */
178425bb815Sopenharmony_ci
179425bb815Sopenharmony_ci/**
180425bb815Sopenharmony_ci * Check if the value is null.
181425bb815Sopenharmony_ci *
182425bb815Sopenharmony_ci * @return true - if the value contains ecma-null simple value,
183425bb815Sopenharmony_ci *         false - otherwise
184425bb815Sopenharmony_ci */
185425bb815Sopenharmony_ciinline bool JERRY_ATTR_CONST JERRY_ATTR_ALWAYS_INLINE
186425bb815Sopenharmony_ciecma_is_value_null (ecma_value_t value) /**< ecma value */
187425bb815Sopenharmony_ci{
188425bb815Sopenharmony_ci  return ecma_is_value_equal_to_simple_value (value, ECMA_VALUE_NULL);
189425bb815Sopenharmony_ci} /* ecma_is_value_null */
190425bb815Sopenharmony_ci
191425bb815Sopenharmony_ci/**
192425bb815Sopenharmony_ci * Check if the value is boolean.
193425bb815Sopenharmony_ci *
194425bb815Sopenharmony_ci * @return true - if the value contains ecma-true or ecma-false simple values,
195425bb815Sopenharmony_ci *         false - otherwise
196425bb815Sopenharmony_ci */
197425bb815Sopenharmony_ciinline bool JERRY_ATTR_CONST JERRY_ATTR_ALWAYS_INLINE
198425bb815Sopenharmony_ciecma_is_value_boolean (ecma_value_t value) /**< ecma value */
199425bb815Sopenharmony_ci{
200425bb815Sopenharmony_ci  return ecma_is_value_true (value | (1 << ECMA_DIRECT_SHIFT));
201425bb815Sopenharmony_ci} /* ecma_is_value_boolean */
202425bb815Sopenharmony_ci
203425bb815Sopenharmony_ci/**
204425bb815Sopenharmony_ci * Check if the value is true.
205425bb815Sopenharmony_ci *
206425bb815Sopenharmony_ci * @return true - if the value contains ecma-true simple value,
207425bb815Sopenharmony_ci *         false - otherwise
208425bb815Sopenharmony_ci */
209425bb815Sopenharmony_ciinline bool JERRY_ATTR_CONST JERRY_ATTR_ALWAYS_INLINE
210425bb815Sopenharmony_ciecma_is_value_true (ecma_value_t value) /**< ecma value */
211425bb815Sopenharmony_ci{
212425bb815Sopenharmony_ci  return ecma_is_value_equal_to_simple_value (value, ECMA_VALUE_TRUE);
213425bb815Sopenharmony_ci} /* ecma_is_value_true */
214425bb815Sopenharmony_ci
215425bb815Sopenharmony_ci/**
216425bb815Sopenharmony_ci * Check if the value is false.
217425bb815Sopenharmony_ci *
218425bb815Sopenharmony_ci * @return true - if the value contains ecma-false simple value,
219425bb815Sopenharmony_ci *         false - otherwise
220425bb815Sopenharmony_ci */
221425bb815Sopenharmony_ciinline bool JERRY_ATTR_CONST JERRY_ATTR_ALWAYS_INLINE
222425bb815Sopenharmony_ciecma_is_value_false (ecma_value_t value) /**< ecma value */
223425bb815Sopenharmony_ci{
224425bb815Sopenharmony_ci  return ecma_is_value_equal_to_simple_value (value, ECMA_VALUE_FALSE);
225425bb815Sopenharmony_ci} /* ecma_is_value_false */
226425bb815Sopenharmony_ci
227425bb815Sopenharmony_ci/**
228425bb815Sopenharmony_ci * Check if the value is not found.
229425bb815Sopenharmony_ci *
230425bb815Sopenharmony_ci * @return true - if the value contains ecma-not-found simple value,
231425bb815Sopenharmony_ci *         false - otherwise
232425bb815Sopenharmony_ci */
233425bb815Sopenharmony_ciinline bool JERRY_ATTR_CONST JERRY_ATTR_ALWAYS_INLINE
234425bb815Sopenharmony_ciecma_is_value_found (ecma_value_t value) /**< ecma value */
235425bb815Sopenharmony_ci{
236425bb815Sopenharmony_ci  return value != ECMA_VALUE_NOT_FOUND;
237425bb815Sopenharmony_ci} /* ecma_is_value_found */
238425bb815Sopenharmony_ci
239425bb815Sopenharmony_ci/**
240425bb815Sopenharmony_ci * Check if the value is array hole.
241425bb815Sopenharmony_ci *
242425bb815Sopenharmony_ci * @return true - if the value contains ecma-array-hole simple value,
243425bb815Sopenharmony_ci *         false - otherwise
244425bb815Sopenharmony_ci */
245425bb815Sopenharmony_ciinline bool JERRY_ATTR_CONST JERRY_ATTR_ALWAYS_INLINE
246425bb815Sopenharmony_ciecma_is_value_array_hole (ecma_value_t value) /**< ecma value */
247425bb815Sopenharmony_ci{
248425bb815Sopenharmony_ci  return ecma_is_value_equal_to_simple_value (value, ECMA_VALUE_ARRAY_HOLE);
249425bb815Sopenharmony_ci} /* ecma_is_value_array_hole */
250425bb815Sopenharmony_ci
251425bb815Sopenharmony_ci/**
252425bb815Sopenharmony_ci * Check if the value is integer ecma-number.
253425bb815Sopenharmony_ci *
254425bb815Sopenharmony_ci * @return true - if the value contains an integer ecma-number value,
255425bb815Sopenharmony_ci *         false - otherwise
256425bb815Sopenharmony_ci */
257425bb815Sopenharmony_ciinline bool JERRY_ATTR_CONST JERRY_ATTR_ALWAYS_INLINE
258425bb815Sopenharmony_ciecma_is_value_integer_number (ecma_value_t value) /**< ecma value */
259425bb815Sopenharmony_ci{
260425bb815Sopenharmony_ci  return (value & ECMA_DIRECT_TYPE_MASK) == ECMA_DIRECT_TYPE_INTEGER_VALUE;
261425bb815Sopenharmony_ci} /* ecma_is_value_integer_number */
262425bb815Sopenharmony_ci
263425bb815Sopenharmony_ci/**
264425bb815Sopenharmony_ci * Check if both values are integer ecma-numbers.
265425bb815Sopenharmony_ci *
266425bb815Sopenharmony_ci * @return true - if both values contain integer ecma-number values,
267425bb815Sopenharmony_ci *         false - otherwise
268425bb815Sopenharmony_ci */
269425bb815Sopenharmony_ciinline bool JERRY_ATTR_CONST JERRY_ATTR_ALWAYS_INLINE
270425bb815Sopenharmony_ciecma_are_values_integer_numbers (ecma_value_t first_value, /**< first ecma value */
271425bb815Sopenharmony_ci                                 ecma_value_t second_value) /**< second ecma value */
272425bb815Sopenharmony_ci{
273425bb815Sopenharmony_ci  JERRY_STATIC_ASSERT (ECMA_DIRECT_TYPE_INTEGER_VALUE == 0,
274425bb815Sopenharmony_ci                       ecma_direct_type_integer_value_must_be_zero);
275425bb815Sopenharmony_ci
276425bb815Sopenharmony_ci  return ((first_value | second_value) & ECMA_DIRECT_TYPE_MASK) == ECMA_DIRECT_TYPE_INTEGER_VALUE;
277425bb815Sopenharmony_ci} /* ecma_are_values_integer_numbers */
278425bb815Sopenharmony_ci
279425bb815Sopenharmony_ci/**
280425bb815Sopenharmony_ci * Check if the value is floating-point ecma-number.
281425bb815Sopenharmony_ci *
282425bb815Sopenharmony_ci * @return true - if the value contains a floating-point ecma-number value,
283425bb815Sopenharmony_ci *         false - otherwise
284425bb815Sopenharmony_ci */
285425bb815Sopenharmony_ciinline bool JERRY_ATTR_CONST JERRY_ATTR_ALWAYS_INLINE
286425bb815Sopenharmony_ciecma_is_value_float_number (ecma_value_t value) /**< ecma value */
287425bb815Sopenharmony_ci{
288425bb815Sopenharmony_ci  return (ecma_get_value_type_field (value) == ECMA_TYPE_FLOAT);
289425bb815Sopenharmony_ci} /* ecma_is_value_float_number */
290425bb815Sopenharmony_ci
291425bb815Sopenharmony_ci/**
292425bb815Sopenharmony_ci * Check if the value is ecma-number.
293425bb815Sopenharmony_ci *
294425bb815Sopenharmony_ci * @return true - if the value contains ecma-number value,
295425bb815Sopenharmony_ci *         false - otherwise
296425bb815Sopenharmony_ci */
297425bb815Sopenharmony_ciextern inline bool JERRY_ATTR_CONST JERRY_ATTR_ALWAYS_INLINE
298425bb815Sopenharmony_ciecma_is_value_number (ecma_value_t value) /**< ecma value */
299425bb815Sopenharmony_ci{
300425bb815Sopenharmony_ci  return (ecma_is_value_integer_number (value)
301425bb815Sopenharmony_ci          || ecma_is_value_float_number (value));
302425bb815Sopenharmony_ci} /* ecma_is_value_number */
303425bb815Sopenharmony_ci
304425bb815Sopenharmony_ciJERRY_STATIC_ASSERT ((ECMA_TYPE_STRING | 0x4) == ECMA_TYPE_DIRECT_STRING,
305425bb815Sopenharmony_ci                     ecma_type_string_and_direct_string_must_have_one_bit_difference);
306425bb815Sopenharmony_ci
307425bb815Sopenharmony_ci/**
308425bb815Sopenharmony_ci * Check if the value is ecma-string.
309425bb815Sopenharmony_ci *
310425bb815Sopenharmony_ci * @return true - if the value contains ecma-string value,
311425bb815Sopenharmony_ci *         false - otherwise
312425bb815Sopenharmony_ci */
313425bb815Sopenharmony_ciextern inline bool JERRY_ATTR_CONST JERRY_ATTR_ALWAYS_INLINE
314425bb815Sopenharmony_ciecma_is_value_string (ecma_value_t value) /**< ecma value */
315425bb815Sopenharmony_ci{
316425bb815Sopenharmony_ci  return ((value & (ECMA_VALUE_TYPE_MASK - 0x4)) == ECMA_TYPE_STRING);
317425bb815Sopenharmony_ci} /* ecma_is_value_string */
318425bb815Sopenharmony_ci
319425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015)
320425bb815Sopenharmony_ci/**
321425bb815Sopenharmony_ci * Check if the value is symbol.
322425bb815Sopenharmony_ci *
323425bb815Sopenharmony_ci * @return true - if the value contains symbol value,
324425bb815Sopenharmony_ci *         false - otherwise
325425bb815Sopenharmony_ci */
326425bb815Sopenharmony_ciinline bool JERRY_ATTR_CONST JERRY_ATTR_ALWAYS_INLINE
327425bb815Sopenharmony_ciecma_is_value_symbol (ecma_value_t value) /**< ecma value */
328425bb815Sopenharmony_ci{
329425bb815Sopenharmony_ci  return (ecma_get_value_type_field (value) == ECMA_TYPE_SYMBOL);
330425bb815Sopenharmony_ci} /* ecma_is_value_symbol */
331425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015) */
332425bb815Sopenharmony_ci
333425bb815Sopenharmony_ci/**
334425bb815Sopenharmony_ci * Check if the value can be property name.
335425bb815Sopenharmony_ci *
336425bb815Sopenharmony_ci * @return true - if the value can be property name value,
337425bb815Sopenharmony_ci *         false - otherwise
338425bb815Sopenharmony_ci */
339425bb815Sopenharmony_ciinline bool JERRY_ATTR_CONST JERRY_ATTR_ALWAYS_INLINE
340425bb815Sopenharmony_ciecma_is_value_prop_name (ecma_value_t value) /**< ecma value */
341425bb815Sopenharmony_ci{
342425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015)
343425bb815Sopenharmony_ci  return ecma_is_value_string (value) || ecma_is_value_symbol (value);
344425bb815Sopenharmony_ci#else /* !ENABLED (JERRY_ES2015) */
345425bb815Sopenharmony_ci  return ecma_is_value_string (value);
346425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015) */
347425bb815Sopenharmony_ci} /* ecma_is_value_prop_name */
348425bb815Sopenharmony_ci
349425bb815Sopenharmony_ci/**
350425bb815Sopenharmony_ci * Check if the value is direct ecma-string.
351425bb815Sopenharmony_ci *
352425bb815Sopenharmony_ci * @return true - if the value contains direct ecma-string value,
353425bb815Sopenharmony_ci *         false - otherwise
354425bb815Sopenharmony_ci */
355425bb815Sopenharmony_ciinline bool JERRY_ATTR_CONST JERRY_ATTR_ALWAYS_INLINE
356425bb815Sopenharmony_ciecma_is_value_direct_string (ecma_value_t value) /**< ecma value */
357425bb815Sopenharmony_ci{
358425bb815Sopenharmony_ci  return (ecma_get_value_type_field (value) == ECMA_TYPE_DIRECT_STRING);
359425bb815Sopenharmony_ci} /* ecma_is_value_direct_string */
360425bb815Sopenharmony_ci
361425bb815Sopenharmony_ci/**
362425bb815Sopenharmony_ci * Check if the value is non-direct ecma-string.
363425bb815Sopenharmony_ci *
364425bb815Sopenharmony_ci * @return true - if the value contains non-direct ecma-string value,
365425bb815Sopenharmony_ci *         false - otherwise
366425bb815Sopenharmony_ci */
367425bb815Sopenharmony_ciinline bool JERRY_ATTR_CONST JERRY_ATTR_ALWAYS_INLINE
368425bb815Sopenharmony_ciecma_is_value_non_direct_string (ecma_value_t value) /**< ecma value */
369425bb815Sopenharmony_ci{
370425bb815Sopenharmony_ci  return (ecma_get_value_type_field (value) == ECMA_TYPE_STRING);
371425bb815Sopenharmony_ci} /* ecma_is_value_non_direct_string */
372425bb815Sopenharmony_ci
373425bb815Sopenharmony_ci/**
374425bb815Sopenharmony_ci * Check if the value is object.
375425bb815Sopenharmony_ci *
376425bb815Sopenharmony_ci * @return true - if the value contains object value,
377425bb815Sopenharmony_ci *         false - otherwise
378425bb815Sopenharmony_ci */
379425bb815Sopenharmony_ciinline bool JERRY_ATTR_CONST JERRY_ATTR_ALWAYS_INLINE
380425bb815Sopenharmony_ciecma_is_value_object (ecma_value_t value) /**< ecma value */
381425bb815Sopenharmony_ci{
382425bb815Sopenharmony_ci  return (ecma_get_value_type_field (value) == ECMA_TYPE_OBJECT);
383425bb815Sopenharmony_ci} /* ecma_is_value_object */
384425bb815Sopenharmony_ci
385425bb815Sopenharmony_ci/**
386425bb815Sopenharmony_ci * Check if the value is error reference.
387425bb815Sopenharmony_ci *
388425bb815Sopenharmony_ci * @return true - if the value contains an error reference,
389425bb815Sopenharmony_ci *         false - otherwise
390425bb815Sopenharmony_ci */
391425bb815Sopenharmony_ciinline bool JERRY_ATTR_CONST JERRY_ATTR_ALWAYS_INLINE
392425bb815Sopenharmony_ciecma_is_value_error_reference (ecma_value_t value) /**< ecma value */
393425bb815Sopenharmony_ci{
394425bb815Sopenharmony_ci  return (ecma_get_value_type_field (value) == ECMA_TYPE_ERROR);
395425bb815Sopenharmony_ci} /* ecma_is_value_error_reference */
396425bb815Sopenharmony_ci
397425bb815Sopenharmony_ci/**
398425bb815Sopenharmony_ci * Debug assertion that specified value's type is one of ECMA-defined
399425bb815Sopenharmony_ci * script-visible types, i.e.: undefined, null, boolean, number, string, object.
400425bb815Sopenharmony_ci */
401425bb815Sopenharmony_civoid
402425bb815Sopenharmony_ciecma_check_value_type_is_spec_defined (ecma_value_t value) /**< ecma value */
403425bb815Sopenharmony_ci{
404425bb815Sopenharmony_ci  JERRY_ASSERT (ecma_is_value_undefined (value)
405425bb815Sopenharmony_ci                || ecma_is_value_null (value)
406425bb815Sopenharmony_ci                || ecma_is_value_boolean (value)
407425bb815Sopenharmony_ci                || ecma_is_value_number (value)
408425bb815Sopenharmony_ci                || ecma_is_value_string (value)
409425bb815Sopenharmony_ci                || ECMA_ASSERT_VALUE_IS_SYMBOL (value)
410425bb815Sopenharmony_ci                || ecma_is_value_object (value));
411425bb815Sopenharmony_ci} /* ecma_check_value_type_is_spec_defined */
412425bb815Sopenharmony_ci
413425bb815Sopenharmony_ci/**
414425bb815Sopenharmony_ci * Checks if the given argument is an array or not.
415425bb815Sopenharmony_ci *
416425bb815Sopenharmony_ci * @return ECMA_VALUE_ERROR- if the operation fails
417425bb815Sopenharmony_ci *         ECMA_VALUE_{TRUE/FALSE} - depends on whether 'arg' is an array object
418425bb815Sopenharmony_ci */
419425bb815Sopenharmony_ciecma_value_t
420425bb815Sopenharmony_ciecma_is_value_array (ecma_value_t arg) /**< argument */
421425bb815Sopenharmony_ci{
422425bb815Sopenharmony_ci  if (!ecma_is_value_object (arg))
423425bb815Sopenharmony_ci  {
424425bb815Sopenharmony_ci    return ECMA_VALUE_FALSE;
425425bb815Sopenharmony_ci  }
426425bb815Sopenharmony_ci
427425bb815Sopenharmony_ci  ecma_object_t *arg_obj_p = ecma_get_object_from_value (arg);
428425bb815Sopenharmony_ci
429425bb815Sopenharmony_ci  if (ecma_get_object_type (arg_obj_p) == ECMA_OBJECT_TYPE_ARRAY)
430425bb815Sopenharmony_ci  {
431425bb815Sopenharmony_ci    return ECMA_VALUE_TRUE;
432425bb815Sopenharmony_ci  }
433425bb815Sopenharmony_ci
434425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015_BUILTIN_PROXY)
435425bb815Sopenharmony_ci  if (ECMA_OBJECT_IS_PROXY (arg_obj_p))
436425bb815Sopenharmony_ci  {
437425bb815Sopenharmony_ci    ecma_proxy_object_t *proxy_obj_p = (ecma_proxy_object_t *) arg_obj_p;
438425bb815Sopenharmony_ci
439425bb815Sopenharmony_ci    if (proxy_obj_p->handler == ECMA_VALUE_NULL)
440425bb815Sopenharmony_ci    {
441425bb815Sopenharmony_ci      return ecma_raise_type_error (ECMA_ERR_MSG ("Cannot perform 'IsArray' on the given proxy "
442425bb815Sopenharmony_ci                                                  "because handler is null"));
443425bb815Sopenharmony_ci    }
444425bb815Sopenharmony_ci
445425bb815Sopenharmony_ci    return ecma_is_value_array (proxy_obj_p->target);
446425bb815Sopenharmony_ci  }
447425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015_BUILTIN_PROXY) */
448425bb815Sopenharmony_ci
449425bb815Sopenharmony_ci  return ECMA_VALUE_FALSE;
450425bb815Sopenharmony_ci} /* ecma_is_value_array */
451425bb815Sopenharmony_ci
452425bb815Sopenharmony_ci/**
453425bb815Sopenharmony_ci * Creates an ecma value from the given raw boolean.
454425bb815Sopenharmony_ci *
455425bb815Sopenharmony_ci * @return boolean ecma_value
456425bb815Sopenharmony_ci */
457425bb815Sopenharmony_ciinline ecma_value_t JERRY_ATTR_CONST JERRY_ATTR_ALWAYS_INLINE
458425bb815Sopenharmony_ciecma_make_boolean_value (bool boolean_value) /**< raw bool value from which the ecma value will be created */
459425bb815Sopenharmony_ci{
460425bb815Sopenharmony_ci  return boolean_value ? ECMA_VALUE_TRUE : ECMA_VALUE_FALSE;
461425bb815Sopenharmony_ci} /* ecma_make_boolean_value */
462425bb815Sopenharmony_ci
463425bb815Sopenharmony_ci/**
464425bb815Sopenharmony_ci * Encode an integer number into an ecma-value without allocating memory
465425bb815Sopenharmony_ci *
466425bb815Sopenharmony_ci * Note:
467425bb815Sopenharmony_ci *   The value must fit into the range of allowed ecma integer values
468425bb815Sopenharmony_ci *
469425bb815Sopenharmony_ci * @return ecma-value
470425bb815Sopenharmony_ci */
471425bb815Sopenharmony_ciinline ecma_value_t JERRY_ATTR_CONST JERRY_ATTR_ALWAYS_INLINE
472425bb815Sopenharmony_ciecma_make_integer_value (ecma_integer_value_t integer_value) /**< integer number to be encoded */
473425bb815Sopenharmony_ci{
474425bb815Sopenharmony_ci  JERRY_ASSERT (ECMA_IS_INTEGER_NUMBER (integer_value));
475425bb815Sopenharmony_ci
476425bb815Sopenharmony_ci  return (((ecma_value_t) integer_value) << ECMA_DIRECT_SHIFT) | ECMA_DIRECT_TYPE_INTEGER_VALUE;
477425bb815Sopenharmony_ci} /* ecma_make_integer_value */
478425bb815Sopenharmony_ci
479425bb815Sopenharmony_ci/**
480425bb815Sopenharmony_ci * Allocate and initialize a new float number without checks.
481425bb815Sopenharmony_ci *
482425bb815Sopenharmony_ci * @return ecma-value
483425bb815Sopenharmony_ci */
484425bb815Sopenharmony_cistatic ecma_value_t
485425bb815Sopenharmony_ciecma_create_float_number (ecma_number_t ecma_number) /**< value of the float number */
486425bb815Sopenharmony_ci{
487425bb815Sopenharmony_ci  ecma_number_t *ecma_num_p = ecma_alloc_number ();
488425bb815Sopenharmony_ci
489425bb815Sopenharmony_ci  *ecma_num_p = ecma_number;
490425bb815Sopenharmony_ci
491425bb815Sopenharmony_ci  return ecma_pointer_to_ecma_value (ecma_num_p) | ECMA_TYPE_FLOAT;
492425bb815Sopenharmony_ci} /* ecma_create_float_number */
493425bb815Sopenharmony_ci
494425bb815Sopenharmony_ci/**
495425bb815Sopenharmony_ci * Encode float number without checks.
496425bb815Sopenharmony_ci *
497425bb815Sopenharmony_ci * @return ecma-value
498425bb815Sopenharmony_ci */
499425bb815Sopenharmony_ciecma_value_t
500425bb815Sopenharmony_ciecma_make_float_value (ecma_number_t *ecma_num_p) /**< pointer to the float number */
501425bb815Sopenharmony_ci{
502425bb815Sopenharmony_ci  return ecma_pointer_to_ecma_value (ecma_num_p) | ECMA_TYPE_FLOAT;
503425bb815Sopenharmony_ci} /* ecma_make_float_value */
504425bb815Sopenharmony_ci
505425bb815Sopenharmony_ci/**
506425bb815Sopenharmony_ci * Create a new NaN value.
507425bb815Sopenharmony_ci *
508425bb815Sopenharmony_ci * @return ecma-value
509425bb815Sopenharmony_ci */
510425bb815Sopenharmony_ciextern inline ecma_value_t JERRY_ATTR_ALWAYS_INLINE
511425bb815Sopenharmony_ciecma_make_nan_value (void)
512425bb815Sopenharmony_ci{
513425bb815Sopenharmony_ci  return ecma_create_float_number (ecma_number_make_nan ());
514425bb815Sopenharmony_ci} /* ecma_make_nan_value */
515425bb815Sopenharmony_ci
516425bb815Sopenharmony_ci/**
517425bb815Sopenharmony_ci * Checks whether the passed number is +0.0
518425bb815Sopenharmony_ci *
519425bb815Sopenharmony_ci * @return true, if it is +0.0, false otherwise
520425bb815Sopenharmony_ci */
521425bb815Sopenharmony_cistatic inline bool JERRY_ATTR_CONST JERRY_ATTR_ALWAYS_INLINE
522425bb815Sopenharmony_ciecma_is_number_equal_to_positive_zero (ecma_number_t ecma_number) /**< number */
523425bb815Sopenharmony_ci{
524425bb815Sopenharmony_ci  ecma_number_accessor_t u;
525425bb815Sopenharmony_ci  u.as_ecma_number_t = ecma_number;
526425bb815Sopenharmony_ci#if !ENABLED (JERRY_NUMBER_TYPE_FLOAT64)
527425bb815Sopenharmony_ci  return u.as_uint32_t == 0;
528425bb815Sopenharmony_ci#else /* ENABLED (JERRY_NUMBER_TYPE_FLOAT64) */
529425bb815Sopenharmony_ci  return u.as_uint64_t == 0;
530425bb815Sopenharmony_ci#endif /* !ENABLED (JERRY_NUMBER_TYPE_FLOAT64) */
531425bb815Sopenharmony_ci} /* ecma_is_number_equal_to_positive_zero */
532425bb815Sopenharmony_ci
533425bb815Sopenharmony_ci/**
534425bb815Sopenharmony_ci * Encode a number into an ecma-value
535425bb815Sopenharmony_ci *
536425bb815Sopenharmony_ci * @return ecma-value
537425bb815Sopenharmony_ci */
538425bb815Sopenharmony_ciecma_value_t
539425bb815Sopenharmony_ciecma_make_number_value (ecma_number_t ecma_number) /**< number to be encoded */
540425bb815Sopenharmony_ci{
541425bb815Sopenharmony_ci  ecma_integer_value_t integer_value = (ecma_integer_value_t) ecma_number;
542425bb815Sopenharmony_ci
543425bb815Sopenharmony_ci  if ((ecma_number_t) integer_value == ecma_number
544425bb815Sopenharmony_ci      && ((integer_value == 0) ? ecma_is_number_equal_to_positive_zero (ecma_number)
545425bb815Sopenharmony_ci                               : ECMA_IS_INTEGER_NUMBER (integer_value)))
546425bb815Sopenharmony_ci  {
547425bb815Sopenharmony_ci    return ecma_make_integer_value (integer_value);
548425bb815Sopenharmony_ci  }
549425bb815Sopenharmony_ci
550425bb815Sopenharmony_ci  return ecma_create_float_number (ecma_number);
551425bb815Sopenharmony_ci} /* ecma_make_number_value */
552425bb815Sopenharmony_ci
553425bb815Sopenharmony_ci/**
554425bb815Sopenharmony_ci * Encode an int32 number into an ecma-value
555425bb815Sopenharmony_ci *
556425bb815Sopenharmony_ci * @return ecma-value
557425bb815Sopenharmony_ci */
558425bb815Sopenharmony_ciecma_value_t
559425bb815Sopenharmony_ciecma_make_int32_value (int32_t int32_number) /**< int32 number to be encoded */
560425bb815Sopenharmony_ci{
561425bb815Sopenharmony_ci  if (ECMA_IS_INTEGER_NUMBER (int32_number))
562425bb815Sopenharmony_ci  {
563425bb815Sopenharmony_ci    return ecma_make_integer_value ((ecma_integer_value_t) int32_number);
564425bb815Sopenharmony_ci  }
565425bb815Sopenharmony_ci
566425bb815Sopenharmony_ci  return ecma_create_float_number ((ecma_number_t) int32_number);
567425bb815Sopenharmony_ci} /* ecma_make_int32_value */
568425bb815Sopenharmony_ci
569425bb815Sopenharmony_ci/**
570425bb815Sopenharmony_ci * Encode an unsigned int32 number into an ecma-value
571425bb815Sopenharmony_ci *
572425bb815Sopenharmony_ci * @return ecma-value
573425bb815Sopenharmony_ci */
574425bb815Sopenharmony_ciecma_value_t
575425bb815Sopenharmony_ciecma_make_uint32_value (uint32_t uint32_number) /**< uint32 number to be encoded */
576425bb815Sopenharmony_ci{
577425bb815Sopenharmony_ci  if (uint32_number <= ECMA_INTEGER_NUMBER_MAX)
578425bb815Sopenharmony_ci  {
579425bb815Sopenharmony_ci    return ecma_make_integer_value ((ecma_integer_value_t) uint32_number);
580425bb815Sopenharmony_ci  }
581425bb815Sopenharmony_ci
582425bb815Sopenharmony_ci  return ecma_create_float_number ((ecma_number_t) uint32_number);
583425bb815Sopenharmony_ci} /* ecma_make_uint32_value */
584425bb815Sopenharmony_ci
585425bb815Sopenharmony_ci/**
586425bb815Sopenharmony_ci * String value constructor
587425bb815Sopenharmony_ci *
588425bb815Sopenharmony_ci * @return ecma-value representation of the string argument
589425bb815Sopenharmony_ci */
590425bb815Sopenharmony_ciinline ecma_value_t JERRY_ATTR_PURE JERRY_ATTR_ALWAYS_INLINE
591425bb815Sopenharmony_ciecma_make_string_value (const ecma_string_t *ecma_string_p) /**< string to reference in value */
592425bb815Sopenharmony_ci{
593425bb815Sopenharmony_ci  JERRY_ASSERT (ecma_string_p != NULL);
594425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015)
595425bb815Sopenharmony_ci  JERRY_ASSERT (!ecma_prop_name_is_symbol ((ecma_string_t *) ecma_string_p));
596425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015) */
597425bb815Sopenharmony_ci
598425bb815Sopenharmony_ci  if ((((uintptr_t) ecma_string_p) & ECMA_VALUE_TYPE_MASK) != 0)
599425bb815Sopenharmony_ci  {
600425bb815Sopenharmony_ci    return (ecma_value_t) (uintptr_t) ecma_string_p;
601425bb815Sopenharmony_ci  }
602425bb815Sopenharmony_ci
603425bb815Sopenharmony_ci  return ecma_pointer_to_ecma_value (ecma_string_p) | ECMA_TYPE_STRING;
604425bb815Sopenharmony_ci} /* ecma_make_string_value */
605425bb815Sopenharmony_ci
606425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015)
607425bb815Sopenharmony_ci/**
608425bb815Sopenharmony_ci * Symbol value constructor
609425bb815Sopenharmony_ci *
610425bb815Sopenharmony_ci * @return ecma-value representation of the string argument
611425bb815Sopenharmony_ci */
612425bb815Sopenharmony_ciinline ecma_value_t JERRY_ATTR_PURE JERRY_ATTR_ALWAYS_INLINE
613425bb815Sopenharmony_ciecma_make_symbol_value (const ecma_string_t *ecma_symbol_p) /**< symbol to reference in value */
614425bb815Sopenharmony_ci{
615425bb815Sopenharmony_ci  JERRY_ASSERT (ecma_symbol_p != NULL);
616425bb815Sopenharmony_ci  JERRY_ASSERT (ecma_prop_name_is_symbol ((ecma_string_t *) ecma_symbol_p));
617425bb815Sopenharmony_ci
618425bb815Sopenharmony_ci  return ecma_pointer_to_ecma_value (ecma_symbol_p) | ECMA_TYPE_SYMBOL;
619425bb815Sopenharmony_ci} /* ecma_make_symbol_value */
620425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015) */
621425bb815Sopenharmony_ci
622425bb815Sopenharmony_ci/**
623425bb815Sopenharmony_ci * Property-name value constructor
624425bb815Sopenharmony_ci *
625425bb815Sopenharmony_ci * @return ecma-value representation of a property name argument
626425bb815Sopenharmony_ci */
627425bb815Sopenharmony_ciinline ecma_value_t JERRY_ATTR_PURE JERRY_ATTR_ALWAYS_INLINE
628425bb815Sopenharmony_ciecma_make_prop_name_value (const ecma_string_t *ecma_prop_name_p) /**< property name to reference in value */
629425bb815Sopenharmony_ci{
630425bb815Sopenharmony_ci  JERRY_ASSERT (ecma_prop_name_p != NULL);
631425bb815Sopenharmony_ci
632425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015)
633425bb815Sopenharmony_ci  if (ecma_prop_name_is_symbol ((ecma_string_t *) ecma_prop_name_p))
634425bb815Sopenharmony_ci  {
635425bb815Sopenharmony_ci    return ecma_make_symbol_value (ecma_prop_name_p);
636425bb815Sopenharmony_ci  }
637425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015) */
638425bb815Sopenharmony_ci
639425bb815Sopenharmony_ci  return ecma_make_string_value (ecma_prop_name_p);
640425bb815Sopenharmony_ci} /* ecma_make_prop_name_value */
641425bb815Sopenharmony_ci
642425bb815Sopenharmony_ci/**
643425bb815Sopenharmony_ci * String value constructor
644425bb815Sopenharmony_ci *
645425bb815Sopenharmony_ci * @return ecma-value representation of the string argument
646425bb815Sopenharmony_ci */
647425bb815Sopenharmony_ciinline ecma_value_t JERRY_ATTR_PURE JERRY_ATTR_ALWAYS_INLINE
648425bb815Sopenharmony_ciecma_make_magic_string_value (lit_magic_string_id_t id) /**< magic string id */
649425bb815Sopenharmony_ci{
650425bb815Sopenharmony_ci  return (ecma_value_t) ECMA_CREATE_DIRECT_STRING (ECMA_DIRECT_STRING_MAGIC, (uintptr_t) id);
651425bb815Sopenharmony_ci} /* ecma_make_magic_string_value */
652425bb815Sopenharmony_ci
653425bb815Sopenharmony_ci/**
654425bb815Sopenharmony_ci * Object value constructor
655425bb815Sopenharmony_ci *
656425bb815Sopenharmony_ci * @return ecma-value representation of the object argument
657425bb815Sopenharmony_ci */
658425bb815Sopenharmony_ciinline ecma_value_t JERRY_ATTR_PURE JERRY_ATTR_ALWAYS_INLINE
659425bb815Sopenharmony_ciecma_make_object_value (const ecma_object_t *object_p) /**< object to reference in value */
660425bb815Sopenharmony_ci{
661425bb815Sopenharmony_ci  JERRY_ASSERT (object_p != NULL);
662425bb815Sopenharmony_ci
663425bb815Sopenharmony_ci  return ecma_pointer_to_ecma_value (object_p) | ECMA_TYPE_OBJECT;
664425bb815Sopenharmony_ci} /* ecma_make_object_value */
665425bb815Sopenharmony_ci
666425bb815Sopenharmony_ci/**
667425bb815Sopenharmony_ci * Error reference constructor
668425bb815Sopenharmony_ci *
669425bb815Sopenharmony_ci * @return ecma-value representation of the Error reference
670425bb815Sopenharmony_ci */
671425bb815Sopenharmony_ciinline ecma_value_t JERRY_ATTR_PURE JERRY_ATTR_ALWAYS_INLINE
672425bb815Sopenharmony_ciecma_make_error_reference_value (const ecma_error_reference_t *error_ref_p) /**< error reference */
673425bb815Sopenharmony_ci{
674425bb815Sopenharmony_ci  JERRY_ASSERT (error_ref_p != NULL);
675425bb815Sopenharmony_ci
676425bb815Sopenharmony_ci  return ecma_pointer_to_ecma_value (error_ref_p) | ECMA_TYPE_ERROR;
677425bb815Sopenharmony_ci} /* ecma_make_error_reference_value */
678425bb815Sopenharmony_ci
679425bb815Sopenharmony_ci/**
680425bb815Sopenharmony_ci * Get integer value from an integer ecma value
681425bb815Sopenharmony_ci *
682425bb815Sopenharmony_ci * @return integer value
683425bb815Sopenharmony_ci */
684425bb815Sopenharmony_ciinline ecma_integer_value_t JERRY_ATTR_CONST JERRY_ATTR_ALWAYS_INLINE
685425bb815Sopenharmony_ciecma_get_integer_from_value (ecma_value_t value) /**< ecma value */
686425bb815Sopenharmony_ci{
687425bb815Sopenharmony_ci  JERRY_ASSERT (ecma_is_value_integer_number (value));
688425bb815Sopenharmony_ci
689425bb815Sopenharmony_ci  return ((ecma_integer_value_t) value) >> ECMA_DIRECT_SHIFT;
690425bb815Sopenharmony_ci} /* ecma_get_integer_from_value */
691425bb815Sopenharmony_ci
692425bb815Sopenharmony_ci/**
693425bb815Sopenharmony_ci * Get floating point value from an ecma value
694425bb815Sopenharmony_ci *
695425bb815Sopenharmony_ci * @return floating point value
696425bb815Sopenharmony_ci */
697425bb815Sopenharmony_ciinline ecma_number_t JERRY_ATTR_PURE JERRY_ATTR_ALWAYS_INLINE
698425bb815Sopenharmony_ciecma_get_float_from_value (ecma_value_t value) /**< ecma value */
699425bb815Sopenharmony_ci{
700425bb815Sopenharmony_ci  JERRY_ASSERT (ecma_get_value_type_field (value) == ECMA_TYPE_FLOAT);
701425bb815Sopenharmony_ci
702425bb815Sopenharmony_ci  return *(ecma_number_t *) ecma_get_pointer_from_ecma_value (value);
703425bb815Sopenharmony_ci} /* ecma_get_float_from_value */
704425bb815Sopenharmony_ci
705425bb815Sopenharmony_ci/**
706425bb815Sopenharmony_ci * Get floating point value pointer from an ecma value
707425bb815Sopenharmony_ci *
708425bb815Sopenharmony_ci * @return floating point value
709425bb815Sopenharmony_ci */
710425bb815Sopenharmony_ciinline ecma_number_t * JERRY_ATTR_PURE JERRY_ATTR_ALWAYS_INLINE
711425bb815Sopenharmony_ciecma_get_pointer_from_float_value (ecma_value_t value) /**< ecma value */
712425bb815Sopenharmony_ci{
713425bb815Sopenharmony_ci  JERRY_ASSERT (ecma_get_value_type_field (value) == ECMA_TYPE_FLOAT);
714425bb815Sopenharmony_ci
715425bb815Sopenharmony_ci  return (ecma_number_t *) ecma_get_pointer_from_ecma_value (value);
716425bb815Sopenharmony_ci} /* ecma_get_pointer_from_float_value */
717425bb815Sopenharmony_ci
718425bb815Sopenharmony_ci/**
719425bb815Sopenharmony_ci * Get floating point value from an ecma value
720425bb815Sopenharmony_ci *
721425bb815Sopenharmony_ci * @return floating point value
722425bb815Sopenharmony_ci */
723425bb815Sopenharmony_ciecma_number_t JERRY_ATTR_PURE
724425bb815Sopenharmony_ciecma_get_number_from_value (ecma_value_t value) /**< ecma value */
725425bb815Sopenharmony_ci{
726425bb815Sopenharmony_ci  if (ecma_is_value_integer_number (value))
727425bb815Sopenharmony_ci  {
728425bb815Sopenharmony_ci    return (ecma_number_t) ecma_get_integer_from_value (value);
729425bb815Sopenharmony_ci  }
730425bb815Sopenharmony_ci
731425bb815Sopenharmony_ci  return ecma_get_float_from_value (value);
732425bb815Sopenharmony_ci} /* ecma_get_number_from_value */
733425bb815Sopenharmony_ci
734425bb815Sopenharmony_ci/**
735425bb815Sopenharmony_ci * Get pointer to ecma-string from ecma value
736425bb815Sopenharmony_ci *
737425bb815Sopenharmony_ci * @return the string pointer
738425bb815Sopenharmony_ci */
739425bb815Sopenharmony_ciinline ecma_string_t *JERRY_ATTR_PURE JERRY_ATTR_ALWAYS_INLINE
740425bb815Sopenharmony_ciecma_get_string_from_value (ecma_value_t value) /**< ecma value */
741425bb815Sopenharmony_ci{
742425bb815Sopenharmony_ci  JERRY_ASSERT (ecma_is_value_string (value));
743425bb815Sopenharmony_ci
744425bb815Sopenharmony_ci  if ((value & ECMA_VALUE_TYPE_MASK) == ECMA_TYPE_DIRECT_STRING)
745425bb815Sopenharmony_ci  {
746425bb815Sopenharmony_ci    return (ecma_string_t *) (uintptr_t) value;
747425bb815Sopenharmony_ci  }
748425bb815Sopenharmony_ci
749425bb815Sopenharmony_ci  return (ecma_string_t *) ecma_get_pointer_from_ecma_value (value);
750425bb815Sopenharmony_ci} /* ecma_get_string_from_value */
751425bb815Sopenharmony_ci
752425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015)
753425bb815Sopenharmony_ci/**
754425bb815Sopenharmony_ci * Get pointer to ecma-string from ecma value
755425bb815Sopenharmony_ci *
756425bb815Sopenharmony_ci * @return the string pointer
757425bb815Sopenharmony_ci */
758425bb815Sopenharmony_ciinline ecma_string_t *JERRY_ATTR_PURE JERRY_ATTR_ALWAYS_INLINE
759425bb815Sopenharmony_ciecma_get_symbol_from_value (ecma_value_t value) /**< ecma value */
760425bb815Sopenharmony_ci{
761425bb815Sopenharmony_ci  JERRY_ASSERT (ecma_is_value_symbol (value));
762425bb815Sopenharmony_ci
763425bb815Sopenharmony_ci  return (ecma_string_t *) ecma_get_pointer_from_ecma_value (value);
764425bb815Sopenharmony_ci} /* ecma_get_symbol_from_value */
765425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015) */
766425bb815Sopenharmony_ci
767425bb815Sopenharmony_ci/**
768425bb815Sopenharmony_ci * Get pointer to a property name from ecma value
769425bb815Sopenharmony_ci *
770425bb815Sopenharmony_ci * @return the string pointer
771425bb815Sopenharmony_ci */
772425bb815Sopenharmony_ciinline ecma_string_t *JERRY_ATTR_PURE JERRY_ATTR_ALWAYS_INLINE
773425bb815Sopenharmony_ciecma_get_prop_name_from_value (ecma_value_t value) /**< ecma value */
774425bb815Sopenharmony_ci{
775425bb815Sopenharmony_ci  JERRY_ASSERT (ecma_is_value_prop_name (value));
776425bb815Sopenharmony_ci
777425bb815Sopenharmony_ci  if ((value & ECMA_VALUE_TYPE_MASK) == ECMA_TYPE_DIRECT_STRING)
778425bb815Sopenharmony_ci  {
779425bb815Sopenharmony_ci    return (ecma_string_t *) (uintptr_t) value;
780425bb815Sopenharmony_ci  }
781425bb815Sopenharmony_ci
782425bb815Sopenharmony_ci  return (ecma_string_t *) ecma_get_pointer_from_ecma_value (value);
783425bb815Sopenharmony_ci} /* ecma_get_prop_name_from_value */
784425bb815Sopenharmony_ci
785425bb815Sopenharmony_ci/**
786425bb815Sopenharmony_ci * Get pointer to ecma-object from ecma value
787425bb815Sopenharmony_ci *
788425bb815Sopenharmony_ci * @return the pointer
789425bb815Sopenharmony_ci */
790425bb815Sopenharmony_ciinline ecma_object_t *JERRY_ATTR_PURE JERRY_ATTR_ALWAYS_INLINE
791425bb815Sopenharmony_ciecma_get_object_from_value (ecma_value_t value) /**< ecma value */
792425bb815Sopenharmony_ci{
793425bb815Sopenharmony_ci  JERRY_ASSERT (ecma_is_value_object (value));
794425bb815Sopenharmony_ci
795425bb815Sopenharmony_ci  return (ecma_object_t *) ecma_get_pointer_from_ecma_value (value);
796425bb815Sopenharmony_ci} /* ecma_get_object_from_value */
797425bb815Sopenharmony_ci
798425bb815Sopenharmony_ci/**
799425bb815Sopenharmony_ci * Get pointer to error reference from ecma value
800425bb815Sopenharmony_ci *
801425bb815Sopenharmony_ci * @return the pointer
802425bb815Sopenharmony_ci */
803425bb815Sopenharmony_ciinline ecma_error_reference_t *JERRY_ATTR_PURE JERRY_ATTR_ALWAYS_INLINE
804425bb815Sopenharmony_ciecma_get_error_reference_from_value (ecma_value_t value) /**< ecma value */
805425bb815Sopenharmony_ci{
806425bb815Sopenharmony_ci  JERRY_ASSERT (ecma_get_value_type_field (value) == ECMA_TYPE_ERROR);
807425bb815Sopenharmony_ci
808425bb815Sopenharmony_ci  return (ecma_error_reference_t *) ecma_get_pointer_from_ecma_value (value);
809425bb815Sopenharmony_ci} /* ecma_get_error_reference_from_value */
810425bb815Sopenharmony_ci
811425bb815Sopenharmony_ci/**
812425bb815Sopenharmony_ci * Invert a boolean value
813425bb815Sopenharmony_ci *
814425bb815Sopenharmony_ci * @return ecma value
815425bb815Sopenharmony_ci */
816425bb815Sopenharmony_ciinline ecma_value_t JERRY_ATTR_CONST JERRY_ATTR_ALWAYS_INLINE
817425bb815Sopenharmony_ciecma_invert_boolean_value (ecma_value_t value) /**< ecma value */
818425bb815Sopenharmony_ci{
819425bb815Sopenharmony_ci  JERRY_ASSERT (ecma_is_value_boolean (value));
820425bb815Sopenharmony_ci
821425bb815Sopenharmony_ci  return (value ^ (1 << ECMA_DIRECT_SHIFT));
822425bb815Sopenharmony_ci} /* ecma_invert_boolean_value */
823425bb815Sopenharmony_ci
824425bb815Sopenharmony_ci/**
825425bb815Sopenharmony_ci * Copy ecma value.
826425bb815Sopenharmony_ci *
827425bb815Sopenharmony_ci * @return copy of the given value
828425bb815Sopenharmony_ci */
829425bb815Sopenharmony_ciecma_value_t
830425bb815Sopenharmony_ciecma_copy_value (ecma_value_t value)  /**< value description */
831425bb815Sopenharmony_ci{
832425bb815Sopenharmony_ci  switch (ecma_get_value_type_field (value))
833425bb815Sopenharmony_ci  {
834425bb815Sopenharmony_ci    case ECMA_TYPE_FLOAT:
835425bb815Sopenharmony_ci    {
836425bb815Sopenharmony_ci      ecma_number_t *num_p = (ecma_number_t *) ecma_get_pointer_from_ecma_value (value);
837425bb815Sopenharmony_ci
838425bb815Sopenharmony_ci      return ecma_create_float_number (*num_p);
839425bb815Sopenharmony_ci    }
840425bb815Sopenharmony_ci    case ECMA_TYPE_STRING:
841425bb815Sopenharmony_ci    {
842425bb815Sopenharmony_ci      ecma_ref_ecma_string (ecma_get_string_from_value (value));
843425bb815Sopenharmony_ci      return value;
844425bb815Sopenharmony_ci    }
845425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015)
846425bb815Sopenharmony_ci    case ECMA_TYPE_SYMBOL:
847425bb815Sopenharmony_ci    {
848425bb815Sopenharmony_ci      ecma_ref_ecma_string (ecma_get_symbol_from_value (value));
849425bb815Sopenharmony_ci      return value;
850425bb815Sopenharmony_ci    }
851425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015) */
852425bb815Sopenharmony_ci    case ECMA_TYPE_OBJECT:
853425bb815Sopenharmony_ci    {
854425bb815Sopenharmony_ci      ecma_ref_object (ecma_get_object_from_value (value));
855425bb815Sopenharmony_ci      return value;
856425bb815Sopenharmony_ci    }
857425bb815Sopenharmony_ci    default:
858425bb815Sopenharmony_ci    {
859425bb815Sopenharmony_ci      JERRY_ASSERT (ecma_get_value_type_field (value) == ECMA_TYPE_DIRECT
860425bb815Sopenharmony_ci                    || ecma_get_value_type_field (value) == ECMA_TYPE_DIRECT_STRING);
861425bb815Sopenharmony_ci
862425bb815Sopenharmony_ci      return value;
863425bb815Sopenharmony_ci    }
864425bb815Sopenharmony_ci  }
865425bb815Sopenharmony_ci} /* ecma_copy_value */
866425bb815Sopenharmony_ci
867425bb815Sopenharmony_ci/**
868425bb815Sopenharmony_ci * Copy ecma value.
869425bb815Sopenharmony_ci *
870425bb815Sopenharmony_ci * Note:
871425bb815Sopenharmony_ci *   this function is similar to ecma_copy_value, but it is
872425bb815Sopenharmony_ci *   faster for direct values since no function call is performed.
873425bb815Sopenharmony_ci *   It also increases the binary size so it is recommended for
874425bb815Sopenharmony_ci *   critical code paths only.
875425bb815Sopenharmony_ci *
876425bb815Sopenharmony_ci * @return copy of the given value
877425bb815Sopenharmony_ci */
878425bb815Sopenharmony_ciinline ecma_value_t JERRY_ATTR_ALWAYS_INLINE
879425bb815Sopenharmony_ciecma_fast_copy_value (ecma_value_t value)  /**< value description */
880425bb815Sopenharmony_ci{
881425bb815Sopenharmony_ci  return (ecma_get_value_type_field (value) == ECMA_TYPE_DIRECT) ? value : ecma_copy_value (value);
882425bb815Sopenharmony_ci} /* ecma_fast_copy_value */
883425bb815Sopenharmony_ci
884425bb815Sopenharmony_ci/**
885425bb815Sopenharmony_ci * Copy the ecma value if not an object
886425bb815Sopenharmony_ci *
887425bb815Sopenharmony_ci * @return copy of the given value
888425bb815Sopenharmony_ci */
889425bb815Sopenharmony_ciinline ecma_value_t JERRY_ATTR_ALWAYS_INLINE
890425bb815Sopenharmony_ciecma_copy_value_if_not_object (ecma_value_t value) /**< value description */
891425bb815Sopenharmony_ci{
892425bb815Sopenharmony_ci  if (!ecma_is_value_object (value))
893425bb815Sopenharmony_ci  {
894425bb815Sopenharmony_ci    return ecma_copy_value (value);
895425bb815Sopenharmony_ci  }
896425bb815Sopenharmony_ci
897425bb815Sopenharmony_ci  return value;
898425bb815Sopenharmony_ci} /* ecma_copy_value_if_not_object */
899425bb815Sopenharmony_ci
900425bb815Sopenharmony_ci/**
901425bb815Sopenharmony_ci * Increase reference counter of a value if it is an object.
902425bb815Sopenharmony_ci */
903425bb815Sopenharmony_ciinline void JERRY_ATTR_ALWAYS_INLINE
904425bb815Sopenharmony_ciecma_ref_if_object (ecma_value_t value) /**< value description */
905425bb815Sopenharmony_ci{
906425bb815Sopenharmony_ci  if (ecma_is_value_object (value))
907425bb815Sopenharmony_ci  {
908425bb815Sopenharmony_ci    ecma_ref_object (ecma_get_object_from_value (value));
909425bb815Sopenharmony_ci  }
910425bb815Sopenharmony_ci} /* ecma_ref_if_object */
911425bb815Sopenharmony_ci
912425bb815Sopenharmony_ci/**
913425bb815Sopenharmony_ci * Decrease reference counter of a value if it is an object.
914425bb815Sopenharmony_ci */
915425bb815Sopenharmony_ciinline void JERRY_ATTR_ALWAYS_INLINE
916425bb815Sopenharmony_ciecma_deref_if_object (ecma_value_t value) /**< value description */
917425bb815Sopenharmony_ci{
918425bb815Sopenharmony_ci  if (ecma_is_value_object (value))
919425bb815Sopenharmony_ci  {
920425bb815Sopenharmony_ci    ecma_deref_object (ecma_get_object_from_value (value));
921425bb815Sopenharmony_ci  }
922425bb815Sopenharmony_ci} /* ecma_deref_if_object */
923425bb815Sopenharmony_ci
924425bb815Sopenharmony_ci/**
925425bb815Sopenharmony_ci * Assign a new value to an ecma-value
926425bb815Sopenharmony_ci *
927425bb815Sopenharmony_ci * Note:
928425bb815Sopenharmony_ci *      value previously stored in the property is freed
929425bb815Sopenharmony_ci */
930425bb815Sopenharmony_civoid
931425bb815Sopenharmony_ciecma_value_assign_value (ecma_value_t *value_p, /**< [in, out] ecma value */
932425bb815Sopenharmony_ci                         ecma_value_t ecma_value) /**< value to assign */
933425bb815Sopenharmony_ci{
934425bb815Sopenharmony_ci  JERRY_STATIC_ASSERT (ECMA_TYPE_DIRECT == 0,
935425bb815Sopenharmony_ci                       ecma_type_direct_must_be_zero_for_the_next_check);
936425bb815Sopenharmony_ci
937425bb815Sopenharmony_ci  if (*value_p == ecma_value)
938425bb815Sopenharmony_ci  {
939425bb815Sopenharmony_ci    return;
940425bb815Sopenharmony_ci  }
941425bb815Sopenharmony_ci
942425bb815Sopenharmony_ci  if (ecma_get_value_type_field (ecma_value || *value_p) == ECMA_TYPE_DIRECT)
943425bb815Sopenharmony_ci  {
944425bb815Sopenharmony_ci    *value_p = ecma_value;
945425bb815Sopenharmony_ci  }
946425bb815Sopenharmony_ci  else if (ecma_is_value_float_number (ecma_value)
947425bb815Sopenharmony_ci           && ecma_is_value_float_number (*value_p))
948425bb815Sopenharmony_ci  {
949425bb815Sopenharmony_ci    const ecma_number_t *num_src_p = (ecma_number_t *) ecma_get_pointer_from_ecma_value (ecma_value);
950425bb815Sopenharmony_ci    ecma_number_t *num_dst_p = (ecma_number_t *) ecma_get_pointer_from_ecma_value (*value_p);
951425bb815Sopenharmony_ci
952425bb815Sopenharmony_ci    *num_dst_p = *num_src_p;
953425bb815Sopenharmony_ci  }
954425bb815Sopenharmony_ci  else
955425bb815Sopenharmony_ci  {
956425bb815Sopenharmony_ci    ecma_free_value_if_not_object (*value_p);
957425bb815Sopenharmony_ci    *value_p = ecma_copy_value_if_not_object (ecma_value);
958425bb815Sopenharmony_ci  }
959425bb815Sopenharmony_ci} /* ecma_value_assign_value */
960425bb815Sopenharmony_ci
961425bb815Sopenharmony_ci/**
962425bb815Sopenharmony_ci * Update the value of a float number to a new value
963425bb815Sopenharmony_ci *
964425bb815Sopenharmony_ci * Note:
965425bb815Sopenharmony_ci *   The original value is destroyed.
966425bb815Sopenharmony_ci *
967425bb815Sopenharmony_ci * @return updated ecma value
968425bb815Sopenharmony_ci */
969425bb815Sopenharmony_ciecma_value_t
970425bb815Sopenharmony_ciecma_update_float_number (ecma_value_t float_value, /**< original float value */
971425bb815Sopenharmony_ci                          ecma_number_t new_number) /**< updated number value */
972425bb815Sopenharmony_ci{
973425bb815Sopenharmony_ci  JERRY_ASSERT (ecma_is_value_float_number (float_value));
974425bb815Sopenharmony_ci
975425bb815Sopenharmony_ci  ecma_integer_value_t integer_number = (ecma_integer_value_t) new_number;
976425bb815Sopenharmony_ci  ecma_number_t *number_p = (ecma_number_t *) ecma_get_pointer_from_ecma_value (float_value);
977425bb815Sopenharmony_ci
978425bb815Sopenharmony_ci  if ((ecma_number_t) integer_number == new_number
979425bb815Sopenharmony_ci      && ((integer_number == 0) ? ecma_is_number_equal_to_positive_zero (new_number)
980425bb815Sopenharmony_ci                                : ECMA_IS_INTEGER_NUMBER (integer_number)))
981425bb815Sopenharmony_ci  {
982425bb815Sopenharmony_ci    ecma_dealloc_number (number_p);
983425bb815Sopenharmony_ci    return ecma_make_integer_value (integer_number);
984425bb815Sopenharmony_ci  }
985425bb815Sopenharmony_ci
986425bb815Sopenharmony_ci  *number_p = new_number;
987425bb815Sopenharmony_ci  return float_value;
988425bb815Sopenharmony_ci} /* ecma_update_float_number */
989425bb815Sopenharmony_ci
990425bb815Sopenharmony_ci/**
991425bb815Sopenharmony_ci * Assign a float number to an ecma-value
992425bb815Sopenharmony_ci *
993425bb815Sopenharmony_ci * Note:
994425bb815Sopenharmony_ci *      value previously stored in the property is freed
995425bb815Sopenharmony_ci */
996425bb815Sopenharmony_cistatic void
997425bb815Sopenharmony_ciecma_value_assign_float_number (ecma_value_t *value_p, /**< [in, out] ecma value */
998425bb815Sopenharmony_ci                                ecma_number_t ecma_number) /**< number to assign */
999425bb815Sopenharmony_ci{
1000425bb815Sopenharmony_ci  if (ecma_is_value_float_number (*value_p))
1001425bb815Sopenharmony_ci  {
1002425bb815Sopenharmony_ci    ecma_number_t *num_dst_p = (ecma_number_t *) ecma_get_pointer_from_ecma_value (*value_p);
1003425bb815Sopenharmony_ci
1004425bb815Sopenharmony_ci    *num_dst_p = ecma_number;
1005425bb815Sopenharmony_ci    return;
1006425bb815Sopenharmony_ci  }
1007425bb815Sopenharmony_ci
1008425bb815Sopenharmony_ci  if (ecma_get_value_type_field (*value_p) != ECMA_TYPE_DIRECT
1009425bb815Sopenharmony_ci      && ecma_get_value_type_field (*value_p) != ECMA_TYPE_OBJECT)
1010425bb815Sopenharmony_ci  {
1011425bb815Sopenharmony_ci    ecma_free_value (*value_p);
1012425bb815Sopenharmony_ci  }
1013425bb815Sopenharmony_ci
1014425bb815Sopenharmony_ci  *value_p = ecma_create_float_number (ecma_number);
1015425bb815Sopenharmony_ci} /* ecma_value_assign_float_number */
1016425bb815Sopenharmony_ci
1017425bb815Sopenharmony_ci/**
1018425bb815Sopenharmony_ci * Assign a number to an ecma-value
1019425bb815Sopenharmony_ci *
1020425bb815Sopenharmony_ci * Note:
1021425bb815Sopenharmony_ci *      value previously stored in the property is freed
1022425bb815Sopenharmony_ci */
1023425bb815Sopenharmony_civoid
1024425bb815Sopenharmony_ciecma_value_assign_number (ecma_value_t *value_p, /**< [in, out] ecma value */
1025425bb815Sopenharmony_ci                          ecma_number_t ecma_number) /**< number to assign */
1026425bb815Sopenharmony_ci{
1027425bb815Sopenharmony_ci  ecma_integer_value_t integer_value = (ecma_integer_value_t) ecma_number;
1028425bb815Sopenharmony_ci
1029425bb815Sopenharmony_ci  if ((ecma_number_t) integer_value == ecma_number
1030425bb815Sopenharmony_ci      && ((integer_value == 0) ? ecma_is_number_equal_to_positive_zero (ecma_number)
1031425bb815Sopenharmony_ci                               : ECMA_IS_INTEGER_NUMBER (integer_value)))
1032425bb815Sopenharmony_ci  {
1033425bb815Sopenharmony_ci    if (ecma_get_value_type_field (*value_p) != ECMA_TYPE_DIRECT
1034425bb815Sopenharmony_ci        && ecma_get_value_type_field (*value_p) != ECMA_TYPE_OBJECT)
1035425bb815Sopenharmony_ci    {
1036425bb815Sopenharmony_ci      ecma_free_value (*value_p);
1037425bb815Sopenharmony_ci    }
1038425bb815Sopenharmony_ci    *value_p = ecma_make_integer_value (integer_value);
1039425bb815Sopenharmony_ci    return;
1040425bb815Sopenharmony_ci  }
1041425bb815Sopenharmony_ci
1042425bb815Sopenharmony_ci  ecma_value_assign_float_number (value_p, ecma_number);
1043425bb815Sopenharmony_ci} /* ecma_value_assign_number */
1044425bb815Sopenharmony_ci
1045425bb815Sopenharmony_ci/**
1046425bb815Sopenharmony_ci * Free the ecma value
1047425bb815Sopenharmony_ci */
1048425bb815Sopenharmony_civoid
1049425bb815Sopenharmony_ciecma_free_value (ecma_value_t value) /**< value description */
1050425bb815Sopenharmony_ci{
1051425bb815Sopenharmony_ci  switch (ecma_get_value_type_field (value))
1052425bb815Sopenharmony_ci  {
1053425bb815Sopenharmony_ci    case ECMA_TYPE_FLOAT:
1054425bb815Sopenharmony_ci    {
1055425bb815Sopenharmony_ci      ecma_number_t *number_p = (ecma_number_t *) ecma_get_pointer_from_ecma_value (value);
1056425bb815Sopenharmony_ci      ecma_dealloc_number (number_p);
1057425bb815Sopenharmony_ci      break;
1058425bb815Sopenharmony_ci    }
1059425bb815Sopenharmony_ci
1060425bb815Sopenharmony_ci    case ECMA_TYPE_STRING:
1061425bb815Sopenharmony_ci    {
1062425bb815Sopenharmony_ci      ecma_string_t *string_p = ecma_get_string_from_value (value);
1063425bb815Sopenharmony_ci      ecma_deref_ecma_string (string_p);
1064425bb815Sopenharmony_ci      break;
1065425bb815Sopenharmony_ci    }
1066425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015)
1067425bb815Sopenharmony_ci    case ECMA_TYPE_SYMBOL:
1068425bb815Sopenharmony_ci    {
1069425bb815Sopenharmony_ci      ecma_deref_ecma_string (ecma_get_symbol_from_value (value));
1070425bb815Sopenharmony_ci      break;
1071425bb815Sopenharmony_ci    }
1072425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015) */
1073425bb815Sopenharmony_ci    case ECMA_TYPE_OBJECT:
1074425bb815Sopenharmony_ci    {
1075425bb815Sopenharmony_ci      ecma_deref_object (ecma_get_object_from_value (value));
1076425bb815Sopenharmony_ci      break;
1077425bb815Sopenharmony_ci    }
1078425bb815Sopenharmony_ci
1079425bb815Sopenharmony_ci    default:
1080425bb815Sopenharmony_ci    {
1081425bb815Sopenharmony_ci      JERRY_ASSERT (ecma_get_value_type_field (value) == ECMA_TYPE_DIRECT
1082425bb815Sopenharmony_ci                    || ecma_get_value_type_field (value) == ECMA_TYPE_DIRECT_STRING);
1083425bb815Sopenharmony_ci
1084425bb815Sopenharmony_ci      /* no memory is allocated */
1085425bb815Sopenharmony_ci      break;
1086425bb815Sopenharmony_ci    }
1087425bb815Sopenharmony_ci  }
1088425bb815Sopenharmony_ci} /* ecma_free_value */
1089425bb815Sopenharmony_ci
1090425bb815Sopenharmony_ci/**
1091425bb815Sopenharmony_ci * Free the ecma value
1092425bb815Sopenharmony_ci *
1093425bb815Sopenharmony_ci * Note:
1094425bb815Sopenharmony_ci *   this function is similar to ecma_free_value, but it is
1095425bb815Sopenharmony_ci *   faster for direct values since no function call is performed.
1096425bb815Sopenharmony_ci *   It also increases the binary size so it is recommended for
1097425bb815Sopenharmony_ci *   critical code paths only.
1098425bb815Sopenharmony_ci */
1099425bb815Sopenharmony_ciinline void JERRY_ATTR_ALWAYS_INLINE
1100425bb815Sopenharmony_ciecma_fast_free_value (ecma_value_t value) /**< value description */
1101425bb815Sopenharmony_ci{
1102425bb815Sopenharmony_ci  if (ecma_get_value_type_field (value) != ECMA_TYPE_DIRECT)
1103425bb815Sopenharmony_ci  {
1104425bb815Sopenharmony_ci    ecma_free_value (value);
1105425bb815Sopenharmony_ci  }
1106425bb815Sopenharmony_ci} /* ecma_fast_free_value */
1107425bb815Sopenharmony_ci
1108425bb815Sopenharmony_ci/**
1109425bb815Sopenharmony_ci * Free the ecma value if not an object
1110425bb815Sopenharmony_ci */
1111425bb815Sopenharmony_civoid
1112425bb815Sopenharmony_ciecma_free_value_if_not_object (ecma_value_t value) /**< value description */
1113425bb815Sopenharmony_ci{
1114425bb815Sopenharmony_ci  if (ecma_get_value_type_field (value) != ECMA_TYPE_OBJECT)
1115425bb815Sopenharmony_ci  {
1116425bb815Sopenharmony_ci    ecma_free_value (value);
1117425bb815Sopenharmony_ci  }
1118425bb815Sopenharmony_ci} /* ecma_free_value_if_not_object */
1119425bb815Sopenharmony_ci
1120425bb815Sopenharmony_ci/**
1121425bb815Sopenharmony_ci * Free an ecma-value number
1122425bb815Sopenharmony_ci */
1123425bb815Sopenharmony_ciinline void JERRY_ATTR_ALWAYS_INLINE
1124425bb815Sopenharmony_ciecma_free_number (ecma_value_t value) /**< value description */
1125425bb815Sopenharmony_ci{
1126425bb815Sopenharmony_ci  JERRY_ASSERT (ecma_is_value_number (value));
1127425bb815Sopenharmony_ci
1128425bb815Sopenharmony_ci  if (ecma_is_value_float_number (value))
1129425bb815Sopenharmony_ci  {
1130425bb815Sopenharmony_ci    ecma_number_t *number_p = (ecma_number_t *) ecma_get_pointer_from_ecma_value (value);
1131425bb815Sopenharmony_ci    ecma_dealloc_number (number_p);
1132425bb815Sopenharmony_ci  }
1133425bb815Sopenharmony_ci} /* ecma_free_number */
1134425bb815Sopenharmony_ci
1135425bb815Sopenharmony_ci/**
1136425bb815Sopenharmony_ci * Get the literal id associated with the given ecma_value type.
1137425bb815Sopenharmony_ci * This operation is equivalent to the JavaScript 'typeof' operator.
1138425bb815Sopenharmony_ci *
1139425bb815Sopenharmony_ci * @returns one of the following value:
1140425bb815Sopenharmony_ci *          - LIT_MAGIC_STRING_UNDEFINED
1141425bb815Sopenharmony_ci *          - LIT_MAGIC_STRING_OBJECT
1142425bb815Sopenharmony_ci *          - LIT_MAGIC_STRING_BOOLEAN
1143425bb815Sopenharmony_ci *          - LIT_MAGIC_STRING_NUMBER
1144425bb815Sopenharmony_ci *          - LIT_MAGIC_STRING_STRING
1145425bb815Sopenharmony_ci *          - LIT_MAGIC_STRING_FUNCTION
1146425bb815Sopenharmony_ci */
1147425bb815Sopenharmony_cilit_magic_string_id_t
1148425bb815Sopenharmony_ciecma_get_typeof_lit_id (ecma_value_t value) /**< input ecma value */
1149425bb815Sopenharmony_ci{
1150425bb815Sopenharmony_ci  lit_magic_string_id_t ret_value = LIT_MAGIC_STRING__EMPTY;
1151425bb815Sopenharmony_ci
1152425bb815Sopenharmony_ci  if (ecma_is_value_undefined (value))
1153425bb815Sopenharmony_ci  {
1154425bb815Sopenharmony_ci    ret_value = LIT_MAGIC_STRING_UNDEFINED;
1155425bb815Sopenharmony_ci  }
1156425bb815Sopenharmony_ci  else if (ecma_is_value_null (value))
1157425bb815Sopenharmony_ci  {
1158425bb815Sopenharmony_ci    ret_value = LIT_MAGIC_STRING_OBJECT;
1159425bb815Sopenharmony_ci  }
1160425bb815Sopenharmony_ci  else if (ecma_is_value_boolean (value))
1161425bb815Sopenharmony_ci  {
1162425bb815Sopenharmony_ci    ret_value = LIT_MAGIC_STRING_BOOLEAN;
1163425bb815Sopenharmony_ci  }
1164425bb815Sopenharmony_ci  else if (ecma_is_value_number (value))
1165425bb815Sopenharmony_ci  {
1166425bb815Sopenharmony_ci    ret_value = LIT_MAGIC_STRING_NUMBER;
1167425bb815Sopenharmony_ci  }
1168425bb815Sopenharmony_ci  else if (ecma_is_value_string (value))
1169425bb815Sopenharmony_ci  {
1170425bb815Sopenharmony_ci    ret_value = LIT_MAGIC_STRING_STRING;
1171425bb815Sopenharmony_ci  }
1172425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015)
1173425bb815Sopenharmony_ci  else if (ecma_is_value_symbol (value))
1174425bb815Sopenharmony_ci  {
1175425bb815Sopenharmony_ci    ret_value = LIT_MAGIC_STRING_SYMBOL;
1176425bb815Sopenharmony_ci  }
1177425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015) */
1178425bb815Sopenharmony_ci  else
1179425bb815Sopenharmony_ci  {
1180425bb815Sopenharmony_ci    JERRY_ASSERT (ecma_is_value_object (value));
1181425bb815Sopenharmony_ci
1182425bb815Sopenharmony_ci    ret_value = ecma_op_is_callable (value) ? LIT_MAGIC_STRING_FUNCTION : LIT_MAGIC_STRING_OBJECT;
1183425bb815Sopenharmony_ci  }
1184425bb815Sopenharmony_ci
1185425bb815Sopenharmony_ci  JERRY_ASSERT (ret_value != LIT_MAGIC_STRING__EMPTY);
1186425bb815Sopenharmony_ci
1187425bb815Sopenharmony_ci  return ret_value;
1188425bb815Sopenharmony_ci} /* ecma_get_typeof_lit_id */
1189425bb815Sopenharmony_ci
1190425bb815Sopenharmony_ci/**
1191425bb815Sopenharmony_ci * @}
1192425bb815Sopenharmony_ci * @}
1193425bb815Sopenharmony_ci */
1194