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 <math.h> 17425bb815Sopenharmony_ci 18425bb815Sopenharmony_ci#include "ecma-alloc.h" 19425bb815Sopenharmony_ci#include "ecma-builtins.h" 20425bb815Sopenharmony_ci#include "ecma-conversion.h" 21425bb815Sopenharmony_ci#include "ecma-exceptions.h" 22425bb815Sopenharmony_ci#include "ecma-gc.h" 23425bb815Sopenharmony_ci#include "ecma-globals.h" 24425bb815Sopenharmony_ci#include "ecma-helpers.h" 25425bb815Sopenharmony_ci#include "ecma-number-object.h" 26425bb815Sopenharmony_ci#include "ecma-objects.h" 27425bb815Sopenharmony_ci#include "ecma-try-catch-macro.h" 28425bb815Sopenharmony_ci#include "jrt.h" 29425bb815Sopenharmony_ci 30425bb815Sopenharmony_ci#if ENABLED (JERRY_BUILTIN_NUMBER) 31425bb815Sopenharmony_ci 32425bb815Sopenharmony_ci#define ECMA_BUILTINS_INTERNAL 33425bb815Sopenharmony_ci#include "ecma-builtins-internal.h" 34425bb815Sopenharmony_ci 35425bb815Sopenharmony_ci#define BUILTIN_INC_HEADER_NAME "ecma-builtin-number.inc.h" 36425bb815Sopenharmony_ci#define BUILTIN_UNDERSCORED_ID number 37425bb815Sopenharmony_ci#include "ecma-builtin-internal-routines-template.inc.h" 38425bb815Sopenharmony_ci 39425bb815Sopenharmony_ci/** \addtogroup ecma ECMA 40425bb815Sopenharmony_ci * @{ 41425bb815Sopenharmony_ci * 42425bb815Sopenharmony_ci * \addtogroup ecmabuiltins 43425bb815Sopenharmony_ci * @{ 44425bb815Sopenharmony_ci * 45425bb815Sopenharmony_ci * \addtogroup number ECMA Number object built-in 46425bb815Sopenharmony_ci * @{ 47425bb815Sopenharmony_ci */ 48425bb815Sopenharmony_ci 49425bb815Sopenharmony_ci/** 50425bb815Sopenharmony_ci * Handle calling [[Call]] of built-in Number object 51425bb815Sopenharmony_ci * 52425bb815Sopenharmony_ci * @return ecma value 53425bb815Sopenharmony_ci */ 54425bb815Sopenharmony_ciecma_value_t 55425bb815Sopenharmony_ciecma_builtin_number_dispatch_call (const ecma_value_t *arguments_list_p, /**< arguments list */ 56425bb815Sopenharmony_ci ecma_length_t arguments_list_len) /**< number of arguments */ 57425bb815Sopenharmony_ci{ 58425bb815Sopenharmony_ci JERRY_ASSERT (arguments_list_len == 0 || arguments_list_p != NULL); 59425bb815Sopenharmony_ci 60425bb815Sopenharmony_ci ecma_value_t ret_value = ECMA_VALUE_EMPTY; 61425bb815Sopenharmony_ci 62425bb815Sopenharmony_ci if (arguments_list_len == 0) 63425bb815Sopenharmony_ci { 64425bb815Sopenharmony_ci ret_value = ecma_make_integer_value (0); 65425bb815Sopenharmony_ci } 66425bb815Sopenharmony_ci else 67425bb815Sopenharmony_ci { 68425bb815Sopenharmony_ci ret_value = ecma_op_to_number (arguments_list_p[0]); 69425bb815Sopenharmony_ci } 70425bb815Sopenharmony_ci 71425bb815Sopenharmony_ci return ret_value; 72425bb815Sopenharmony_ci} /* ecma_builtin_number_dispatch_call */ 73425bb815Sopenharmony_ci 74425bb815Sopenharmony_ci/** 75425bb815Sopenharmony_ci * Handle calling [[Construct]] of built-in Number object 76425bb815Sopenharmony_ci * 77425bb815Sopenharmony_ci * @return ecma value 78425bb815Sopenharmony_ci */ 79425bb815Sopenharmony_ciecma_value_t 80425bb815Sopenharmony_ciecma_builtin_number_dispatch_construct (const ecma_value_t *arguments_list_p, /**< arguments list */ 81425bb815Sopenharmony_ci ecma_length_t arguments_list_len) /**< number of arguments */ 82425bb815Sopenharmony_ci{ 83425bb815Sopenharmony_ci JERRY_ASSERT (arguments_list_len == 0 || arguments_list_p != NULL); 84425bb815Sopenharmony_ci 85425bb815Sopenharmony_ci if (arguments_list_len == 0) 86425bb815Sopenharmony_ci { 87425bb815Sopenharmony_ci ecma_value_t completion = ecma_op_create_number_object (ecma_make_integer_value (0)); 88425bb815Sopenharmony_ci return completion; 89425bb815Sopenharmony_ci } 90425bb815Sopenharmony_ci else 91425bb815Sopenharmony_ci { 92425bb815Sopenharmony_ci return ecma_op_create_number_object (arguments_list_p[0]); 93425bb815Sopenharmony_ci } 94425bb815Sopenharmony_ci} /* ecma_builtin_number_dispatch_construct */ 95425bb815Sopenharmony_ci 96425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015) 97425bb815Sopenharmony_ci 98425bb815Sopenharmony_ci/** 99425bb815Sopenharmony_ci * The Number object 'isFinite' routine 100425bb815Sopenharmony_ci * 101425bb815Sopenharmony_ci * See also: 102425bb815Sopenharmony_ci * ECMA-262 v6, 20.1.2.2 103425bb815Sopenharmony_ci * 104425bb815Sopenharmony_ci * @return ecma value 105425bb815Sopenharmony_ci * Returned value must be freed with ecma_free_value. 106425bb815Sopenharmony_ci */ 107425bb815Sopenharmony_cistatic ecma_value_t 108425bb815Sopenharmony_ciecma_builtin_number_object_is_finite (ecma_value_t this_arg, /**< this argument */ 109425bb815Sopenharmony_ci ecma_value_t arg) /**< routine's argument */ 110425bb815Sopenharmony_ci{ 111425bb815Sopenharmony_ci JERRY_UNUSED (this_arg); 112425bb815Sopenharmony_ci 113425bb815Sopenharmony_ci if (ecma_is_value_number (arg)) 114425bb815Sopenharmony_ci { 115425bb815Sopenharmony_ci ecma_number_t num = ecma_get_number_from_value (arg); 116425bb815Sopenharmony_ci if (!(ecma_number_is_nan (num) || ecma_number_is_infinity (num))) 117425bb815Sopenharmony_ci { 118425bb815Sopenharmony_ci return ECMA_VALUE_TRUE; 119425bb815Sopenharmony_ci } 120425bb815Sopenharmony_ci } 121425bb815Sopenharmony_ci return ECMA_VALUE_FALSE; 122425bb815Sopenharmony_ci} /* ecma_builtin_number_object_is_finite */ 123425bb815Sopenharmony_ci 124425bb815Sopenharmony_ci/** 125425bb815Sopenharmony_ci * The Number object 'isNan' routine 126425bb815Sopenharmony_ci * 127425bb815Sopenharmony_ci * See also: 128425bb815Sopenharmony_ci * ECMA-262 v6, 20.1.2.4 129425bb815Sopenharmony_ci * 130425bb815Sopenharmony_ci * @return ecma value 131425bb815Sopenharmony_ci * Returned value must be freed with ecma_free_value. 132425bb815Sopenharmony_ci */ 133425bb815Sopenharmony_cistatic ecma_value_t 134425bb815Sopenharmony_ciecma_builtin_number_object_is_nan (ecma_value_t this_arg, /**< this argument */ 135425bb815Sopenharmony_ci ecma_value_t arg) /**< routine's argument */ 136425bb815Sopenharmony_ci{ 137425bb815Sopenharmony_ci JERRY_UNUSED (this_arg); 138425bb815Sopenharmony_ci 139425bb815Sopenharmony_ci if (ecma_is_value_number (arg)) 140425bb815Sopenharmony_ci { 141425bb815Sopenharmony_ci ecma_number_t num_val = ecma_get_number_from_value (arg); 142425bb815Sopenharmony_ci 143425bb815Sopenharmony_ci if (ecma_number_is_nan (num_val)) 144425bb815Sopenharmony_ci { 145425bb815Sopenharmony_ci return ECMA_VALUE_TRUE; 146425bb815Sopenharmony_ci } 147425bb815Sopenharmony_ci } 148425bb815Sopenharmony_ci return ECMA_VALUE_FALSE; 149425bb815Sopenharmony_ci} /* ecma_builtin_number_object_is_nan */ 150425bb815Sopenharmony_ci 151425bb815Sopenharmony_ci/** 152425bb815Sopenharmony_ci * The Number object 'isInteger' routine 153425bb815Sopenharmony_ci * 154425bb815Sopenharmony_ci * See also: 155425bb815Sopenharmony_ci * ECMA-262 v6, 20.1.2.3 156425bb815Sopenharmony_ci * 157425bb815Sopenharmony_ci * @return ecma value 158425bb815Sopenharmony_ci * Returned value must be freed with ecma_free_value. 159425bb815Sopenharmony_ci */ 160425bb815Sopenharmony_cistatic ecma_value_t 161425bb815Sopenharmony_ciecma_builtin_number_object_is_integer (ecma_value_t this_arg, /**< this argument */ 162425bb815Sopenharmony_ci ecma_value_t arg) /**< routine's argument */ 163425bb815Sopenharmony_ci{ 164425bb815Sopenharmony_ci JERRY_UNUSED (this_arg); 165425bb815Sopenharmony_ci if (!ecma_is_value_number (arg)) 166425bb815Sopenharmony_ci { 167425bb815Sopenharmony_ci return ECMA_VALUE_FALSE; 168425bb815Sopenharmony_ci } 169425bb815Sopenharmony_ci 170425bb815Sopenharmony_ci ecma_number_t num = ecma_get_number_from_value (arg); 171425bb815Sopenharmony_ci 172425bb815Sopenharmony_ci if (ecma_number_is_nan (num) || ecma_number_is_infinity (num)) 173425bb815Sopenharmony_ci { 174425bb815Sopenharmony_ci return ECMA_VALUE_FALSE; 175425bb815Sopenharmony_ci } 176425bb815Sopenharmony_ci 177425bb815Sopenharmony_ci ecma_number_t int_num; 178425bb815Sopenharmony_ci ecma_op_to_integer (arg, &int_num); 179425bb815Sopenharmony_ci 180425bb815Sopenharmony_ci if (int_num != num) 181425bb815Sopenharmony_ci { 182425bb815Sopenharmony_ci return ECMA_VALUE_FALSE; 183425bb815Sopenharmony_ci } 184425bb815Sopenharmony_ci 185425bb815Sopenharmony_ci return ECMA_VALUE_TRUE; 186425bb815Sopenharmony_ci} /* ecma_builtin_number_object_is_integer */ 187425bb815Sopenharmony_ci 188425bb815Sopenharmony_ci/** 189425bb815Sopenharmony_ci * The Number object 'isSafeInteger' routine 190425bb815Sopenharmony_ci * 191425bb815Sopenharmony_ci * See also: 192425bb815Sopenharmony_ci * ECMA-262 v6, 20.1.2.3 193425bb815Sopenharmony_ci * 194425bb815Sopenharmony_ci * @return ecma value 195425bb815Sopenharmony_ci * Returned value must be freed with ecma_free_value. 196425bb815Sopenharmony_ci */ 197425bb815Sopenharmony_cistatic ecma_value_t 198425bb815Sopenharmony_ciecma_builtin_number_object_is_safe_integer (ecma_value_t this_arg, /**< this argument */ 199425bb815Sopenharmony_ci ecma_value_t arg) /**< routine's argument */ 200425bb815Sopenharmony_ci{ 201425bb815Sopenharmony_ci JERRY_UNUSED (this_arg); 202425bb815Sopenharmony_ci 203425bb815Sopenharmony_ci if (!ecma_is_value_number (arg)) 204425bb815Sopenharmony_ci { 205425bb815Sopenharmony_ci return ECMA_VALUE_FALSE; 206425bb815Sopenharmony_ci } 207425bb815Sopenharmony_ci 208425bb815Sopenharmony_ci ecma_number_t num = ecma_get_number_from_value (arg); 209425bb815Sopenharmony_ci 210425bb815Sopenharmony_ci if (ecma_number_is_nan (num) || ecma_number_is_infinity (num)) 211425bb815Sopenharmony_ci { 212425bb815Sopenharmony_ci return ECMA_VALUE_FALSE; 213425bb815Sopenharmony_ci } 214425bb815Sopenharmony_ci 215425bb815Sopenharmony_ci ecma_number_t int_num = ecma_number_trunc (num); 216425bb815Sopenharmony_ci 217425bb815Sopenharmony_ci if (int_num == num && fabs (int_num) <= ECMA_NUMBER_MAX_SAFE_INTEGER) 218425bb815Sopenharmony_ci { 219425bb815Sopenharmony_ci return ECMA_VALUE_TRUE; 220425bb815Sopenharmony_ci } 221425bb815Sopenharmony_ci 222425bb815Sopenharmony_ci return ECMA_VALUE_FALSE; 223425bb815Sopenharmony_ci} /* ecma_builtin_number_object_is_safe_integer */ 224425bb815Sopenharmony_ci 225425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015) */ 226425bb815Sopenharmony_ci 227425bb815Sopenharmony_ci/** 228425bb815Sopenharmony_ci * @} 229425bb815Sopenharmony_ci * @} 230425bb815Sopenharmony_ci * @} 231425bb815Sopenharmony_ci */ 232425bb815Sopenharmony_ci 233425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_BUILTIN_NUMBER) */ 234