1/*
2 * Copyright (c) 2022-2024 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_COMPILER_BUILTINS_CALL_SIGNATURE_H
17#define ECMASCRIPT_COMPILER_BUILTINS_CALL_SIGNATURE_H
18
19#include "ecmascript/base/config.h"
20#include "ecmascript/compiler/call_signature.h"
21
22namespace panda::ecmascript::kungfu {
23
24#define PADDING_BUILTINS_STUB_LIST(V)               \
25    V(NONE)
26
27// BUILTINS_STUB_LIST is shared both ASM Interpreter and AOT.
28// AOT_BUILTINS_STUB_LIST is used in AOT only.
29#define BUILTINS_STUB_LIST(V, D, C)                 \
30    BUILTINS_METHOD_STUB_LIST(D, D, D, D)           \
31    BUILTINS_WITH_CONTAINERS_STUB_BUILDER(D)        \
32    AOT_AND_BUILTINS_STUB_LIST(V)                   \
33    BUILTINS_CONSTRUCTOR_STUB_LIST(C)               \
34    BUILTINS_ARKTOOLS_STUB_BUILDER(D)
35
36#define BUILTINS_NOSTUB_LIST(V)                     \
37    V(ObjectConstructor)                            \
38    V(GlobalDecodeURIComponent)
39
40#define BUILTINS_METHOD_STUB_LIST(V, T, D, K)       \
41    BUILTINS_WITH_STRING_STUB_BUILDER(V)            \
42    BUILTINS_WITH_OBJECT_STUB_BUILDER(T)            \
43    BUILTINS_WITH_ARRAY_STUB_BUILDER(V)             \
44    BUILTINS_WITH_SET_STUB_BUILDER(D)               \
45    BUILTINS_WITH_MAP_STUB_BUILDER(D)               \
46    BUILTINS_WITH_FUNCTION_STUB_BUILDER(V)          \
47    BUILTINS_WITH_NUMBER_STUB_BUILDER(T)            \
48    BUILTINS_WITH_TYPEDARRAY_STUB_BUILDER(V)        \
49    BUILTINS_WITH_DATAVIEW_STUB_BUILDER(K)          \
50    BUILTINS_WITH_REFLECT_STUB_BUILDER(T)           \
51    BUILTINS_WITH_COLLATOR_STUB_BUILDER(V)          \
52    BUILTINS_WITH_REGEXP_STUB_BUILDER(V)
53
54#define BUILTINS_WITH_STRING_STUB_BUILDER(V)                                            \
55    V(CharAt,             String,   Hole())                                             \
56    V(FromCharCode,       String,   Hole())                                             \
57    V(CharCodeAt,         String,   DoubleToTaggedDoublePtr(Double(base::NAN_VALUE)))   \
58    V(CodePointAt,        String,   Undefined())                                        \
59    V(IndexOf,            String,   IntToTaggedPtr(Int32(-1)))                          \
60    V(Substring,          String,   IntToTaggedPtr(Int32(-1)))                          \
61    V(SubStr,             String,   Undefined())                                        \
62    V(Replace,            String,   Undefined())                                        \
63    V(Trim,               String,   Undefined())                                        \
64    V(TrimStart,          String,   Undefined())                                        \
65    V(TrimEnd,            String,   Undefined())                                        \
66    V(TrimLeft,           String,   Undefined())                                        \
67    V(TrimRight,          String,   Undefined())                                        \
68    V(PadStart,           String,   Undefined())                                        \
69    V(PadEnd,             String,   Undefined())                                        \
70    V(Concat,             String,   Undefined())                                        \
71    V(Slice,              String,   Undefined())                                        \
72    V(ToLowerCase,        String,   Undefined())                                        \
73    V(StartsWith,         String,   TaggedFalse())                                      \
74    V(EndsWith,           String,   TaggedFalse())                                      \
75    V(GetStringIterator,  String,   Undefined())
76
77#define BUILTINS_WITH_OBJECT_STUB_BUILDER(V)                                      \
78    V(ToString,                    Object,   Undefined())                         \
79    V(Create,                      Object,   Undefined())                         \
80    V(Assign,                      Object,   Undefined())                         \
81    V(HasOwnProperty,              Object,   TaggedFalse())                       \
82    V(Keys,                        Object,   Undefined())                         \
83    V(GetPrototypeOf,              Object,   Undefined())                         \
84    V(GetOwnPropertyNames,         Object,   Undefined())                         \
85    V(GetOwnPropertySymbols,       Object,   Undefined())                         \
86    V(Entries,                     Object,   Undefined())                         \
87    V(IsFrozen,                    Object,   Undefined())                         \
88    V(IsSealed,                    Object,   Undefined())                         \
89    V(GetOwnPropertyDescriptors,   Object,   Undefined())                         \
90    V(SetPrototypeOf,              Object,   Undefined())
91
92#define BUILTINS_WITH_ARRAY_STUB_BUILDER(V)         \
93    V(With,          Array,   Undefined())          \
94    V(Unshift,       Array,   Undefined())          \
95    V(Shift,         Array,   Undefined())          \
96    V(Concat,        Array,   Undefined())          \
97    V(Filter,        Array,   Undefined())          \
98    V(Find,          Array,   Undefined())          \
99    V(FindIndex,     Array,   Undefined())          \
100    V(From,          Array,   Undefined())          \
101    V(Splice,        Array,   Undefined())          \
102    V(ToSpliced,     Array,   Undefined())          \
103    V(ForEach,       Array,   Undefined())          \
104    V(IndexOf,       Array,   Undefined())          \
105    V(LastIndexOf,   Array,   Undefined())          \
106    V(Pop,           Array,   Undefined())          \
107    V(Slice,         Array,   Undefined())          \
108    V(Reduce,        Array,   Undefined())          \
109    V(Reverse,       Array,   Undefined())          \
110    V(ToReversed,    Array,   Undefined())          \
111    V(Push,          Array,   Undefined())          \
112    V(Values,        Array,   Undefined())          \
113    V(Includes,      Array,   Undefined())          \
114    V(CopyWithin,    Array,   Undefined())          \
115    V(Some,          Array,   Undefined())          \
116    V(Fill,          Array,   Undefined())          \
117    V(Every,         Array,   Undefined())          \
118    V(FindLastIndex, Array,   Undefined())          \
119    V(FindLast,      Array,   Undefined())          \
120    V(ReduceRight,   Array,   Undefined())          \
121    V(Map,           Array,   Undefined())          \
122    V(FlatMap,       Array,   Undefined())          \
123    V(ToSorted,      Array,   Undefined())          \
124    V(IsArray,       Array,   Undefined())
125
126#define BUILTINS_WITH_SET_STUB_BUILDER(V)           \
127    V(Clear,    Set,   Undefined())                 \
128    V(Values,   Set,   Undefined())                 \
129    V(Entries,  Set,   Undefined())                 \
130    V(ForEach,  Set,   Undefined())                 \
131    V(Add,      Set,   Undefined())                 \
132    V(Delete,   Set,   Undefined())                 \
133    V(Has,      Set,   Undefined())
134
135#define BUILTINS_WITH_MAP_STUB_BUILDER(V)           \
136    V(Clear,    Map,   Undefined())                 \
137    V(Values,   Map,   Undefined())                 \
138    V(Entries,  Map,   Undefined())                 \
139    V(Keys,     Map,   Undefined())                 \
140    V(ForEach,  Map,   Undefined())                 \
141    V(Set,      Map,   Undefined())                 \
142    V(Delete,   Map,   Undefined())                 \
143    V(Has,      Map,   Undefined())                 \
144    V(Get,      Map,   Undefined())
145
146#define BUILTINS_WITH_FUNCTION_STUB_BUILDER(V)      \
147    V(PrototypeApply,  Function,  Undefined())      \
148    V(PrototypeBind,   Function,  Undefined())      \
149    V(PrototypeCall,   Function,  Undefined())
150
151#define BUILTINS_WITH_NUMBER_STUB_BUILDER(V)        \
152    V(ParseFloat,      Number,    Undefined())      \
153    V(ParseInt,        Number,    Undefined())      \
154    V(IsFinite,        Number,    Undefined())      \
155    V(IsNaN,           Number,    Undefined())      \
156    V(IsInteger,       Number,    Undefined())      \
157    V(IsSafeInteger,   Number,    Undefined())      \
158    V(ToString,        Number,    Undefined())
159
160#define BUILTINS_WITH_REFLECT_STUB_BUILDER(V)       \
161    V(Get,             Reflect,   Undefined())
162
163#define BUILTINS_WITH_COLLATOR_STUB_BUILDER(V)      \
164    V(ResolvedOptions, Collator,   Undefined())
165
166#define BUILTINS_WITH_REGEXP_STUB_BUILDER(V)        \
167    V(GetFlags,        RegExp,   Undefined())
168
169#define BUILTINS_WITH_TYPEDARRAY_STUB_BUILDER(V)    \
170    V(Reverse,         TypedArray,  Undefined())    \
171    V(LastIndexOf,     TypedArray,  Undefined())    \
172    V(IndexOf,         TypedArray,  Undefined())    \
173    V(Find,            TypedArray,  Undefined())    \
174    V(Includes,        TypedArray,  Undefined())    \
175    V(CopyWithin,      TypedArray,  Undefined())    \
176    V(ReduceRight,     TypedArray,  Undefined())    \
177    V(Reduce,          TypedArray,  Undefined())    \
178    V(Every,           TypedArray,  Undefined())    \
179    V(Some,            TypedArray,  Undefined())    \
180    V(Filter,          TypedArray,  Undefined())    \
181    V(With,            TypedArray,  Undefined())    \
182    V(Entries,         TypedArray,  Undefined())    \
183    V(Keys,            TypedArray,  Undefined())    \
184    V(Values,          TypedArray,  Undefined())    \
185    V(Slice,           TypedArray,  Undefined())    \
186    V(SubArray,        TypedArray,  Undefined())    \
187    V(Sort,            TypedArray,  Undefined())    \
188    V(GetByteLength,   TypedArray,  Undefined())    \
189    V(GetByteOffset,   TypedArray,  Undefined())    \
190    V(Set,             TypedArray,  Undefined())    \
191    V(FindIndex,       TypedArray,  Undefined())    \
192    V(FindLastIndex,   TypedArray,  Undefined())    \
193    V(ToSorted,        TypedArray,  Undefined())    \
194    V(Of,              TypedArray,  Undefined())    \
195    V(Map,             TypedArray,  Undefined())    \
196    V(ToReversed,      TypedArray,  Undefined())
197
198#define BUILTINS_WITH_DATAVIEW_STUB_BUILDER(V)                           \
199    V(SetInt32,     DataView,  INT32,     SetTypedValue, Undefined())    \
200    V(SetFloat32,   DataView,  FLOAT32,   SetTypedValue, Undefined())    \
201    V(SetFloat64,   DataView,  FLOAT64,   SetTypedValue, Undefined())
202
203#define BUILTINS_WITH_CONTAINERS_STUB_BUILDER(V)                                                               \
204    V(ForEach,            ArrayList,      ContainersCommonFuncCall,  ARRAYLIST_FOREACH,            JS_POINTER) \
205    V(ForEach,            Deque,          DequeCommonFuncCall,       DEQUE_FOREACH,                JS_POINTER) \
206    V(ForEach,            HashMap,        ContainersHashCall,        HASHMAP_FOREACH,              JS_POINTER) \
207    V(ForEach,            HashSet,        ContainersHashCall,        HASHSET_FOREACH,              JS_POINTER) \
208    V(ForEach,            LightWeightMap, ContainersLightWeightCall, LIGHTWEIGHTMAP_FOREACH,       JS_POINTER) \
209    V(ForEach,            LightWeightSet, ContainersLightWeightCall, LIGHTWEIGHTSET_FOREACH,       JS_POINTER) \
210    V(ForEach,            LinkedList,     ContainersLinkedListCall,  LINKEDLIST_FOREACH,           JS_POINTER) \
211    V(ForEach,            List,           ContainersLinkedListCall,  LIST_FOREACH,                 JS_POINTER) \
212    V(ForEach,            PlainArray,     ContainersCommonFuncCall,  PLAINARRAY_FOREACH,           JS_POINTER) \
213    V(ForEach,            Queue,          QueueCommonFuncCall,       QUEUE_FOREACH,                JS_POINTER) \
214    V(ForEach,            Stack,          ContainersCommonFuncCall,  STACK_FOREACH,                JS_POINTER) \
215    V(ForEach,            Vector,         ContainersCommonFuncCall,  VECTOR_FOREACH,               JS_POINTER) \
216    V(ReplaceAllElements, ArrayList,      ContainersCommonFuncCall,  ARRAYLIST_REPLACEALLELEMENTS, JS_POINTER) \
217    V(ReplaceAllElements, Vector,         ContainersCommonFuncCall,  VECTOR_REPLACEALLELEMENTS,    JS_POINTER)
218
219#define BUILTINS_ARKTOOLS_STUB_BUILDER(V) \
220    V(HashCode, ArkTools, Undefined())
221
222#define BUILTINS_CONSTRUCTOR_STUB_LIST(V)           \
223    V(BooleanConstructor)                           \
224    V(NumberConstructor)                            \
225    V(ProxyConstructor)                             \
226    V(DateConstructor)                              \
227    V(ArrayConstructor)                             \
228    V(SetConstructor)                               \
229    V(MapConstructor)                               \
230    V(Int8ArrayConstructor)                         \
231    V(Uint8ArrayConstructor)                        \
232    V(Uint8ClampedArrayConstructor)                 \
233    V(Int16ArrayConstructor)                        \
234    V(Uint16ArrayConstructor)                       \
235    V(Int32ArrayConstructor)                        \
236    V(Uint32ArrayConstructor)                       \
237    V(Float32ArrayConstructor)                      \
238    V(Float64ArrayConstructor)                      \
239    V(BigInt64ArrayConstructor)                     \
240    V(BigUint64ArrayConstructor)
241
242#define AOT_AND_BUILTINS_STUB_LIST(V)               \
243    V(StringLocaleCompare)                                \
244    V(StringIteratorProtoNext)                   \
245    V(ArraySort)
246
247#define AOT_BUILTINS_STUB_LIST(V)                   \
248    V(JsonStringify)                                    \
249    V(MapProtoIterator)                                 \
250    V(MapIteratorProtoNext)                             \
251    V(SetProtoIterator)                                 \
252    V(SetIteratorProtoNext)                             \
253    V(StringProtoIterator)                              \
254    V(ArrayProtoIterator)                               \
255    V(ArrayIteratorProtoNext)                           \
256    V(TypeArrayProtoIterator)                           \
257    V(IteratorProtoReturn)
258
259// List of builtins which will try to be inlined in TypedNativeInlineLoweringPass
260#define AOT_BUILTINS_INLINE_LIST(V)                 \
261    V(MathAcos)                                     \
262    V(MathAcosh)                                    \
263    V(MathAsin)                                     \
264    V(MathAsinh)                                    \
265    V(MathAtan)                                     \
266    V(MathAtan2)                                    \
267    V(MathAtanh)                                    \
268    V(MathCos)                                      \
269    V(MathCosh)                                     \
270    V(MathSign)                                     \
271    V(MathSin)                                      \
272    V(MathSinh)                                     \
273    V(MathSqrt)                                     \
274    V(MathTan)                                      \
275    V(MathCbrt)                                     \
276    V(MathTanh)                                     \
277    V(MathLog)                                      \
278    V(MathLog2)                                     \
279    V(MathLog10)                                    \
280    V(MathLog1p)                                    \
281    V(MathExp)                                      \
282    V(MathExpm1)                                    \
283    V(MathClz32)                                    \
284    V(MathPow)                                      \
285    V(MathTrunc)                                    \
286    V(MathCeil)                                     \
287    V(MathFloor)                                    \
288    V(MathAbs)                                      \
289    V(MathRound)                                    \
290    V(MathFRound)                                   \
291    V(MathMin)                                      \
292    V(MathMax)                                      \
293    V(MathImul)                                     \
294    V(DateGetTime)                                  \
295    V(DateNow)                                      \
296    V(GlobalIsFinite)                               \
297    V(GlobalIsNan)                                  \
298    V(BigIntConstructor)                            \
299    V(ArrayBufferIsView)                            \
300    V(BigIntAsIntN)                                 \
301    V(BigIntAsUintN)                                \
302    V(DataViewGetFloat32)                           \
303    V(DataViewGetFloat64)                           \
304    V(DataViewGetInt8)                              \
305    V(DataViewGetInt16)                             \
306    V(DataViewGetInt32)                             \
307    V(DataViewGetUint16)                            \
308    V(DataViewGetUint32)                            \
309    V(DataViewGetUint8)                             \
310    V(DataViewSetInt8)                              \
311    V(DataViewSetInt16)                             \
312    V(DataViewSetUint8)                             \
313    V(DataViewSetUint16)                            \
314    V(DataViewSetUint32)                            \
315    V(ObjectIs)                                     \
316    V(ObjectGetProto)                               \
317    V(ObjectIsPrototypeOf)                          \
318    V(ReflectGetPrototypeOf)                        \
319    V(ReflectHas)                                   \
320    V(ReflectConstruct)                             \
321    V(ReflectApply)                                 \
322    V(FunctionPrototypeHasInstance)                 \
323    V(ArrayKeys)                                    \
324    V(ArrayEntries)                                 \
325    V(TYPED_BUILTINS_INLINE_FIRST = MathAcos)       \
326    V(TYPED_BUILTINS_INLINE_LAST = ArrayEntries)
327
328class BuiltinsStubCSigns {
329public:
330    enum ID {
331#define DEF_STUB_ID(name) name,
332#define DEF_STUB_ID_DYN(name, type, ...) type##name,
333        PADDING_BUILTINS_STUB_LIST(DEF_STUB_ID)
334        BUILTINS_STUB_LIST(DEF_STUB_ID, DEF_STUB_ID_DYN, DEF_STUB_ID)
335        NUM_OF_BUILTINS_STUBS,
336        BUILTINS_NOSTUB_LIST(DEF_STUB_ID)
337        AOT_BUILTINS_STUB_LIST(DEF_STUB_ID)
338        AOT_BUILTINS_INLINE_LIST(DEF_STUB_ID)
339#undef DEF_STUB_ID_DYN
340#undef DEF_STUB_ID
341        BUILTINS_CONSTRUCTOR_STUB_FIRST = BooleanConstructor,
342        TYPED_BUILTINS_FIRST = JsonStringify,
343        TYPED_BUILTINS_LAST = IteratorProtoReturn,
344        INVALID = 0xFFFF,
345    };
346    static_assert(ID::NONE == 0);
347
348    static void Initialize();
349
350    static void GetCSigns(std::vector<const CallSignature*>& callSigns);
351
352    static const CallSignature *Get(size_t index)
353    {
354        ASSERT(index < NUM_OF_BUILTINS_STUBS);
355        return &callSigns_[index];
356    }
357
358    static const std::string &GetName(int index)
359    {
360        ASSERT(index < NUM_OF_BUILTINS_STUBS);
361        return callSigns_[index].GetName();
362    }
363
364    static const CallSignature* BuiltinsCSign()
365    {
366        return &builtinsCSign_;
367    }
368
369    static const CallSignature* BuiltinsWithArgvCSign()
370    {
371        return &builtinsWithArgvCSign_;
372    }
373
374    static bool IsFastBuiltin(ID builtinId)
375    {
376        return builtinId > NONE && builtinId < NUM_OF_BUILTINS_STUBS;
377    }
378
379    static bool IsTypedBuiltin(ID builtinId)
380    {
381        return (BuiltinsStubCSigns::ID::StringLocaleCompare == builtinId) ||
382               (BuiltinsStubCSigns::ID::StringIteratorProtoNext == builtinId) ||
383               (BuiltinsStubCSigns::ID::ArraySort == builtinId) ||
384               (BuiltinsStubCSigns::ID::GlobalDecodeURIComponent == builtinId) ||
385               ((BuiltinsStubCSigns::ID::TYPED_BUILTINS_FIRST <= builtinId) &&
386               (builtinId <= BuiltinsStubCSigns::ID::TYPED_BUILTINS_LAST));
387    }
388
389    static bool IsTypedInlineBuiltin(ID builtinId)
390    {
391        if (TYPED_BUILTINS_INLINE_FIRST <= builtinId && builtinId <= TYPED_BUILTINS_INLINE_LAST) {
392            return true;
393        }
394        if (BuiltinsStubCSigns::ID::DataViewSetInt32 <= builtinId &&
395            builtinId <= BuiltinsStubCSigns::ID::DataViewSetFloat64) {
396            return true;
397        }
398        // NOTE(schernykh): try to remove this switch and move StringFromCharCode to TYPED_BUILTINS_INLINE list
399        switch (builtinId) {
400            case BuiltinsStubCSigns::ID::ArraySort:
401            case BuiltinsStubCSigns::ID::StringFromCharCode:
402            case BuiltinsStubCSigns::ID::StringCharCodeAt:
403            case BuiltinsStubCSigns::ID::StringSubstring:
404            case BuiltinsStubCSigns::ID::StringSubStr:
405            case BuiltinsStubCSigns::ID::StringSlice:
406            case BuiltinsStubCSigns::ID::MapGet:
407            case BuiltinsStubCSigns::ID::MapHas:
408            case BuiltinsStubCSigns::ID::MapKeys:
409            case BuiltinsStubCSigns::ID::MapValues:
410            case BuiltinsStubCSigns::ID::MapEntries:
411            case BuiltinsStubCSigns::ID::SetHas:
412            case BuiltinsStubCSigns::ID::MapDelete:
413            case BuiltinsStubCSigns::ID::SetDelete:
414            case BuiltinsStubCSigns::ID::TypedArrayEntries:
415            case BuiltinsStubCSigns::ID::TypedArrayKeys:
416            case BuiltinsStubCSigns::ID::TypedArrayValues:
417            case BuiltinsStubCSigns::ID::SetValues:
418            case BuiltinsStubCSigns::ID::SetEntries:
419            case BuiltinsStubCSigns::ID::MapClear:
420            case BuiltinsStubCSigns::ID::SetClear:
421            case BuiltinsStubCSigns::ID::SetAdd:
422            case BuiltinsStubCSigns::ID::NumberParseFloat:
423            case BuiltinsStubCSigns::ID::NumberParseInt:
424            case BuiltinsStubCSigns::ID::NumberIsFinite:
425            case BuiltinsStubCSigns::ID::NumberIsNaN:
426            case BuiltinsStubCSigns::ID::NumberIsInteger:
427            case BuiltinsStubCSigns::ID::NumberIsSafeInteger:
428            case BuiltinsStubCSigns::ID::ObjectIs:
429            case BuiltinsStubCSigns::ID::ObjectGetPrototypeOf:
430            case BuiltinsStubCSigns::ID::ObjectGetProto:
431            case BuiltinsStubCSigns::ID::ObjectCreate:
432            case BuiltinsStubCSigns::ID::ObjectIsPrototypeOf:
433            case BuiltinsStubCSigns::ID::ObjectHasOwnProperty:
434            case BuiltinsStubCSigns::ID::ReflectGetPrototypeOf:
435            case BuiltinsStubCSigns::ID::ReflectGet:
436            case BuiltinsStubCSigns::ID::ReflectHas:
437            case BuiltinsStubCSigns::ID::ReflectConstruct:
438            case BuiltinsStubCSigns::ID::ReflectApply:
439            case BuiltinsStubCSigns::ID::FunctionPrototypeApply:
440            case BuiltinsStubCSigns::ID::FunctionPrototypeBind:
441            case BuiltinsStubCSigns::ID::FunctionPrototypeCall:
442            case BuiltinsStubCSigns::ID::FunctionPrototypeHasInstance:
443            case BuiltinsStubCSigns::ID::ArrayIndexOf:
444            case BuiltinsStubCSigns::ID::ArrayIncludes:
445            case BuiltinsStubCSigns::ID::ArrayValues:
446            case BuiltinsStubCSigns::ID::ArrayForEach:
447            case BuiltinsStubCSigns::ID::ArrayFind:
448            case BuiltinsStubCSigns::ID::ArrayFindIndex:
449            case BuiltinsStubCSigns::ID::ArrayFilter:
450            case BuiltinsStubCSigns::ID::ArrayMap:
451            case BuiltinsStubCSigns::ID::ArraySome:
452            case BuiltinsStubCSigns::ID::ArrayEvery:
453            case BuiltinsStubCSigns::ID::ArrayPop:
454            case BuiltinsStubCSigns::ID::ArraySlice:
455                return true;
456            default:
457                return false;
458        }
459        return false;
460    }
461
462    static bool IsTypedBuiltinNumber(ID builtinId)
463    {
464        return BuiltinsStubCSigns::ID::NumberConstructor == builtinId;
465    }
466
467    static bool IsTypedBuiltinGlobal(ID builtinId)
468    {
469        return BuiltinsStubCSigns::ID::GlobalDecodeURIComponent == builtinId;
470    }
471
472    static bool IsTypedBuiltinCallThis0(ID builtinId)
473    {
474        switch (builtinId) {
475            case BuiltinsStubCSigns::ID::MapIteratorProtoNext:
476            case BuiltinsStubCSigns::ID::SetIteratorProtoNext:
477            case BuiltinsStubCSigns::ID::StringIteratorProtoNext:
478            case BuiltinsStubCSigns::ID::ArrayIteratorProtoNext:
479            case BuiltinsStubCSigns::ID::IteratorProtoReturn:
480            case BuiltinsStubCSigns::ID::ArraySort:
481                return true;
482            default:
483                return false;
484        }
485    }
486
487    static bool IsTypedBuiltinCallThis1(ID builtinId)
488    {
489        switch (builtinId) {
490            case BuiltinsStubCSigns::ID::JsonStringify:
491            case BuiltinsStubCSigns::ID::StringLocaleCompare:
492                return true;
493            default:
494                return false;
495        }
496    }
497
498    static bool IsTypedBuiltinCallThis3(ID builtinId)
499    {
500        switch (builtinId) {
501            case BuiltinsStubCSigns::ID::StringLocaleCompare:
502                return true;
503            default:
504                return false;
505        }
506    }
507
508    static ConstantIndex GetConstantIndex(ID builtinId)
509    {
510        switch (builtinId) {
511            case BuiltinsStubCSigns::ID::MathAcos:
512                return ConstantIndex::MATH_ACOS_INDEX;
513            case BuiltinsStubCSigns::ID::MathAcosh:
514                return ConstantIndex::MATH_ACOSH_INDEX;
515            case BuiltinsStubCSigns::ID::MathAsin:
516                return ConstantIndex::MATH_ASIN_INDEX;
517            case BuiltinsStubCSigns::ID::MathAsinh:
518                return ConstantIndex::MATH_ASINH_INDEX;
519            case BuiltinsStubCSigns::ID::MathAtan:
520                return ConstantIndex::MATH_ATAN_INDEX;
521            case BuiltinsStubCSigns::ID::MathAtan2:
522                return ConstantIndex::MATH_ATAN2_INDEX;
523            case BuiltinsStubCSigns::ID::MathAtanh:
524                return ConstantIndex::MATH_ATANH_INDEX;
525            case BuiltinsStubCSigns::ID::MathCos:
526                return ConstantIndex::MATH_COS_INDEX;
527            case BuiltinsStubCSigns::ID::MathCosh:
528                return ConstantIndex::MATH_COSH_INDEX;
529            case BuiltinsStubCSigns::ID::MathSign:
530                return ConstantIndex::MATH_SIGN_INDEX;
531            case BuiltinsStubCSigns::ID::MathSin:
532                return ConstantIndex::MATH_SIN_INDEX;
533            case BuiltinsStubCSigns::ID::MathSinh:
534                return ConstantIndex::MATH_SINH_INDEX;
535            case BuiltinsStubCSigns::ID::MathTan:
536                return ConstantIndex::MATH_TAN_INDEX;
537            case BuiltinsStubCSigns::ID::MathTanh:
538                return ConstantIndex::MATH_TANH_INDEX;
539            case BuiltinsStubCSigns::ID::MathAbs:
540                return ConstantIndex::MATH_ABS_INDEX;
541            case BuiltinsStubCSigns::ID::MathLog:
542                return ConstantIndex::MATH_LOG_INDEX;
543            case BuiltinsStubCSigns::ID::MathLog2:
544                return ConstantIndex::MATH_LOG2_INDEX;
545            case BuiltinsStubCSigns::ID::MathLog10:
546                return ConstantIndex::MATH_LOG10_INDEX;
547            case BuiltinsStubCSigns::ID::MathLog1p:
548                return ConstantIndex::MATH_LOG1P_INDEX;
549            case BuiltinsStubCSigns::ID::MathExp:
550                return ConstantIndex::MATH_EXP_INDEX;
551            case BuiltinsStubCSigns::ID::MathExpm1:
552                return ConstantIndex::MATH_EXPM1_INDEX;
553            case BuiltinsStubCSigns::ID::MathClz32:
554                return ConstantIndex::MATH_CLZ32_INDEX;
555            case BuiltinsStubCSigns::ID::MathPow:
556                return ConstantIndex::MATH_POW_INDEX;
557            case BuiltinsStubCSigns::ID::MathCbrt:
558                return ConstantIndex::MATH_CBRT_INDEX;
559            case BuiltinsStubCSigns::ID::MathTrunc:
560                return ConstantIndex::MATH_TRUNC_INDEX;
561            case BuiltinsStubCSigns::ID::MathCeil:
562                return ConstantIndex::MATH_CEIL_INDEX;
563            case BuiltinsStubCSigns::ID::MathFloor:
564                return ConstantIndex::MATH_FLOOR_INDEX;
565            case BuiltinsStubCSigns::ID::MathMin:
566                return ConstantIndex::MATH_MIN_INDEX;
567            case BuiltinsStubCSigns::ID::MathMax:
568                return ConstantIndex::MATH_MAX_INDEX;
569            case BuiltinsStubCSigns::ID::MathSqrt:
570                return ConstantIndex::MATH_SQRT_INDEX;
571            case BuiltinsStubCSigns::ID::MathRound:
572                return ConstantIndex::MATH_ROUND_INDEX;
573            case BuiltinsStubCSigns::ID::MathFRound:
574                return ConstantIndex::MATH_FROUND_INDEX;
575            case BuiltinsStubCSigns::ID::MathImul:
576                return ConstantIndex::MATH_IMUL_INDEX;
577            case BuiltinsStubCSigns::ID::MapGet:
578                return ConstantIndex::MAP_GET_INDEX;
579            case BuiltinsStubCSigns::ID::MapHas:
580                return ConstantIndex::MAP_HAS_INDEX;
581            case BuiltinsStubCSigns::ID::MapKeys:
582                return ConstantIndex::MAP_KEYS_INDEX;
583            case BuiltinsStubCSigns::ID::MapValues:
584                return ConstantIndex::MAP_VALUES_INDEX;
585            case BuiltinsStubCSigns::ID::MapEntries:
586                return ConstantIndex::MAP_ENTRIES_INDEX;
587            case BuiltinsStubCSigns::ID::SetHas:
588                return ConstantIndex::SET_HAS_INDEX;
589            case BuiltinsStubCSigns::ID::MapDelete:
590                return ConstantIndex::MAP_DELETE_INDEX;
591            case BuiltinsStubCSigns::ID::SetDelete:
592                return ConstantIndex::SET_DELETE_INDEX;
593            case BuiltinsStubCSigns::ID::SetValues:
594                return ConstantIndex::SET_VALUES_INDEX;
595            case BuiltinsStubCSigns::ID::SetEntries:
596                return ConstantIndex::SET_ENTRIES_INDEX;
597            case BuiltinsStubCSigns::ID::MapClear:
598                return ConstantIndex::MAP_CLEAR_INDEX;
599            case BuiltinsStubCSigns::ID::SetClear:
600                return ConstantIndex::SET_CLEAR_INDEX;
601            case BuiltinsStubCSigns::ID::SetAdd:
602                return ConstantIndex::SET_ADD_INDEX;
603            case BuiltinsStubCSigns::ID::StringLocaleCompare:
604                return ConstantIndex::LOCALE_COMPARE_FUNCTION_INDEX;
605            case BuiltinsStubCSigns::ID::StringCharCodeAt:
606                return ConstantIndex::STRING_CHAR_CODE_AT_INDEX;
607            case BuiltinsStubCSigns::ID::StringSubstring:
608                return ConstantIndex::STRING_SUB_STRING_INDEX;
609            case BuiltinsStubCSigns::ID::StringSubStr:
610                return ConstantIndex::STRING_SUB_STR_INDEX;
611            case BuiltinsStubCSigns::ID::StringSlice:
612                return ConstantIndex::STRING_SLICE_INDEX;
613            case BuiltinsStubCSigns::ID::ArraySort:
614                return ConstantIndex::ARRAY_SORT_FUNCTION_INDEX;
615            case BuiltinsStubCSigns::ID::JsonStringify:
616                return ConstantIndex::JSON_STRINGIFY_FUNCTION_INDEX;
617            case BuiltinsStubCSigns::ID::MapIteratorProtoNext:
618                return ConstantIndex::MAP_ITERATOR_PROTO_NEXT_INDEX;
619            case BuiltinsStubCSigns::ID::SetIteratorProtoNext:
620                return ConstantIndex::SET_ITERATOR_PROTO_NEXT_INDEX;
621            case BuiltinsStubCSigns::ID::StringIteratorProtoNext:
622                return ConstantIndex::STRING_ITERATOR_PROTO_NEXT_INDEX;
623            case BuiltinsStubCSigns::ID::ArrayIteratorProtoNext:
624                return ConstantIndex::ARRAY_ITERATOR_PROTO_NEXT_INDEX;
625            case BuiltinsStubCSigns::ID::IteratorProtoReturn:
626                return ConstantIndex::ITERATOR_PROTO_RETURN_INDEX;
627            case BuiltinsStubCSigns::ID::StringFromCharCode:
628                return ConstantIndex::STRING_FROM_CHAR_CODE_INDEX;
629            case BuiltinsStubCSigns::ID::DateGetTime:
630                return ConstantIndex::DATE_GET_TIME_INDEX;
631            case BuiltinsStubCSigns::ID::DateNow:
632                return ConstantIndex::DATE_NOW_INDEX;
633            case BuiltinsStubCSigns::ID::TypedArrayEntries:
634                return ConstantIndex::TYPED_ARRAY_ENTRIES_INDEX;
635            case BuiltinsStubCSigns::ID::TypedArrayKeys:
636                return ConstantIndex::TYPED_ARRAY_KEYS_INDEX;
637            case BuiltinsStubCSigns::ID::TypedArrayValues:
638                return ConstantIndex::TYPED_ARRAY_VALUES_INDEX;
639            case BuiltinsStubCSigns::ID::GlobalIsFinite:
640                return ConstantIndex::GLOBAL_IS_FINITE_INDEX;
641            case BuiltinsStubCSigns::ID::GlobalIsNan:
642                return ConstantIndex::GLOBAL_IS_NAN_INDEX;
643            case BuiltinsStubCSigns::ID::ArrayBufferIsView:
644                return ConstantIndex::ARRAY_BUFFER_IS_VIEW_INDEX;
645            case BuiltinsStubCSigns::ID::DataViewGetFloat32:
646                return ConstantIndex::DATA_VIEW_GET_FLOAT32_INDEX;
647            case BuiltinsStubCSigns::ID::DataViewGetFloat64:
648                return ConstantIndex::DATA_VIEW_GET_FLOAT64_INDEX;
649            case BuiltinsStubCSigns::ID::DataViewGetInt8:
650                return ConstantIndex::DATA_VIEW_GET_INT8_INDEX;
651            case BuiltinsStubCSigns::ID::DataViewGetInt16:
652                return ConstantIndex::DATA_VIEW_GET_INT16_INDEX;
653            case BuiltinsStubCSigns::ID::DataViewGetInt32:
654                return ConstantIndex::DATA_VIEW_GET_INT32_INDEX;
655            case BuiltinsStubCSigns::ID::DataViewGetUint16:
656                return ConstantIndex::DATA_VIEW_GET_UINT16_INDEX;
657            case BuiltinsStubCSigns::ID::DataViewGetUint32:
658                return ConstantIndex::DATA_VIEW_GET_UINT32_INDEX;
659            case BuiltinsStubCSigns::ID::DataViewGetUint8:
660                return ConstantIndex::DATA_VIEW_GET_UINT8_INDEX;
661            case BuiltinsStubCSigns::ID::DataViewSetFloat32:
662                return ConstantIndex::DATA_VIEW_SET_FLOAT32_INDEX;
663            case BuiltinsStubCSigns::ID::DataViewSetFloat64:
664                return ConstantIndex::DATA_VIEW_SET_FLOAT64_INDEX;
665            case BuiltinsStubCSigns::ID::DataViewSetInt8:
666                return ConstantIndex::DATA_VIEW_SET_INT8_INDEX;
667            case BuiltinsStubCSigns::ID::DataViewSetInt16:
668                return ConstantIndex::DATA_VIEW_SET_INT16_INDEX;
669            case BuiltinsStubCSigns::ID::DataViewSetInt32:
670                return ConstantIndex::DATA_VIEW_SET_INT32_INDEX;
671            case BuiltinsStubCSigns::ID::DataViewSetUint8:
672                return ConstantIndex::DATA_VIEW_SET_UINT8_INDEX;
673            case BuiltinsStubCSigns::ID::DataViewSetUint16:
674                return ConstantIndex::DATA_VIEW_SET_UINT16_INDEX;
675            case BuiltinsStubCSigns::ID::DataViewSetUint32:
676                return ConstantIndex::DATA_VIEW_SET_UINT32_INDEX;
677            case BuiltinsStubCSigns::ID::BigIntAsIntN:
678                return ConstantIndex::BIGINT_AS_INTN_INDEX;
679            case BuiltinsStubCSigns::ID::BigIntAsUintN:
680                return ConstantIndex::BIGINT_AS_UINTN_INDEX;
681            case BuiltinsStubCSigns::ID::NumberIsFinite:
682                return ConstantIndex::NUMBER_IS_FINITE_INDEX;
683            case BuiltinsStubCSigns::ID::NumberIsInteger:
684                return ConstantIndex::NUMBER_IS_INTEGER_INDEX;
685            case BuiltinsStubCSigns::ID::NumberIsNaN:
686                return ConstantIndex::NUMBER_IS_NAN_INDEX;
687            case BuiltinsStubCSigns::ID::NumberIsSafeInteger:
688                return ConstantIndex::NUMBER_IS_SAFEINTEGER_INDEX;
689            case BuiltinsStubCSigns::ID::NumberParseFloat:
690                return ConstantIndex::NUMBER_PARSE_FLOAT_INDEX;
691            case BuiltinsStubCSigns::ID::NumberParseInt:
692                return ConstantIndex::NUMBER_PARSE_INT_INDEX;
693            case BuiltinsStubCSigns::ID::ObjectIs:
694                return ConstantIndex::OBJECT_IS_INDEX;
695            case BuiltinsStubCSigns::ID::ObjectGetPrototypeOf:
696                return ConstantIndex::OBJECT_GET_PROTOTYPE_OF_INDEX;
697            case BuiltinsStubCSigns::ID::ObjectGetProto:
698                return ConstantIndex::OBJECT_GET_PROTO_INDEX;
699            case BuiltinsStubCSigns::ID::ObjectCreate:
700                return ConstantIndex::OBJECT_CREATE_INDEX;
701            case BuiltinsStubCSigns::ID::ObjectIsPrototypeOf:
702                return ConstantIndex::OBJECT_IS_PROTOTYPE_OF_INDEX;
703            case BuiltinsStubCSigns::ID::ObjectHasOwnProperty:
704                return ConstantIndex::OBJECT_HAS_OWN_PROPERTY_INDEX;
705            case BuiltinsStubCSigns::ID::ReflectGetPrototypeOf:
706                return ConstantIndex::REFLECT_GET_PROTOTYPE_OF_INDEX;
707            case BuiltinsStubCSigns::ID::ReflectGet:
708                return ConstantIndex::REFLECT_GET_INDEX;
709            case BuiltinsStubCSigns::ID::ReflectHas:
710                return ConstantIndex::REFLECT_HAS_INDEX;
711            case BuiltinsStubCSigns::ID::ReflectConstruct:
712                return ConstantIndex::REFLECT_CONSTRUCT_INDEX;
713            case BuiltinsStubCSigns::ID::ReflectApply:
714                return ConstantIndex::REFLECT_APPLY_INDEX;
715            case BuiltinsStubCSigns::ID::FunctionPrototypeApply:
716                return ConstantIndex::FUNCTION_PROTOTYPE_APPLY_INDEX;
717            case BuiltinsStubCSigns::ID::FunctionPrototypeBind:
718                return ConstantIndex::FUNCTION_PROTOTYPE_BIND_INDEX;
719            case BuiltinsStubCSigns::ID::FunctionPrototypeCall:
720                return ConstantIndex::FUNCTION_PROTOTYPE_CALL_INDEX;
721            case BuiltinsStubCSigns::ID::FunctionPrototypeHasInstance:
722                return ConstantIndex::FUNCTION_PROTOTYPE_HAS_INSTANCE_INDEX;
723            case BuiltinsStubCSigns::ID::ArrayIndexOf:
724                return ConstantIndex::ARRAY_INDEXOF_INDEX;
725            case BuiltinsStubCSigns::ID::ArrayIncludes:
726                return ConstantIndex::ARRAY_INCLUDES_INDEX;
727            case BuiltinsStubCSigns::ID::ArrayValues:
728                return ConstantIndex::ARRAY_VALUES_INDEX;
729            case BuiltinsStubCSigns::ID::ArrayEntries:
730                return ConstantIndex::ARRAY_ENTRIES_INDEX;
731            case BuiltinsStubCSigns::ID::ArrayKeys:
732                return ConstantIndex::ARRAY_KEYS_INDEX;
733            case BuiltinsStubCSigns::ID::ArrayForEach:
734                return ConstantIndex::ARRAY_FOREACH_INDEX;
735            case BuiltinsStubCSigns::ID::ArrayFind:
736                return ConstantIndex::ARRAY_FIND_INDEX;
737            case BuiltinsStubCSigns::ID::ArrayFindIndex:
738                return ConstantIndex::ARRAY_FINDINDEX_INDEX;
739            case BuiltinsStubCSigns::ID::ArrayFilter:
740                return ConstantIndex::ARRAY_FILTER_INDEX;
741            case BuiltinsStubCSigns::ID::ArrayMap:
742                return ConstantIndex::ARRAY_MAP_INDEX;
743            case BuiltinsStubCSigns::ID::ArraySome:
744                return ConstantIndex::ARRAY_SOME_INDEX;
745            case BuiltinsStubCSigns::ID::ArrayEvery:
746                return ConstantIndex::ARRAY_EVERY_INDEX;
747            case BuiltinsStubCSigns::ID::ArrayPop:
748                return ConstantIndex::ARRAY_POP_INDEX;
749            case BuiltinsStubCSigns::ID::ArraySlice:
750                return ConstantIndex::ARRAY_SLICE_INDEX;
751            case BuiltinsStubCSigns::ID::GlobalDecodeURIComponent:
752                return ConstantIndex::GLOBAL_DECODE_URI_COMPONENT;
753            default:
754                LOG_COMPILER(INFO) << "GetConstantIndex Invalid Id:" << builtinId;
755                return ConstantIndex::INVALID;
756        }
757    }
758
759    static bool CheckBuiltinsIdInvalid(ID builtinId)
760    {
761        auto result = kungfu::BuiltinsStubCSigns::GetConstantIndex(builtinId);
762        return result == ConstantIndex::INVALID;
763    }
764
765    static size_t GetGlobalEnvIndex(ID builtinId);
766
767    static std::string GetBuiltinName(ID id)
768    {
769        static const std::map<BuiltinsStubCSigns::ID, const std::string> builtinId2Str = {
770            {MathAcos, "Math.acos"},
771            {MathAcosh, "Math.acosh"},
772            {MathAsin, "Math.asin"},
773            {MathAsinh, "Math.asinh"},
774            {MathAtan, "Math.atan"},
775            {MathAtan2, "Math.atan2"},
776            {MathAtanh, "Math.atanh"},
777            {MathCos, "Math.cos"},
778            {MathCosh, "Math.cosh"},
779            {MathSign, "Math.sign"},
780            {MathSin, "Math.sin"},
781            {MathSinh, "Math.sinh"},
782            {MathTan, "Math.tan"},
783            {MathTanh, "Math.tanh"},
784            {MathLog, "Math.log"},
785            {MathLog2, "Math.log2"},
786            {MathLog10, "Math.log10"},
787            {MathLog1p, "Math.log1p"},
788            {MathExp, "Math.exp"},
789            {MathExpm1, "Math.expm1"},
790            {MathClz32, "Math.clz32"},
791            {MathSqrt, "Math.sqrt"},
792            {MathCbrt, "Math.cbrt"},
793            {MathAbs, "Math.abs"},
794            {MathPow, "Math.pow"},
795            {MathTrunc, "Math.trunc"},
796            {MathRound, "Math.round"},
797            {MathFRound, "Math.fround"},
798            {MathCeil, "Math.ceil"},
799            {MathFloor, "Math.floor"},
800            {MathImul, "Math.imul"},
801            {MathMax, "Math.max"},
802            {MathMin, "Math.min"},
803            {DateGetTime, "Date.prototype.getTime"},
804            {DateNow, "Date.now"},
805            {TypedArrayEntries, "TypedArray.entries"},
806            {TypedArrayKeys, "TypedArray.keys"},
807            {TypedArrayValues, "TypedArray.values"},
808            {GlobalIsFinite, "isFinite"},
809            {GlobalIsNan, "isNan"},
810            {BigIntAsIntN, "BigInt.asIntN"},
811            {BigIntAsUintN, "BigInt.asUintN"},
812            {MapGet, "Map.get"},
813            {MapHas, "Map.has"},
814            {MapKeys, "Map.keys"},
815            {MapValues, "Map.values"},
816            {MapEntries, "Map.entries"},
817            {SetValues, "Set.values"},
818            {SetEntries, "Set.entries"},
819            {SetHas, "Set.has"},
820            {MapDelete, "Map.delete"},
821            {SetDelete, "Set.delete"},
822            {MapClear, "Map.clear"},
823            {SetClear, "Set.clear"},
824            {SetAdd, "Set.add"},
825            {BigIntConstructor, "BigInt"},
826            {NumberParseFloat, "Number.parseFloat"},
827            {NumberIsInteger, "Number.isInteger"},
828            {NumberIsSafeInteger, "Number.isSafeInteger"},
829            {NumberParseInt, "Number.parseInt"},
830            {StringCharCodeAt, "String.prototype.charCodeAt"},
831            {StringSubstring, "String.prototype.substring"},
832            {StringSubStr, "String.prototype.substr"},
833            {StringSlice, "String.prototype.slice"},
834            {ObjectIs, "Object.is"},
835            {ObjectGetPrototypeOf, "Object.getPrototypeOf"},
836            {ObjectGetProto, "Object.prototype.getProto"},
837            {ObjectCreate, "Object.create"},
838            {ObjectIsPrototypeOf, "Object.prototype.isPrototypeOf"},
839            {ObjectHasOwnProperty, "Object.prototype.hasOwnProperty"},
840            {ReflectGetPrototypeOf, "Reflect.getPrototypeOf"},
841            {ReflectGet, "Reflect.get"},
842            {ReflectHas, "Reflect.has"},
843            {ReflectConstruct, "Reflect.construct"},
844            {ReflectApply, "Reflect.apply"},
845            {FunctionPrototypeApply, "Function.prototype.apply"},
846            {FunctionPrototypeBind, "Function.prototype.bind"},
847            {FunctionPrototypeCall, "Function.prototype.call"},
848            {FunctionPrototypeHasInstance, "Function.prototype.hasInstance"},
849            {ArrayIncludes, "Array.prototype.includes"},
850            {ArrayIndexOf, "Array.prototype.indexOf"},
851            {ArrayEntries, "Array.prototype.entries"},
852            {ArrayValues, "Array.prototype.values"},
853            {ArrayKeys, "Array.prototype.keys"},
854            {ArrayFind, "Array.prototype.find"},
855            {ArrayFindIndex, "Array.prototype.findIndex"},
856            {ArrayForEach, "Array.prototype.foreach"},
857            {ArrayFilter, "Array.prototype.filter"},
858            {ArraySome, "Array.prototype.some"},
859            {ArrayMap, "Array.prototype.map"},
860            {ArrayEvery, "Array.prototype.every"},
861            {ArrayPop, "Array.prototype.pop"},
862            {ArraySlice, "Array.prototype.slice"},
863            {DataViewGetInt8, "DataView.prototype.GetInt8"},
864            {DataViewGetUint8, "DataView.prototype.GetUint8"},
865            {DataViewGetInt16, "DataView.prototype.GetInt16"},
866            {DataViewGetUint16, "DataView.prototype.GetUint16"},
867            {DataViewGetInt32, "DataView.prototype.GetInt32"},
868            {DataViewGetUint32, "DataView.prototype.GetUint32"},
869            {DataViewGetFloat32, "DataView.prototype.GetFloat32"},
870            {DataViewGetFloat64, "DataView.prototype.GetFloat64"},
871            {DataViewSetInt8, "DataView.prototype.SetInt8"},
872            {DataViewSetUint8, "DataView.prototype.SetUint8"},
873            {DataViewSetInt16, "DataView.prototype.SetInt16"},
874            {DataViewSetUint16, "DataView.prototype.SetUint16"},
875            {DataViewSetInt32, "DataView.prototype.SetInt32"},
876            {DataViewSetUint32, "DataView.prototype.SetUint32"},
877            {DataViewSetFloat32, "DataView.prototype.SetFloat32"},
878            {DataViewSetFloat64, "DataView.prototype.SetFloat64"},
879        };
880        if (builtinId2Str.count(id) > 0) {
881            return builtinId2Str.at(id);
882        }
883        return "";
884    }
885
886    static ID GetBuiltinId(std::string idStr)
887    {
888        static const std::map<const std::string, BuiltinsStubCSigns::ID> str2BuiltinId = {
889            {"acos", MathAcos},
890            {"acosh", MathAcosh},
891            {"asin", MathAsin},
892            {"asinh", MathAsinh},
893            {"atan", MathAtan},
894            {"atan2", MathAtan2},
895            {"atanh", MathAtanh},
896            {"cos", MathCos},
897            {"cosh", MathCosh},
898            {"sign", MathSign},
899            {"sin", MathSin},
900            {"sinh", MathSinh},
901            {"tan", MathTan},
902            {"tanh", MathTanh},
903            {"log", MathLog},
904            {"log2", MathLog2},
905            {"log10", MathLog10},
906            {"log1p", MathLog1p},
907            {"exp", MathExp},
908            {"expm1", MathExpm1},
909            {"clz32", MathClz32},
910            {"sqrt", MathSqrt},
911            {"cbrt", MathCbrt},
912            {"abs", MathAbs},
913            {"pow", MathPow},
914            {"trunc", MathTrunc},
915            {"round", MathRound},
916            {"fround", MathFRound},
917            {"ceil", MathCeil},
918            {"floor", MathFloor},
919            {"imul", MathImul},
920            {"max", MathMax},
921            {"min", MathMin},
922            {"localeCompare", StringLocaleCompare},
923            {"next", StringIteratorProtoNext},
924            {"sort", ArraySort},
925            {"stringify", JsonStringify},
926            {"getTime", DateGetTime},
927            {"now", DateNow},
928            {"isFinite", GlobalIsFinite},
929            {"isNan", GlobalIsNan},
930            {"asIntN", BigIntAsIntN},
931            {"asUintN", BigIntAsUintN},
932            {"mapDelete", MapDelete},
933            {"setDelete", SetDelete},
934            {"BigInt", BigIntConstructor},
935            {"charCodeAt", StringCharCodeAt},
936            {"substring", StringSubstring},
937            {"substr", StringSubStr},
938            {"slice", StringSlice},
939            {"is", ObjectIs},
940            {"getPrototypeOf", ObjectGetPrototypeOf},
941            {"create", ObjectCreate},
942            {"isPrototypeOf", ObjectIsPrototypeOf},
943            {"hasOwnProperty", ObjectHasOwnProperty},
944            {"reflectGetPrototypeOf", ReflectGetPrototypeOf},
945            {"get", ReflectGet},
946            {"has", ReflectHas},
947            {"construct", ReflectConstruct},
948            {"ReflectApply", ReflectApply},
949            {"apply", FunctionPrototypeApply},
950            {"bind", FunctionPrototypeBind},
951            {"call", FunctionPrototypeCall},
952            {"hasInstance", FunctionPrototypeHasInstance},
953            {"includes", ArrayIncludes},
954            {"indexOf", ArrayIndexOf},
955            {"entries", ArrayEntries},
956            {"values", ArrayValues},
957            {"keys", ArrayKeys},
958            {"find", ArrayFind},
959            {"findIndex", ArrayFindIndex},
960            {"foreach", ArrayForEach},
961            {"filter", ArrayFilter},
962            {"some", ArraySome},
963            {"map", ArrayMap},
964            {"every", ArrayEvery},
965            {"pop", ArrayPop},
966            {"slice", ArraySlice},
967            {"getUint8", DataViewGetUint8},
968            {"getInt8", DataViewGetInt8},
969            {"getUint16", DataViewGetUint16},
970            {"getInt16", DataViewGetInt16},
971            {"getUint32", DataViewGetUint32},
972            {"getInt32", DataViewGetInt32},
973            {"getFloat32", DataViewGetFloat32},
974            {"getFloat64", DataViewGetFloat64},
975            {"setUint8", DataViewSetUint8},
976            {"setInt8", DataViewSetInt8},
977            {"setUint16", DataViewSetUint16},
978            {"setInt16", DataViewSetInt16},
979            {"setUint32", DataViewSetUint32},
980            {"setInt32", DataViewSetInt32},
981            {"setFloat32", DataViewSetFloat32},
982            {"setFloat64", DataViewSetFloat64},
983        };
984        if (str2BuiltinId.count(idStr) > 0) {
985            return str2BuiltinId.at(idStr);
986        }
987        return NONE;
988    }
989
990private:
991    static CallSignature callSigns_[NUM_OF_BUILTINS_STUBS];
992    static CallSignature builtinsCSign_;
993    static CallSignature builtinsWithArgvCSign_;
994};
995
996enum class BuiltinsArgs : size_t {
997    GLUE = 0,
998    NATIVECODE,
999    FUNC,
1000    NEWTARGET,
1001    THISVALUE,
1002    NUMARGS,
1003    ARG0_OR_ARGV,
1004    ARG1,
1005    ARG2,
1006    NUM_OF_INPUTS,
1007};
1008
1009#define BUILTINS_STUB_ID(name) kungfu::BuiltinsStubCSigns::name
1010// to distinguish with the positive method offset of js function
1011#define PGO_BUILTINS_STUB_ID(name) ((-1) * kungfu::BuiltinsStubCSigns::name)
1012#define IS_TYPED_BUILTINS_ID(id) kungfu::BuiltinsStubCSigns::IsTypedBuiltin(id)
1013#define IS_TYPED_INLINE_BUILTINS_ID(id) kungfu::BuiltinsStubCSigns::IsTypedInlineBuiltin(id)
1014#define IS_TYPED_BUILTINS_NUMBER_ID(id) kungfu::BuiltinsStubCSigns::IsTypedBuiltinNumber(id)
1015#define IS_TYPED_BUILTINS_GLOBAL_ID(id) kungfu::BuiltinsStubCSigns::IsTypedBuiltinGlobal(id)
1016#define IS_TYPED_BUILTINS_ID_CALL_THIS0(id) kungfu::BuiltinsStubCSigns::IsTypedBuiltinCallThis0(id)
1017#define IS_TYPED_BUILTINS_ID_CALL_THIS1(id) kungfu::BuiltinsStubCSigns::IsTypedBuiltinCallThis1(id)
1018#define IS_TYPED_BUILTINS_ID_CALL_THIS3(id) kungfu::BuiltinsStubCSigns::IsTypedBuiltinCallThis3(id)
1019#define GET_TYPED_CONSTANT_INDEX(id) kungfu::BuiltinsStubCSigns::GetConstantIndex(id)
1020#define IS_INVALID_ID(id) kungfu::BuiltinsStubCSigns::CheckBuiltinsIdInvalid(id)
1021#define GET_TYPED_GLOBAL_ENV_INDEX(id) kungfu::BuiltinsStubCSigns::GetGlobalEnvIndex(id)
1022}  // namespace panda::ecmascript::kungfu
1023#endif  // ECMASCRIPT_COMPILER_BUILTINS_CALL_SIGNATURE_H
1024