1/*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#ifndef ECMASCRIPT_BUILTINS_BUILTINS_BIGINT_H
17#define ECMASCRIPT_BUILTINS_BUILTINS_BIGINT_H
18
19#include "ecmascript/base/builtins_base.h"
20#include "ecmascript/js_tagged_value.h"
21
22// List of functions in BigInt, excluding the constructor and '@@' properties.
23// V(name, func, length, stubIndex)
24// where BuiltinsBigInt::func refers to the native implementation of BigInt[name].
25//       kungfu::BuiltinsStubCSigns::stubIndex refers to the builtin stub index, or INVALID if no stub available.
26#define BUILTIN_BIGINT_FUNCTIONS(V)                                         \
27    /* BigInt.asIntN (bits, bigint) */                                      \
28    V("asIntN", AsIntN, 2, BigIntAsIntN)                                    \
29    /* BigInt.asUintN ( bits, bigint ) */                                   \
30    V("asUintN", AsUintN, 2, BigIntAsUintN)
31// List of functions in BigInt.prototype, excluding the constructor and '@@' properties.
32// V(name, func, length, stubIndex)
33// where BuiltinsBigInt::func refers to the native implementation of BigInt.prototype[name].
34//       kungfu::BuiltinsStubCSigns::stubIndex refers to the builtin stub index, or INVALID if no stub available.
35#define BUILTIN_BIGINT_PROTOTYPE_FUNCTIONS(V)                               \
36    /* BigInt.toLocaleString ( [ reserved1 [ , reserved2 ] ] ) */           \
37    V("toLocaleString", ToLocaleString, 0, INVALID)                         \
38    /* BigInt.toString ( [radix] ) */                                       \
39    V("toString", ToString, 0, INVALID)                                     \
40    /* BigInt.valueOf ( ) */                                                \
41    V("valueOf", ValueOf, 0, INVALID)
42
43namespace panda::ecmascript::builtins {
44class BuiltinsBigInt : public base::BuiltinsBase {
45public:
46    // 21.2.1.1
47    static JSTaggedValue BigIntConstructor(EcmaRuntimeCallInfo *argv);
48    static JSTaggedValue BigIntConstructorInternal(JSThread *thread, JSHandle<JSTaggedValue> value);
49    // 21.2.2.1
50    static JSTaggedValue AsIntN(EcmaRuntimeCallInfo *argv);
51    // 21.2.2.2
52    static JSTaggedValue AsUintN(EcmaRuntimeCallInfo *argv);
53    // 21.2.3.2
54    static JSTaggedValue ToLocaleString(EcmaRuntimeCallInfo *argv);
55    // 21.2.3.3
56    static JSTaggedValue ToString(EcmaRuntimeCallInfo *argv);
57    // 21.2.3.4
58    static JSTaggedValue ValueOf(EcmaRuntimeCallInfo *argv);
59private:
60    static JSTaggedValue ThisBigIntValue(EcmaRuntimeCallInfo *argv);
61
62public:
63    // Excluding the constructor and '@@' internal properties.
64    static Span<const base::BuiltinFunctionEntry> GetBigIntFunctions()
65    {
66        return Span<const base::BuiltinFunctionEntry>(BIGINT_FUNCTIONS);
67    }
68
69    // Excluding the constructor and '@@' internal properties.
70    static Span<const base::BuiltinFunctionEntry> GetBigIntPrototypeFunctions()
71    {
72        return Span<const base::BuiltinFunctionEntry>(BIGINT_PROTOTYPE_FUNCTIONS);
73    }
74
75private:
76#define BUILTIN_BIGINT_FUNCTION_ENTRY(name, func, length, builtinId) \
77    base::BuiltinFunctionEntry::Create(name, BuiltinsBigInt::func, length, kungfu::BuiltinsStubCSigns::builtinId),
78
79    static inline std::array BIGINT_FUNCTIONS = {
80        BUILTIN_BIGINT_FUNCTIONS(BUILTIN_BIGINT_FUNCTION_ENTRY)
81    };
82    static inline std::array BIGINT_PROTOTYPE_FUNCTIONS = {
83        BUILTIN_BIGINT_PROTOTYPE_FUNCTIONS(BUILTIN_BIGINT_FUNCTION_ENTRY)
84    };
85#undef BUILTIN_BIGINT_FUNCTION_ENTRY
86};
87}  // namespace panda::ecmascript::builtins
88#endif  // ECMASCRIPT_BUILTINS_BUILTINS_BIGINT_H