• 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/compiler/builtins/builtins_call_signature_list.h"
20 #include "ecmascript/base/config.h"
21 #include "ecmascript/compiler/call_signature.h"
22 #include "ecmascript/global_env_constants.h"
23 
24 namespace panda::ecmascript::kungfu {
25 
26 class BuiltinsStubCSigns {
27 public:
28     enum ID {
29 #define DEF_STUB_ID(name) name,
30 #define DEF_STUB_ID_DYN(name, type, ...) type##name,
31         PADDING_BUILTINS_STUB_LIST(DEF_STUB_ID)
32         BUILTINS_STUB_LIST(DEF_STUB_ID, DEF_STUB_ID_DYN, DEF_STUB_ID)
33         NUM_OF_BUILTINS_STUBS,
34         BUILTINS_NOSTUB_LIST(DEF_STUB_ID)
35         AOT_BUILTINS_STUB_LIST(DEF_STUB_ID)
36         AOT_BUILTINS_INLINE_LIST(DEF_STUB_ID)
37 #undef DEF_STUB_ID_DYN
38 #undef DEF_STUB_ID
39         NUM_OF_BUILTINS_ID,
40         BUILTINS_CONSTRUCTOR_STUB_FIRST = BooleanConstructor,
41         TYPED_BUILTINS_FIRST = JsonStringify,
42         TYPED_BUILTINS_LAST = IteratorProtoReturn,
43         INVALID = 0xFFFF,
44     };
45     static_assert(ID::NONE == 0);
46 
47     static void Initialize();
48 
49     static void GetCSigns(std::vector<const CallSignature*>& callSigns);
50 
Get(size_t index)51     static const CallSignature *Get(size_t index)
52     {
53         ASSERT(index < NUM_OF_BUILTINS_STUBS);
54         return &callSigns_[index];
55     }
56 
GetName(int index)57     static const std::string &GetName(int index)
58     {
59         ASSERT(index < NUM_OF_BUILTINS_STUBS);
60         return callSigns_[index].GetName();
61     }
62 
BuiltinsCSign()63     static const CallSignature* BuiltinsCSign()
64     {
65         return &builtinsCSign_;
66     }
67 
BuiltinsWithArgvCSign()68     static const CallSignature* BuiltinsWithArgvCSign()
69     {
70         return &builtinsWithArgvCSign_;
71     }
72 
IsFastBuiltin(ID builtinId)73     static bool IsFastBuiltin(ID builtinId)
74     {
75         return builtinId > NONE && builtinId < NUM_OF_BUILTINS_STUBS;
76     }
77 
IsTypedBuiltin(ID builtinId)78     static bool IsTypedBuiltin(ID builtinId)
79     {
80         return (BuiltinsStubCSigns::ID::StringLocaleCompare == builtinId) ||
81                (BuiltinsStubCSigns::ID::StringIteratorProtoNext == builtinId) ||
82                (BuiltinsStubCSigns::ID::ArrayIteratorProtoNext == builtinId) ||
83                (BuiltinsStubCSigns::ID::MapIteratorProtoNext == builtinId) ||
84                (BuiltinsStubCSigns::ID::SetIteratorProtoNext == builtinId) ||
85                (BuiltinsStubCSigns::ID::ArraySort == builtinId) ||
86                (BuiltinsStubCSigns::ID::ArrayConcat == builtinId) ||
87                (BuiltinsStubCSigns::ID::GlobalDecodeURIComponent == builtinId) ||
88                ((BuiltinsStubCSigns::ID::TYPED_BUILTINS_FIRST <= builtinId) &&
89                (builtinId <= BuiltinsStubCSigns::ID::TYPED_BUILTINS_LAST)) ||
90                IsAOTCallThisBuiltin(builtinId);
91     }
92 
IsAOTCallThisBuiltin(ID builtinId)93     static bool IsAOTCallThisBuiltin([[maybe_unused]]ID builtinId)
94     {
95 #define BUILTINS_ID(METHOD, OBJECT, ...)  OBJECT##METHOD,
96         static std::unordered_set<BuiltinsStubCSigns::ID> callThisBuiltinsIds = {
97             BUILTINS_METHOD_STUB_LIST(BUILTINS_ID, BUILTINS_ID, BUILTINS_ID, BUILTINS_ID)
98         };
99 #undef BUILTINS_ID
100 #if ENABLE_NEXT_OPTIMIZATION
101         return callThisBuiltinsIds.count(builtinId);
102 #else
103         return false;
104 #endif
105     }
106 
IsTypedInlineBuiltin(ID builtinId)107     static bool IsTypedInlineBuiltin(ID builtinId)
108     {
109         if (TYPED_BUILTINS_INLINE_FIRST <= builtinId && builtinId <= TYPED_BUILTINS_INLINE_LAST) {
110             return true;
111         }
112         if (BuiltinsStubCSigns::ID::DataViewSetInt32 <= builtinId &&
113             builtinId <= BuiltinsStubCSigns::ID::DataViewSetFloat64) {
114             return true;
115         }
116         // NOTE(schernykh): try to remove this switch and move StringFromCharCode to TYPED_BUILTINS_INLINE list
117         switch (builtinId) {
118             case BuiltinsStubCSigns::ID::ArraySort:
119             case BuiltinsStubCSigns::ID::StringFromCharCode:
120             case BuiltinsStubCSigns::ID::StringCharCodeAt:
121             case BuiltinsStubCSigns::ID::StringSubstring:
122             case BuiltinsStubCSigns::ID::StringSubStr:
123             case BuiltinsStubCSigns::ID::StringSlice:
124             case BuiltinsStubCSigns::ID::MapGet:
125             case BuiltinsStubCSigns::ID::MapHas:
126             case BuiltinsStubCSigns::ID::MapKeys:
127             case BuiltinsStubCSigns::ID::MapValues:
128             case BuiltinsStubCSigns::ID::MapEntries:
129             case BuiltinsStubCSigns::ID::SetHas:
130             case BuiltinsStubCSigns::ID::MapDelete:
131             case BuiltinsStubCSigns::ID::SetDelete:
132             case BuiltinsStubCSigns::ID::TypedArrayEntries:
133             case BuiltinsStubCSigns::ID::TypedArrayKeys:
134             case BuiltinsStubCSigns::ID::TypedArrayValues:
135             case BuiltinsStubCSigns::ID::SetValues:
136             case BuiltinsStubCSigns::ID::SetEntries:
137             case BuiltinsStubCSigns::ID::MapClear:
138             case BuiltinsStubCSigns::ID::SetClear:
139             case BuiltinsStubCSigns::ID::SetAdd:
140             case BuiltinsStubCSigns::ID::NumberParseFloat:
141             case BuiltinsStubCSigns::ID::NumberParseInt:
142             case BuiltinsStubCSigns::ID::NumberIsFinite:
143             case BuiltinsStubCSigns::ID::NumberIsNaN:
144             case BuiltinsStubCSigns::ID::NumberIsInteger:
145             case BuiltinsStubCSigns::ID::NumberIsSafeInteger:
146             case BuiltinsStubCSigns::ID::ObjectIs:
147             case BuiltinsStubCSigns::ID::ObjectGetPrototypeOf:
148             case BuiltinsStubCSigns::ID::ObjectGetProto:
149             case BuiltinsStubCSigns::ID::ObjectCreate:
150             case BuiltinsStubCSigns::ID::ObjectIsPrototypeOf:
151             case BuiltinsStubCSigns::ID::ObjectHasOwnProperty:
152             case BuiltinsStubCSigns::ID::ReflectGetPrototypeOf:
153             case BuiltinsStubCSigns::ID::ReflectGet:
154             case BuiltinsStubCSigns::ID::ReflectHas:
155             case BuiltinsStubCSigns::ID::ReflectConstruct:
156             case BuiltinsStubCSigns::ID::ReflectApply:
157             case BuiltinsStubCSigns::ID::FunctionPrototypeApply:
158             case BuiltinsStubCSigns::ID::FunctionPrototypeBind:
159             case BuiltinsStubCSigns::ID::FunctionPrototypeCall:
160             case BuiltinsStubCSigns::ID::FunctionPrototypeHasInstance:
161             case BuiltinsStubCSigns::ID::ArrayIndexOf:
162             case BuiltinsStubCSigns::ID::ArrayIncludes:
163             case BuiltinsStubCSigns::ID::ArrayValues:
164             case BuiltinsStubCSigns::ID::ArrayForEach:
165             case BuiltinsStubCSigns::ID::ArrayFind:
166             case BuiltinsStubCSigns::ID::ArrayFindIndex:
167             case BuiltinsStubCSigns::ID::ArrayFilter:
168             case BuiltinsStubCSigns::ID::ArrayMap:
169             case BuiltinsStubCSigns::ID::ArraySome:
170             case BuiltinsStubCSigns::ID::ArrayEvery:
171             case BuiltinsStubCSigns::ID::ArrayPop:
172             case BuiltinsStubCSigns::ID::ArraySlice:
173             case BuiltinsStubCSigns::ID::ArrayPush:
174                 return true;
175             default:
176                 return false;
177         }
178         return false;
179     }
180 
IsTypedBuiltinNumber(ID builtinId)181     static bool IsTypedBuiltinNumber(ID builtinId)
182     {
183         return BuiltinsStubCSigns::ID::NumberConstructor == builtinId;
184     }
185 
IsTypedBuiltinGlobal(ID builtinId)186     static bool IsTypedBuiltinGlobal(ID builtinId)
187     {
188         return BuiltinsStubCSigns::ID::GlobalDecodeURIComponent == builtinId;
189     }
190 
IsTypedBuiltinCallThis0(ID builtinId)191     static bool IsTypedBuiltinCallThis0(ID builtinId)
192     {
193         switch (builtinId) {
194             case BuiltinsStubCSigns::ID::MapIteratorProtoNext:
195             case BuiltinsStubCSigns::ID::SetIteratorProtoNext:
196             case BuiltinsStubCSigns::ID::StringIteratorProtoNext:
197             case BuiltinsStubCSigns::ID::ArrayIteratorProtoNext:
198             case BuiltinsStubCSigns::ID::IteratorProtoReturn:
199             case BuiltinsStubCSigns::ID::ArrayConcat:
200             case BuiltinsStubCSigns::ID::ArraySort:
201                 return true;
202             default:
203                 return IsAOTCallThisBuiltin(builtinId);
204         }
205     }
206 
IsTypedBuiltinCallThis1(ID builtinId)207     static bool IsTypedBuiltinCallThis1(ID builtinId)
208     {
209         switch (builtinId) {
210             case BuiltinsStubCSigns::ID::ArrayConcat:
211             case BuiltinsStubCSigns::ID::JsonStringify:
212             case BuiltinsStubCSigns::ID::StringLocaleCompare:
213                 return true;
214             default:
215                 return IsAOTCallThisBuiltin(builtinId);
216         }
217     }
218 
IsTypedBuiltinCallThis2(ID builtinId)219     static bool IsTypedBuiltinCallThis2(ID builtinId)
220     {
221         return IsAOTCallThisBuiltin(builtinId);
222     }
223 
IsTypedBuiltinCallThis3(ID builtinId)224     static bool IsTypedBuiltinCallThis3(ID builtinId)
225     {
226         switch (builtinId) {
227             case BuiltinsStubCSigns::ID::StringLocaleCompare:
228                 return true;
229             default:
230                 return IsAOTCallThisBuiltin(builtinId);
231         }
232     }
233 
IsSideEffectBuiltin(ID builtinId)234     static bool IsSideEffectBuiltin(ID builtinId)
235     {
236         switch (builtinId) {
237             case BuiltinsStubCSigns::ID::StringLocaleCompare:
238                 return false;
239             default:
240                 return true;
241         }
242     }
243 
GetConstantIndex(ID builtinId)244     static ConstantIndex GetConstantIndex(ID builtinId)
245     {
246 #define ID_TO_IDX4(Method, Object, Unused, Index)                                            \
247         {BuiltinsStubCSigns::ID::Object##Method, ConstantIndex::Index##_INDEX},
248 #define ID_TO_IDX6(Method, Object, Unused1, Unused2, Unused3, Index)                         \
249         {BuiltinsStubCSigns::ID::Object##Method, ConstantIndex::Index##_INDEX},
250         static std::unordered_map<BuiltinsStubCSigns::ID, ConstantIndex> callThisBuiltinsIds = {
251             BUILTINS_METHOD_STUB_LIST(ID_TO_IDX4, ID_TO_IDX4, ID_TO_IDX4, ID_TO_IDX6)
252         };
253 #undef ID_TO_IDX4
254 #undef ID_TO_IDX6
255         switch (builtinId) {
256             case BuiltinsStubCSigns::ID::NONE:
257                 return ConstantIndex::INVALID;
258             case BuiltinsStubCSigns::ID::MathAcos:
259                 return ConstantIndex::MATH_ACOS_INDEX;
260             case BuiltinsStubCSigns::ID::MathAcosh:
261                 return ConstantIndex::MATH_ACOSH_INDEX;
262             case BuiltinsStubCSigns::ID::MathAsin:
263                 return ConstantIndex::MATH_ASIN_INDEX;
264             case BuiltinsStubCSigns::ID::MathAsinh:
265                 return ConstantIndex::MATH_ASINH_INDEX;
266             case BuiltinsStubCSigns::ID::MathAtan:
267                 return ConstantIndex::MATH_ATAN_INDEX;
268             case BuiltinsStubCSigns::ID::MathAtan2:
269                 return ConstantIndex::MATH_ATAN2_INDEX;
270             case BuiltinsStubCSigns::ID::MathAtanh:
271                 return ConstantIndex::MATH_ATANH_INDEX;
272             case BuiltinsStubCSigns::ID::MathCos:
273                 return ConstantIndex::MATH_COS_INDEX;
274             case BuiltinsStubCSigns::ID::MathCosh:
275                 return ConstantIndex::MATH_COSH_INDEX;
276             case BuiltinsStubCSigns::ID::MathSign:
277                 return ConstantIndex::MATH_SIGN_INDEX;
278             case BuiltinsStubCSigns::ID::MathSin:
279                 return ConstantIndex::MATH_SIN_INDEX;
280             case BuiltinsStubCSigns::ID::MathSinh:
281                 return ConstantIndex::MATH_SINH_INDEX;
282             case BuiltinsStubCSigns::ID::MathTan:
283                 return ConstantIndex::MATH_TAN_INDEX;
284             case BuiltinsStubCSigns::ID::MathTanh:
285                 return ConstantIndex::MATH_TANH_INDEX;
286             case BuiltinsStubCSigns::ID::MathAbs:
287                 return ConstantIndex::MATH_ABS_INDEX;
288             case BuiltinsStubCSigns::ID::MathLog:
289                 return ConstantIndex::MATH_LOG_INDEX;
290             case BuiltinsStubCSigns::ID::MathLog2:
291                 return ConstantIndex::MATH_LOG2_INDEX;
292             case BuiltinsStubCSigns::ID::MathLog10:
293                 return ConstantIndex::MATH_LOG10_INDEX;
294             case BuiltinsStubCSigns::ID::MathLog1p:
295                 return ConstantIndex::MATH_LOG1P_INDEX;
296             case BuiltinsStubCSigns::ID::MathExp:
297                 return ConstantIndex::MATH_EXP_INDEX;
298             case BuiltinsStubCSigns::ID::MathExpm1:
299                 return ConstantIndex::MATH_EXPM1_INDEX;
300             case BuiltinsStubCSigns::ID::MathClz32:
301                 return ConstantIndex::MATH_CLZ32_INDEX;
302             case BuiltinsStubCSigns::ID::MathPow:
303                 return ConstantIndex::MATH_POW_INDEX;
304             case BuiltinsStubCSigns::ID::MathCbrt:
305                 return ConstantIndex::MATH_CBRT_INDEX;
306             case BuiltinsStubCSigns::ID::MathTrunc:
307                 return ConstantIndex::MATH_TRUNC_INDEX;
308             case BuiltinsStubCSigns::ID::MathCeil:
309                 return ConstantIndex::MATH_CEIL_INDEX;
310             case BuiltinsStubCSigns::ID::MathFloor:
311                 return ConstantIndex::MATH_FLOOR_INDEX;
312             case BuiltinsStubCSigns::ID::MathMin:
313                 return ConstantIndex::MATH_MIN_INDEX;
314             case BuiltinsStubCSigns::ID::MathMax:
315                 return ConstantIndex::MATH_MAX_INDEX;
316             case BuiltinsStubCSigns::ID::MathSqrt:
317                 return ConstantIndex::MATH_SQRT_INDEX;
318             case BuiltinsStubCSigns::ID::MathRound:
319                 return ConstantIndex::MATH_ROUND_INDEX;
320             case BuiltinsStubCSigns::ID::MathFRound:
321                 return ConstantIndex::MATH_FROUND_INDEX;
322             case BuiltinsStubCSigns::ID::MathImul:
323                 return ConstantIndex::MATH_IMUL_INDEX;
324             case BuiltinsStubCSigns::ID::MapGet:
325                 return ConstantIndex::MAP_GET_INDEX;
326             case BuiltinsStubCSigns::ID::MapHas:
327                 return ConstantIndex::MAP_HAS_INDEX;
328             case BuiltinsStubCSigns::ID::MapKeys:
329                 return ConstantIndex::MAP_KEYS_INDEX;
330             case BuiltinsStubCSigns::ID::MapValues:
331                 return ConstantIndex::MAP_VALUES_INDEX;
332             case BuiltinsStubCSigns::ID::MapEntries:
333                 return ConstantIndex::MAP_ENTRIES_INDEX;
334             case BuiltinsStubCSigns::ID::SetHas:
335                 return ConstantIndex::SET_HAS_INDEX;
336             case BuiltinsStubCSigns::ID::MapDelete:
337                 return ConstantIndex::MAP_DELETE_INDEX;
338             case BuiltinsStubCSigns::ID::SetDelete:
339                 return ConstantIndex::SET_DELETE_INDEX;
340             case BuiltinsStubCSigns::ID::SetValues:
341                 return ConstantIndex::SET_VALUES_INDEX;
342             case BuiltinsStubCSigns::ID::SetEntries:
343                 return ConstantIndex::SET_ENTRIES_INDEX;
344             case BuiltinsStubCSigns::ID::MapClear:
345                 return ConstantIndex::MAP_CLEAR_INDEX;
346             case BuiltinsStubCSigns::ID::SetClear:
347                 return ConstantIndex::SET_CLEAR_INDEX;
348             case BuiltinsStubCSigns::ID::SetAdd:
349                 return ConstantIndex::SET_ADD_INDEX;
350             case BuiltinsStubCSigns::ID::StringLocaleCompare:
351                 return ConstantIndex::LOCALE_COMPARE_FUNCTION_INDEX;
352             case BuiltinsStubCSigns::ID::StringCharCodeAt:
353                 return ConstantIndex::STRING_CHAR_CODE_AT_INDEX;
354             case BuiltinsStubCSigns::ID::StringSubstring:
355                 return ConstantIndex::STRING_SUB_STRING_INDEX;
356             case BuiltinsStubCSigns::ID::StringSubStr:
357                 return ConstantIndex::STRING_SUB_STR_INDEX;
358             case BuiltinsStubCSigns::ID::StringSlice:
359                 return ConstantIndex::STRING_SLICE_INDEX;
360             case BuiltinsStubCSigns::ID::ArraySort:
361                 return ConstantIndex::ARRAY_SORT_FUNCTION_INDEX;
362             case BuiltinsStubCSigns::ID::JsonStringify:
363                 return ConstantIndex::JSON_STRINGIFY_FUNCTION_INDEX;
364             case BuiltinsStubCSigns::ID::MapIteratorProtoNext:
365                 return ConstantIndex::MAP_ITERATOR_PROTO_NEXT_INDEX;
366             case BuiltinsStubCSigns::ID::SetIteratorProtoNext:
367                 return ConstantIndex::SET_ITERATOR_PROTO_NEXT_INDEX;
368             case BuiltinsStubCSigns::ID::StringIteratorProtoNext:
369                 return ConstantIndex::STRING_ITERATOR_PROTO_NEXT_INDEX;
370             case BuiltinsStubCSigns::ID::ArrayIteratorProtoNext:
371                 return ConstantIndex::ARRAY_ITERATOR_PROTO_NEXT_INDEX;
372             case BuiltinsStubCSigns::ID::IteratorProtoReturn:
373                 return ConstantIndex::ITERATOR_PROTO_RETURN_INDEX;
374             case BuiltinsStubCSigns::ID::StringFromCharCode:
375                 return ConstantIndex::STRING_FROM_CHAR_CODE_INDEX;
376             case BuiltinsStubCSigns::ID::DateGetTime:
377                 return ConstantIndex::DATE_GET_TIME_INDEX;
378             case BuiltinsStubCSigns::ID::DateNow:
379                 return ConstantIndex::DATE_NOW_INDEX;
380             case BuiltinsStubCSigns::ID::TypedArrayEntries:
381                 return ConstantIndex::TYPED_ARRAY_ENTRIES_INDEX;
382             case BuiltinsStubCSigns::ID::TypedArrayKeys:
383                 return ConstantIndex::TYPED_ARRAY_KEYS_INDEX;
384             case BuiltinsStubCSigns::ID::TypedArrayValues:
385                 return ConstantIndex::TYPED_ARRAY_VALUES_INDEX;
386             case BuiltinsStubCSigns::ID::GlobalIsFinite:
387                 return ConstantIndex::GLOBAL_IS_FINITE_INDEX;
388             case BuiltinsStubCSigns::ID::GlobalIsNan:
389                 return ConstantIndex::GLOBAL_IS_NAN_INDEX;
390             case BuiltinsStubCSigns::ID::ArrayBufferIsView:
391                 return ConstantIndex::ARRAY_BUFFER_IS_VIEW_INDEX;
392             case BuiltinsStubCSigns::ID::DataViewGetFloat32:
393                 return ConstantIndex::DATA_VIEW_GET_FLOAT32_INDEX;
394             case BuiltinsStubCSigns::ID::DataViewGetFloat64:
395                 return ConstantIndex::DATA_VIEW_GET_FLOAT64_INDEX;
396             case BuiltinsStubCSigns::ID::DataViewGetInt8:
397                 return ConstantIndex::DATA_VIEW_GET_INT8_INDEX;
398             case BuiltinsStubCSigns::ID::DataViewGetInt16:
399                 return ConstantIndex::DATA_VIEW_GET_INT16_INDEX;
400             case BuiltinsStubCSigns::ID::DataViewGetInt32:
401                 return ConstantIndex::DATA_VIEW_GET_INT32_INDEX;
402             case BuiltinsStubCSigns::ID::DataViewGetUint16:
403                 return ConstantIndex::DATA_VIEW_GET_UINT16_INDEX;
404             case BuiltinsStubCSigns::ID::DataViewGetUint32:
405                 return ConstantIndex::DATA_VIEW_GET_UINT32_INDEX;
406             case BuiltinsStubCSigns::ID::DataViewGetUint8:
407                 return ConstantIndex::DATA_VIEW_GET_UINT8_INDEX;
408             case BuiltinsStubCSigns::ID::DataViewSetFloat32:
409                 return ConstantIndex::DATA_VIEW_SET_FLOAT32_INDEX;
410             case BuiltinsStubCSigns::ID::DataViewSetFloat64:
411                 return ConstantIndex::DATA_VIEW_SET_FLOAT64_INDEX;
412             case BuiltinsStubCSigns::ID::DataViewSetInt8:
413                 return ConstantIndex::DATA_VIEW_SET_INT8_INDEX;
414             case BuiltinsStubCSigns::ID::DataViewSetInt16:
415                 return ConstantIndex::DATA_VIEW_SET_INT16_INDEX;
416             case BuiltinsStubCSigns::ID::DataViewSetInt32:
417                 return ConstantIndex::DATA_VIEW_SET_INT32_INDEX;
418             case BuiltinsStubCSigns::ID::DataViewSetUint8:
419                 return ConstantIndex::DATA_VIEW_SET_UINT8_INDEX;
420             case BuiltinsStubCSigns::ID::DataViewSetUint16:
421                 return ConstantIndex::DATA_VIEW_SET_UINT16_INDEX;
422             case BuiltinsStubCSigns::ID::DataViewSetUint32:
423                 return ConstantIndex::DATA_VIEW_SET_UINT32_INDEX;
424             case BuiltinsStubCSigns::ID::BigIntAsIntN:
425                 return ConstantIndex::BIGINT_AS_INTN_INDEX;
426             case BuiltinsStubCSigns::ID::BigIntAsUintN:
427                 return ConstantIndex::BIGINT_AS_UINTN_INDEX;
428             case BuiltinsStubCSigns::ID::NumberIsFinite:
429                 return ConstantIndex::NUMBER_IS_FINITE_INDEX;
430             case BuiltinsStubCSigns::ID::NumberIsInteger:
431                 return ConstantIndex::NUMBER_IS_INTEGER_INDEX;
432             case BuiltinsStubCSigns::ID::NumberIsNaN:
433                 return ConstantIndex::NUMBER_IS_NAN_INDEX;
434             case BuiltinsStubCSigns::ID::NumberIsSafeInteger:
435                 return ConstantIndex::NUMBER_IS_SAFEINTEGER_INDEX;
436             case BuiltinsStubCSigns::ID::NumberParseFloat:
437                 return ConstantIndex::NUMBER_PARSE_FLOAT_INDEX;
438             case BuiltinsStubCSigns::ID::NumberParseInt:
439                 return ConstantIndex::NUMBER_PARSE_INT_INDEX;
440             case BuiltinsStubCSigns::ID::ObjectIs:
441                 return ConstantIndex::OBJECT_IS_INDEX;
442             case BuiltinsStubCSigns::ID::ObjectGetPrototypeOf:
443                 return ConstantIndex::OBJECT_GET_PROTOTYPE_OF_INDEX;
444             case BuiltinsStubCSigns::ID::ObjectGetProto:
445                 return ConstantIndex::OBJECT_GET_PROTO_INDEX;
446             case BuiltinsStubCSigns::ID::ObjectCreate:
447                 return ConstantIndex::OBJECT_CREATE_INDEX;
448             case BuiltinsStubCSigns::ID::ObjectIsPrototypeOf:
449                 return ConstantIndex::OBJECT_IS_PROTOTYPE_OF_INDEX;
450             case BuiltinsStubCSigns::ID::ObjectHasOwnProperty:
451                 return ConstantIndex::OBJECT_HAS_OWN_PROPERTY_INDEX;
452             case BuiltinsStubCSigns::ID::ReflectGetPrototypeOf:
453                 return ConstantIndex::REFLECT_GET_PROTOTYPE_OF_INDEX;
454             case BuiltinsStubCSigns::ID::ReflectGet:
455                 return ConstantIndex::REFLECT_GET_INDEX;
456             case BuiltinsStubCSigns::ID::ReflectHas:
457                 return ConstantIndex::REFLECT_HAS_INDEX;
458             case BuiltinsStubCSigns::ID::ReflectConstruct:
459                 return ConstantIndex::REFLECT_CONSTRUCT_INDEX;
460             case BuiltinsStubCSigns::ID::ReflectApply:
461                 return ConstantIndex::REFLECT_APPLY_INDEX;
462             case BuiltinsStubCSigns::ID::FunctionPrototypeApply:
463                 return ConstantIndex::FUNCTION_PROTOTYPE_APPLY_INDEX;
464             case BuiltinsStubCSigns::ID::FunctionPrototypeBind:
465                 return ConstantIndex::FUNCTION_PROTOTYPE_BIND_INDEX;
466             case BuiltinsStubCSigns::ID::FunctionPrototypeCall:
467                 return ConstantIndex::FUNCTION_PROTOTYPE_CALL_INDEX;
468             case BuiltinsStubCSigns::ID::FunctionPrototypeHasInstance:
469                 return ConstantIndex::FUNCTION_PROTOTYPE_HAS_INSTANCE_INDEX;
470             case BuiltinsStubCSigns::ID::ArrayIndexOf:
471                 return ConstantIndex::ARRAY_INDEXOF_INDEX;
472             case BuiltinsStubCSigns::ID::ArrayIncludes:
473                 return ConstantIndex::ARRAY_INCLUDES_INDEX;
474             case BuiltinsStubCSigns::ID::ArrayValues:
475                 return ConstantIndex::ARRAY_VALUES_INDEX;
476             case BuiltinsStubCSigns::ID::ArrayEntries:
477                 return ConstantIndex::ARRAY_ENTRIES_INDEX;
478             case BuiltinsStubCSigns::ID::ArrayKeys:
479                 return ConstantIndex::ARRAY_KEYS_INDEX;
480             case BuiltinsStubCSigns::ID::ArrayForEach:
481                 return ConstantIndex::ARRAY_FOREACH_INDEX;
482             case BuiltinsStubCSigns::ID::ArrayFind:
483                 return ConstantIndex::ARRAY_FIND_INDEX;
484             case BuiltinsStubCSigns::ID::ArrayFindIndex:
485                 return ConstantIndex::ARRAY_FINDINDEX_INDEX;
486             case BuiltinsStubCSigns::ID::ArrayFilter:
487                 return ConstantIndex::ARRAY_FILTER_INDEX;
488             case BuiltinsStubCSigns::ID::ArrayMap:
489                 return ConstantIndex::ARRAY_MAP_INDEX;
490             case BuiltinsStubCSigns::ID::ArraySome:
491                 return ConstantIndex::ARRAY_SOME_INDEX;
492             case BuiltinsStubCSigns::ID::ArrayEvery:
493                 return ConstantIndex::ARRAY_EVERY_INDEX;
494             case BuiltinsStubCSigns::ID::ArrayPop:
495                 return ConstantIndex::ARRAY_POP_INDEX;
496             case BuiltinsStubCSigns::ID::ArrayPush:
497                 return ConstantIndex::ARRAY_PUSH_INDEX;
498             case BuiltinsStubCSigns::ID::ArraySlice:
499                 return ConstantIndex::ARRAY_SLICE_INDEX;
500             case BuiltinsStubCSigns::ID::ArrayConcat:
501                 return ConstantIndex::ARRAY_CONCAT_INDEX;
502             case BuiltinsStubCSigns::ID::GlobalDecodeURIComponent:
503                 return ConstantIndex::GLOBAL_DECODE_URI_COMPONENT;
504             default:
505                 if (callThisBuiltinsIds.count(builtinId)) {
506                     return callThisBuiltinsIds.at(builtinId);
507                 }
508                 LOG_COMPILER(DEBUG) << "GetConstantIndex Invalid Id:" << builtinId;
509                 return ConstantIndex::INVALID;
510         }
511     }
512 
CheckBuiltinsIdInvalid(ID builtinId)513     static bool CheckBuiltinsIdInvalid(ID builtinId)
514     {
515         auto result = kungfu::BuiltinsStubCSigns::GetConstantIndex(builtinId);
516         return result == ConstantIndex::INVALID;
517     }
518 
519     static size_t GetGlobalEnvIndex(ID builtinId);
520 
GetBuiltinName(ID id)521     static std::string GetBuiltinName(ID id)
522     {
523         static const std::map<BuiltinsStubCSigns::ID, const std::string> builtinId2Str = {
524             {MathAcos, "Math.acos"},
525             {MathAcosh, "Math.acosh"},
526             {MathAsin, "Math.asin"},
527             {MathAsinh, "Math.asinh"},
528             {MathAtan, "Math.atan"},
529             {MathAtan2, "Math.atan2"},
530             {MathAtanh, "Math.atanh"},
531             {MathCos, "Math.cos"},
532             {MathCosh, "Math.cosh"},
533             {MathSign, "Math.sign"},
534             {MathSin, "Math.sin"},
535             {MathSinh, "Math.sinh"},
536             {MathTan, "Math.tan"},
537             {MathTanh, "Math.tanh"},
538             {MathLog, "Math.log"},
539             {MathLog2, "Math.log2"},
540             {MathLog10, "Math.log10"},
541             {MathLog1p, "Math.log1p"},
542             {MathExp, "Math.exp"},
543             {MathExpm1, "Math.expm1"},
544             {MathClz32, "Math.clz32"},
545             {MathSqrt, "Math.sqrt"},
546             {MathCbrt, "Math.cbrt"},
547             {MathAbs, "Math.abs"},
548             {MathPow, "Math.pow"},
549             {MathTrunc, "Math.trunc"},
550             {MathRound, "Math.round"},
551             {MathFRound, "Math.fround"},
552             {MathCeil, "Math.ceil"},
553             {MathFloor, "Math.floor"},
554             {MathImul, "Math.imul"},
555             {MathMax, "Math.max"},
556             {MathMin, "Math.min"},
557             {DateGetTime, "Date.prototype.getTime"},
558             {DateNow, "Date.now"},
559             {TypedArrayEntries, "TypedArray.entries"},
560             {TypedArrayKeys, "TypedArray.keys"},
561             {TypedArrayValues, "TypedArray.values"},
562             {GlobalIsFinite, "isFinite"},
563             {GlobalIsNan, "isNan"},
564             {BigIntAsIntN, "BigInt.asIntN"},
565             {BigIntAsUintN, "BigInt.asUintN"},
566             {MapGet, "Map.get"},
567             {MapHas, "Map.has"},
568             {MapKeys, "Map.keys"},
569             {MapValues, "Map.values"},
570             {MapEntries, "Map.entries"},
571             {SetValues, "Set.values"},
572             {SetEntries, "Set.entries"},
573             {SetHas, "Set.has"},
574             {MapDelete, "Map.delete"},
575             {SetDelete, "Set.delete"},
576             {MapClear, "Map.clear"},
577             {SetClear, "Set.clear"},
578             {SetAdd, "Set.add"},
579             {BigIntConstructor, "BigInt"},
580             {NumberParseFloat, "Number.parseFloat"},
581             {NumberIsInteger, "Number.isInteger"},
582             {NumberIsSafeInteger, "Number.isSafeInteger"},
583             {NumberParseInt, "Number.parseInt"},
584             {StringCharCodeAt, "String.prototype.charCodeAt"},
585             {StringSubstring, "String.prototype.substring"},
586             {StringSubStr, "String.prototype.substr"},
587             {StringSlice, "String.prototype.slice"},
588             {ObjectIs, "Object.is"},
589             {ObjectGetPrototypeOf, "Object.getPrototypeOf"},
590             {ObjectGetProto, "Object.prototype.getProto"},
591             {ObjectCreate, "Object.create"},
592             {ObjectIsPrototypeOf, "Object.prototype.isPrototypeOf"},
593             {ObjectHasOwnProperty, "Object.prototype.hasOwnProperty"},
594             {ReflectGetPrototypeOf, "Reflect.getPrototypeOf"},
595             {ReflectGet, "Reflect.get"},
596             {ReflectHas, "Reflect.has"},
597             {ReflectConstruct, "Reflect.construct"},
598             {ReflectApply, "Reflect.apply"},
599             {FunctionPrototypeApply, "Function.prototype.apply"},
600             {FunctionPrototypeBind, "Function.prototype.bind"},
601             {FunctionPrototypeCall, "Function.prototype.call"},
602             {FunctionPrototypeHasInstance, "Function.prototype.hasInstance"},
603             {ArrayIncludes, "Array.prototype.includes"},
604             {ArrayIndexOf, "Array.prototype.indexOf"},
605             {ArrayEntries, "Array.prototype.entries"},
606             {ArrayValues, "Array.prototype.values"},
607             {ArrayKeys, "Array.prototype.keys"},
608             {ArrayFind, "Array.prototype.find"},
609             {ArrayFindIndex, "Array.prototype.findIndex"},
610             {ArrayForEach, "Array.prototype.foreach"},
611             {ArrayFilter, "Array.prototype.filter"},
612             {ArraySome, "Array.prototype.some"},
613             {ArrayMap, "Array.prototype.map"},
614             {ArrayEvery, "Array.prototype.every"},
615             {ArrayPop, "Array.prototype.pop"},
616             {ArrayPush, "Array.prototype.push"},
617             {ArraySlice, "Array.prototype.slice"},
618             {DataViewGetInt8, "DataView.prototype.GetInt8"},
619             {DataViewGetUint8, "DataView.prototype.GetUint8"},
620             {DataViewGetInt16, "DataView.prototype.GetInt16"},
621             {DataViewGetUint16, "DataView.prototype.GetUint16"},
622             {DataViewGetInt32, "DataView.prototype.GetInt32"},
623             {DataViewGetUint32, "DataView.prototype.GetUint32"},
624             {DataViewGetFloat32, "DataView.prototype.GetFloat32"},
625             {DataViewGetFloat64, "DataView.prototype.GetFloat64"},
626             {DataViewSetInt8, "DataView.prototype.SetInt8"},
627             {DataViewSetUint8, "DataView.prototype.SetUint8"},
628             {DataViewSetInt16, "DataView.prototype.SetInt16"},
629             {DataViewSetUint16, "DataView.prototype.SetUint16"},
630             {DataViewSetInt32, "DataView.prototype.SetInt32"},
631             {DataViewSetUint32, "DataView.prototype.SetUint32"},
632             {DataViewSetFloat32, "DataView.prototype.SetFloat32"},
633             {DataViewSetFloat64, "DataView.prototype.SetFloat64"},
634             {ArrayIteratorProtoNext, "ArrayIterator.next"},
635             {MapIteratorProtoNext, "MapIterator.next"},
636             {SetIteratorProtoNext, "SetIterator.next"},
637             {StringLocaleCompare, "String.LocaleCompare"},
638             {ArraySort, "Array.Sort"},
639         };
640         if (builtinId2Str.count(id) > 0) {
641             return builtinId2Str.at(id);
642         }
643 #define ID_TO_STRING(Method, Object, ...)  {BuiltinsStubCSigns::ID::Object##Method, #Object"."#Method},
644         static const std::unordered_map<BuiltinsStubCSigns::ID, const std::string> builtinId2Str2 = {
645             BUILTINS_METHOD_STUB_LIST(ID_TO_STRING, ID_TO_STRING, ID_TO_STRING, ID_TO_STRING)
646         };
647 #undef ID_TO_STRING
648         if (builtinId2Str2.count(id) > 0) {
649             return builtinId2Str2.at(id);
650         }
651         return "unnamed-builtin-"+std::to_string(id);
652     }
653 
GetBuiltinId(std::string idStr)654     static ID GetBuiltinId(std::string idStr)
655     {
656         static const std::map<const std::string, BuiltinsStubCSigns::ID> str2BuiltinId = {
657             {"acos", MathAcos},
658             {"acosh", MathAcosh},
659             {"asin", MathAsin},
660             {"asinh", MathAsinh},
661             {"atan", MathAtan},
662             {"atan2", MathAtan2},
663             {"atanh", MathAtanh},
664             {"cos", MathCos},
665             {"cosh", MathCosh},
666             {"sign", MathSign},
667             {"sin", MathSin},
668             {"sinh", MathSinh},
669             {"tan", MathTan},
670             {"tanh", MathTanh},
671             {"log", MathLog},
672             {"log2", MathLog2},
673             {"log10", MathLog10},
674             {"log1p", MathLog1p},
675             {"exp", MathExp},
676             {"expm1", MathExpm1},
677             {"clz32", MathClz32},
678             {"sqrt", MathSqrt},
679             {"cbrt", MathCbrt},
680             {"abs", MathAbs},
681             {"pow", MathPow},
682             {"trunc", MathTrunc},
683             {"round", MathRound},
684             {"fround", MathFRound},
685             {"ceil", MathCeil},
686             {"floor", MathFloor},
687             {"imul", MathImul},
688             {"max", MathMax},
689             {"min", MathMin},
690             {"localeCompare", StringLocaleCompare},
691             {"next", StringIteratorProtoNext},
692             {"sort", ArraySort},
693             {"stringify", JsonStringify},
694             {"getTime", DateGetTime},
695             {"now", DateNow},
696             {"isFinite", GlobalIsFinite},
697             {"isNan", GlobalIsNan},
698             {"asIntN", BigIntAsIntN},
699             {"asUintN", BigIntAsUintN},
700             {"mapDelete", MapDelete},
701             {"setDelete", SetDelete},
702             {"BigInt", BigIntConstructor},
703             {"charCodeAt", StringCharCodeAt},
704             {"substring", StringSubstring},
705             {"substr", StringSubStr},
706             {"slice", StringSlice},
707             {"is", ObjectIs},
708             {"getPrototypeOf", ObjectGetPrototypeOf},
709             {"create", ObjectCreate},
710             {"isPrototypeOf", ObjectIsPrototypeOf},
711             {"hasOwnProperty", ObjectHasOwnProperty},
712             {"reflectGetPrototypeOf", ReflectGetPrototypeOf},
713             {"get", ReflectGet},
714             {"has", ReflectHas},
715             {"construct", ReflectConstruct},
716             {"ReflectApply", ReflectApply},
717             {"apply", FunctionPrototypeApply},
718             {"bind", FunctionPrototypeBind},
719             {"call", FunctionPrototypeCall},
720             {"hasInstance", FunctionPrototypeHasInstance},
721             {"includes", ArrayIncludes},
722             {"indexOf", ArrayIndexOf},
723             {"entries", ArrayEntries},
724             {"values", ArrayValues},
725             {"keys", ArrayKeys},
726             {"find", ArrayFind},
727             {"findIndex", ArrayFindIndex},
728             {"foreach", ArrayForEach},
729             {"filter", ArrayFilter},
730             {"some", ArraySome},
731             {"map", ArrayMap},
732             {"every", ArrayEvery},
733             {"pop", ArrayPop},
734             {"push", ArrayPush},
735             {"slice", ArraySlice},
736             {"getUint8", DataViewGetUint8},
737             {"getInt8", DataViewGetInt8},
738             {"getUint16", DataViewGetUint16},
739             {"getInt16", DataViewGetInt16},
740             {"getUint32", DataViewGetUint32},
741             {"getInt32", DataViewGetInt32},
742             {"getFloat32", DataViewGetFloat32},
743             {"getFloat64", DataViewGetFloat64},
744             {"setUint8", DataViewSetUint8},
745             {"setInt8", DataViewSetInt8},
746             {"setUint16", DataViewSetUint16},
747             {"setInt16", DataViewSetInt16},
748             {"setUint32", DataViewSetUint32},
749             {"setInt32", DataViewSetInt32},
750             {"setFloat32", DataViewSetFloat32},
751             {"setFloat64", DataViewSetFloat64},
752         };
753         if (str2BuiltinId.count(idStr) > 0) {
754             return str2BuiltinId.at(idStr);
755         }
756         return NONE;
757     }
758 
759 private:
760     static CallSignature callSigns_[NUM_OF_BUILTINS_STUBS];
761     static CallSignature builtinsCSign_;
762     static CallSignature builtinsWithArgvCSign_;
763 };
764 
765 enum class BuiltinsArgs : size_t {
766     GLUE = 0,
767     NATIVECODE,
768     FUNC,
769     NEWTARGET,
770     THISVALUE,
771     NUMARGS,
772     ARG0_OR_ARGV,
773     ARG1,
774     ARG2,
775     NUM_OF_INPUTS,
776 };
777 
778 #define BUILTINS_STUB_ID(name) kungfu::BuiltinsStubCSigns::name
779 // to distinguish with the positive method offset of js function
780 #define PGO_BUILTINS_STUB_ID(name) ((-1) * kungfu::BuiltinsStubCSigns::name)
781 #define IS_TYPED_BUILTINS_ID(id) kungfu::BuiltinsStubCSigns::IsTypedBuiltin(id)
782 #define IS_TYPED_INLINE_BUILTINS_ID(id) kungfu::BuiltinsStubCSigns::IsTypedInlineBuiltin(id)
783 #define IS_TYPED_BUILTINS_NUMBER_ID(id) kungfu::BuiltinsStubCSigns::IsTypedBuiltinNumber(id)
784 #define IS_TYPED_BUILTINS_GLOBAL_ID(id) kungfu::BuiltinsStubCSigns::IsTypedBuiltinGlobal(id)
785 #define IS_TYPED_BUILTINS_ID_CALL_THIS0(id) kungfu::BuiltinsStubCSigns::IsTypedBuiltinCallThis0(id)
786 #define IS_TYPED_BUILTINS_ID_CALL_THIS1(id) kungfu::BuiltinsStubCSigns::IsTypedBuiltinCallThis1(id)
787 #define IS_TYPED_BUILTINS_ID_CALL_THIS2(id) kungfu::BuiltinsStubCSigns::IsTypedBuiltinCallThis2(id)
788 #define IS_TYPED_BUILTINS_ID_CALL_THIS3(id) kungfu::BuiltinsStubCSigns::IsTypedBuiltinCallThis3(id)
789 #define GET_TYPED_CONSTANT_INDEX(id) kungfu::BuiltinsStubCSigns::GetConstantIndex(id)
790 #define IS_INVALID_ID(id) kungfu::BuiltinsStubCSigns::CheckBuiltinsIdInvalid(id)
791 #define GET_TYPED_GLOBAL_ENV_INDEX(id) kungfu::BuiltinsStubCSigns::GetGlobalEnvIndex(id)
792 #define IS_SIDE_EFFECT_BUILTINS_ID(id) kungfu::BuiltinsStubCSigns::IsSideEffectBuiltin(id)
793 }  // namespace panda::ecmascript::kungfu
794 #endif  // ECMASCRIPT_COMPILER_BUILTINS_CALL_SIGNATURE_H
795