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