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