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