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 <map> 20 #include <unordered_map> 21 #include <unordered_set> 22 23 #include "ecmascript/compiler/builtins/builtins_call_signature_id_properties.h" 24 #include "ecmascript/base/config.h" 25 #include "ecmascript/compiler/call_signature.h" 26 #include "ecmascript/global_env_constants.h" 27 #include "ecmascript/global_env_fields.h" 28 29 namespace panda::ecmascript::kungfu { 30 31 class BuiltinsStubCSigns { 32 public: 33 using ID = stubcsigns::BuiltinsStubCSignsID; 34 static_assert(ID::NONE == 0); 35 static constexpr int NONE = ID::NONE; 36 static constexpr int NUM_OF_BUILTINS_STUBS = ID::NUM_OF_BUILTINS_STUBS; 37 38 enum CALL_SIGNATURE_ID { 39 #define DEF_STUB_ID(name) ID_##name, 40 #define DEF_STUB_ID_DYN(name, type, ...) ID_##type##name, 41 PADDING_BUILTINS_STUB_LIST(DEF_STUB_ID) 42 BUILTINS_STUB_LIST(DEF_STUB_ID, DEF_STUB_ID_DYN, DEF_STUB_ID) 43 #undef DEF_STUB_ID_DYN 44 #undef DEF_STUB_ID 45 #define DEF_STUB_ID(name) ID_##name##StwCopy, 46 #define DEF_STUB_ID_DYN(name, type, ...) ID_##type##name##StwCopy, 47 BUILTINS_STW_COPY_STUB_LIST(DEF_STUB_ID, DEF_STUB_ID_DYN, DEF_STUB_ID) 48 #undef DEF_STUB_ID_DYN 49 #undef DEF_STUB_ID 50 NUM_OF_BUILTINS_STUBS_EXTEND, 51 }; 52 static_assert(CALL_SIGNATURE_ID::ID_NONE == 0); 53 #define ASSERT_ID_EQUAL(name) \ 54 static_assert(static_cast<uint32_t>(ID::name) == static_cast<uint32_t>(CALL_SIGNATURE_ID::ID_##name)); 55 56 #define ASSERT_ID_EQUAL_DYN(name, type, ...) \ 57 static_assert(static_cast<uint32_t>(ID::type##name) == static_cast<uint32_t>(CALL_SIGNATURE_ID::ID_##type##name)); 58 59 BUILTINS_STUB_LIST(ASSERT_ID_EQUAL, ASSERT_ID_EQUAL_DYN, ASSERT_ID_EQUAL) 60 #undef ASSERT_ID_EQUAL_DYN 61 #undef ASSERT_ID_EQUAL 62 63 static void Initialize(); 64 65 static void GetCSigns(std::vector<const CallSignature*>& callSigns); 66 Get(size_t index)67 static const CallSignature *Get(size_t index) 68 { 69 ASSERT(index < NUM_OF_BUILTINS_STUBS_EXTEND); 70 return &callSigns_[index]; 71 } 72 GetName(int index)73 static const std::string &GetName(int index) 74 { 75 ASSERT(index < NUM_OF_BUILTINS_STUBS_EXTEND); 76 return callSigns_[index].GetName(); 77 } 78 BuiltinsCSign()79 static const CallSignature* BuiltinsCSign() 80 { 81 return &builtinsCSign_; 82 } 83 BuiltinsWithArgvCSign()84 static const CallSignature* BuiltinsWithArgvCSign() 85 { 86 return &builtinsWithArgvCSign_; 87 } 88 IsFastBuiltin(ID builtinId)89 static bool IsFastBuiltin(ID builtinId) 90 { 91 return builtinId > NONE && builtinId < NUM_OF_BUILTINS_STUBS; 92 } 93 IsTypedBuiltin(ID builtinId)94 static bool IsTypedBuiltin(ID builtinId) 95 { 96 return (BuiltinsStubCSigns::ID::StringLocaleCompare == builtinId) || 97 (BuiltinsStubCSigns::ID::StringIteratorProtoNext == builtinId) || 98 (BuiltinsStubCSigns::ID::ArrayIteratorProtoNext == builtinId) || 99 (BuiltinsStubCSigns::ID::MapIteratorProtoNext == builtinId) || 100 (BuiltinsStubCSigns::ID::SetIteratorProtoNext == builtinId) || 101 (BuiltinsStubCSigns::ID::ArraySort == builtinId) || 102 (BuiltinsStubCSigns::ID::ArrayConcat == builtinId) || 103 (BuiltinsStubCSigns::ID::GlobalDecodeURIComponent == builtinId) || 104 ((BuiltinsStubCSigns::ID::TYPED_BUILTINS_FIRST <= builtinId) && 105 (builtinId <= BuiltinsStubCSigns::ID::TYPED_BUILTINS_LAST)) || 106 IsAOTCallThisBuiltin(builtinId); 107 } 108 IsAOTCallThisBuiltin(ID builtinId)109 static bool IsAOTCallThisBuiltin([[maybe_unused]]ID builtinId) 110 { 111 #define BUILTINS_ID(METHOD, OBJECT, ...) ID::OBJECT##METHOD, 112 static std::unordered_set<BuiltinsStubCSigns::ID> callThisBuiltinsIds = { 113 BUILTINS_METHOD_STUB_LIST(BUILTINS_ID, BUILTINS_ID, BUILTINS_ID, BUILTINS_ID) 114 }; 115 #undef BUILTINS_ID 116 #if ENABLE_NEXT_OPTIMIZATION 117 return callThisBuiltinsIds.count(builtinId); 118 #else 119 return false; 120 #endif 121 } 122 IsTypedInlineBuiltin(ID builtinId)123 static bool IsTypedInlineBuiltin(ID builtinId) 124 { 125 if (ID::TYPED_BUILTINS_INLINE_FIRST <= builtinId && builtinId <= ID::TYPED_BUILTINS_INLINE_LAST) { 126 return true; 127 } 128 if (BuiltinsStubCSigns::ID::DataViewSetInt32 <= builtinId && 129 builtinId <= BuiltinsStubCSigns::ID::DataViewSetFloat64) { 130 return true; 131 } 132 // NOTE(schernykh): try to remove this switch and move StringFromCharCode to TYPED_BUILTINS_INLINE list 133 switch (builtinId) { 134 case BuiltinsStubCSigns::ID::ArraySort: 135 case BuiltinsStubCSigns::ID::StringFromCharCode: 136 case BuiltinsStubCSigns::ID::StringCharCodeAt: 137 case BuiltinsStubCSigns::ID::StringSubstring: 138 case BuiltinsStubCSigns::ID::StringSubStr: 139 case BuiltinsStubCSigns::ID::StringSlice: 140 case BuiltinsStubCSigns::ID::MapGet: 141 case BuiltinsStubCSigns::ID::MapHas: 142 case BuiltinsStubCSigns::ID::MapKeys: 143 case BuiltinsStubCSigns::ID::MapValues: 144 case BuiltinsStubCSigns::ID::MapEntries: 145 case BuiltinsStubCSigns::ID::SetHas: 146 case BuiltinsStubCSigns::ID::MapDelete: 147 case BuiltinsStubCSigns::ID::SetDelete: 148 case BuiltinsStubCSigns::ID::TypedArrayEntries: 149 case BuiltinsStubCSigns::ID::TypedArrayKeys: 150 case BuiltinsStubCSigns::ID::TypedArrayValues: 151 case BuiltinsStubCSigns::ID::SetValues: 152 case BuiltinsStubCSigns::ID::SetEntries: 153 case BuiltinsStubCSigns::ID::MapClear: 154 case BuiltinsStubCSigns::ID::SetClear: 155 case BuiltinsStubCSigns::ID::SetAdd: 156 case BuiltinsStubCSigns::ID::NumberParseFloat: 157 case BuiltinsStubCSigns::ID::NumberParseInt: 158 case BuiltinsStubCSigns::ID::NumberIsFinite: 159 case BuiltinsStubCSigns::ID::NumberIsNaN: 160 case BuiltinsStubCSigns::ID::NumberIsInteger: 161 case BuiltinsStubCSigns::ID::NumberIsSafeInteger: 162 case BuiltinsStubCSigns::ID::ObjectIs: 163 case BuiltinsStubCSigns::ID::ObjectGetPrototypeOf: 164 case BuiltinsStubCSigns::ID::ObjectGetProto: 165 case BuiltinsStubCSigns::ID::ObjectCreate: 166 case BuiltinsStubCSigns::ID::ObjectIsPrototypeOf: 167 case BuiltinsStubCSigns::ID::ObjectHasOwnProperty: 168 case BuiltinsStubCSigns::ID::ReflectGetPrototypeOf: 169 case BuiltinsStubCSigns::ID::ReflectGet: 170 case BuiltinsStubCSigns::ID::ReflectHas: 171 case BuiltinsStubCSigns::ID::ReflectConstruct: 172 case BuiltinsStubCSigns::ID::ReflectApply: 173 case BuiltinsStubCSigns::ID::FunctionPrototypeApply: 174 case BuiltinsStubCSigns::ID::FunctionPrototypeBind: 175 case BuiltinsStubCSigns::ID::FunctionPrototypeCall: 176 case BuiltinsStubCSigns::ID::FunctionPrototypeHasInstance: 177 case BuiltinsStubCSigns::ID::ArrayIndexOf: 178 case BuiltinsStubCSigns::ID::ArrayIncludes: 179 case BuiltinsStubCSigns::ID::ArrayValues: 180 case BuiltinsStubCSigns::ID::ArrayForEach: 181 case BuiltinsStubCSigns::ID::ArrayFind: 182 case BuiltinsStubCSigns::ID::ArrayFindIndex: 183 case BuiltinsStubCSigns::ID::ArrayFilter: 184 case BuiltinsStubCSigns::ID::ArrayMap: 185 case BuiltinsStubCSigns::ID::ArraySome: 186 case BuiltinsStubCSigns::ID::ArrayEvery: 187 case BuiltinsStubCSigns::ID::ArrayPop: 188 case BuiltinsStubCSigns::ID::ArraySlice: 189 case BuiltinsStubCSigns::ID::ArrayPush: 190 return true; 191 default: 192 return false; 193 } 194 return false; 195 } 196 IsTypedBuiltinNumber(ID builtinId)197 static bool IsTypedBuiltinNumber(ID builtinId) 198 { 199 return BuiltinsStubCSigns::ID::NumberConstructor == builtinId; 200 } 201 IsTypedBuiltinGlobal(ID builtinId)202 static bool IsTypedBuiltinGlobal(ID builtinId) 203 { 204 return BuiltinsStubCSigns::ID::GlobalDecodeURIComponent == builtinId; 205 } 206 IsTypedBuiltinCallThis0(ID builtinId)207 static bool IsTypedBuiltinCallThis0(ID builtinId) 208 { 209 switch (builtinId) { 210 case BuiltinsStubCSigns::ID::MapIteratorProtoNext: 211 case BuiltinsStubCSigns::ID::SetIteratorProtoNext: 212 case BuiltinsStubCSigns::ID::StringIteratorProtoNext: 213 case BuiltinsStubCSigns::ID::ArrayIteratorProtoNext: 214 case BuiltinsStubCSigns::ID::IteratorProtoReturn: 215 case BuiltinsStubCSigns::ID::ArrayConcat: 216 case BuiltinsStubCSigns::ID::ArraySort: 217 return true; 218 default: 219 return IsAOTCallThisBuiltin(builtinId); 220 } 221 } 222 IsTypedBuiltinCallThis1(ID builtinId)223 static bool IsTypedBuiltinCallThis1(ID builtinId) 224 { 225 switch (builtinId) { 226 case BuiltinsStubCSigns::ID::ArrayConcat: 227 case BuiltinsStubCSigns::ID::JsonStringify: 228 case BuiltinsStubCSigns::ID::StringLocaleCompare: 229 return true; 230 default: 231 return IsAOTCallThisBuiltin(builtinId); 232 } 233 } 234 IsTypedBuiltinCallThis2(ID builtinId)235 static bool IsTypedBuiltinCallThis2(ID builtinId) 236 { 237 return IsAOTCallThisBuiltin(builtinId); 238 } 239 IsTypedBuiltinCallThis3(ID builtinId)240 static bool IsTypedBuiltinCallThis3(ID builtinId) 241 { 242 switch (builtinId) { 243 case BuiltinsStubCSigns::ID::StringLocaleCompare: 244 return true; 245 default: 246 return IsAOTCallThisBuiltin(builtinId); 247 } 248 } 249 IsSideEffectBuiltin(ID builtinId)250 static bool IsSideEffectBuiltin(ID builtinId) 251 { 252 switch (builtinId) { 253 case BuiltinsStubCSigns::ID::StringLocaleCompare: 254 return false; 255 default: 256 return true; 257 } 258 } 259 CheckBuiltinsIdInvalid(ID builtinId)260 static bool CheckBuiltinsIdInvalid(ID builtinId) 261 { 262 auto result = kungfu::BuiltinsStubCSigns::GetGlobalEnvFieldIndex(builtinId); 263 return result == GlobalEnvField::INVALID; 264 } 265 266 static size_t GetGlobalEnvIndex(ID builtinId); 267 GetBuiltinName(ID id)268 static std::string GetBuiltinName(ID id) 269 { 270 // Note: this function will be refactored soon in future. 271 using namespace stubcsigns; 272 static const std::map<BuiltinsStubCSigns::ID, const std::string> builtinId2Str = { 273 {MathAcos, "Math.acos"}, 274 {MathAcosh, "Math.acosh"}, 275 {MathAsin, "Math.asin"}, 276 {MathAsinh, "Math.asinh"}, 277 {MathAtan, "Math.atan"}, 278 {MathAtan2, "Math.atan2"}, 279 {MathAtanh, "Math.atanh"}, 280 {MathCos, "Math.cos"}, 281 {MathCosh, "Math.cosh"}, 282 {MathSign, "Math.sign"}, 283 {MathSin, "Math.sin"}, 284 {MathSinh, "Math.sinh"}, 285 {MathTan, "Math.tan"}, 286 {MathTanh, "Math.tanh"}, 287 {MathLog, "Math.log"}, 288 {MathLog2, "Math.log2"}, 289 {MathLog10, "Math.log10"}, 290 {MathLog1p, "Math.log1p"}, 291 {MathExp, "Math.exp"}, 292 {MathExpm1, "Math.expm1"}, 293 {MathClz32, "Math.clz32"}, 294 {MathSqrt, "Math.sqrt"}, 295 {MathCbrt, "Math.cbrt"}, 296 {MathAbs, "Math.abs"}, 297 {MathPow, "Math.pow"}, 298 {MathTrunc, "Math.trunc"}, 299 {MathRound, "Math.round"}, 300 {MathFRound, "Math.fround"}, 301 {MathCeil, "Math.ceil"}, 302 {MathFloor, "Math.floor"}, 303 {MathImul, "Math.imul"}, 304 {MathMax, "Math.max"}, 305 {MathMin, "Math.min"}, 306 {DateGetTime, "Date.prototype.getTime"}, 307 {DateNow, "Date.now"}, 308 {TypedArrayEntries, "TypedArray.entries"}, 309 {TypedArrayKeys, "TypedArray.keys"}, 310 {TypedArrayValues, "TypedArray.values"}, 311 {GlobalIsFinite, "isFinite"}, 312 {GlobalIsNan, "isNan"}, 313 {BigIntAsIntN, "BigInt.asIntN"}, 314 {BigIntAsUintN, "BigInt.asUintN"}, 315 {MapGet, "Map.get"}, 316 {MapHas, "Map.has"}, 317 {MapKeys, "Map.keys"}, 318 {MapValues, "Map.values"}, 319 {MapEntries, "Map.entries"}, 320 {SetValues, "Set.values"}, 321 {SetEntries, "Set.entries"}, 322 {SetHas, "Set.has"}, 323 {MapDelete, "Map.delete"}, 324 {SetDelete, "Set.delete"}, 325 {MapClear, "Map.clear"}, 326 {SetClear, "Set.clear"}, 327 {SetAdd, "Set.add"}, 328 {BigIntConstructor, "BigInt"}, 329 {NumberParseFloat, "Number.parseFloat"}, 330 {NumberIsInteger, "Number.isInteger"}, 331 {NumberIsSafeInteger, "Number.isSafeInteger"}, 332 {NumberParseInt, "Number.parseInt"}, 333 {StringCharCodeAt, "String.prototype.charCodeAt"}, 334 {StringSubstring, "String.prototype.substring"}, 335 {StringSubStr, "String.prototype.substr"}, 336 {StringSlice, "String.prototype.slice"}, 337 {ObjectIs, "Object.is"}, 338 {ObjectGetPrototypeOf, "Object.getPrototypeOf"}, 339 {ObjectGetProto, "Object.prototype.getProto"}, 340 {ObjectCreate, "Object.create"}, 341 {ObjectIsPrototypeOf, "Object.prototype.isPrototypeOf"}, 342 {ObjectHasOwnProperty, "Object.prototype.hasOwnProperty"}, 343 {ReflectGetPrototypeOf, "Reflect.getPrototypeOf"}, 344 {ReflectGet, "Reflect.get"}, 345 {ReflectHas, "Reflect.has"}, 346 {ReflectConstruct, "Reflect.construct"}, 347 {ReflectApply, "Reflect.apply"}, 348 {FunctionPrototypeApply, "Function.prototype.apply"}, 349 {FunctionPrototypeBind, "Function.prototype.bind"}, 350 {FunctionPrototypeCall, "Function.prototype.call"}, 351 {FunctionPrototypeHasInstance, "Function.prototype.hasInstance"}, 352 {ArrayIncludes, "Array.prototype.includes"}, 353 {ArrayIndexOf, "Array.prototype.indexOf"}, 354 {ArrayEntries, "Array.prototype.entries"}, 355 {ArrayValues, "Array.prototype.values"}, 356 {ArrayKeys, "Array.prototype.keys"}, 357 {ArrayFind, "Array.prototype.find"}, 358 {ArrayFindIndex, "Array.prototype.findIndex"}, 359 {ArrayForEach, "Array.prototype.foreach"}, 360 {ArrayFilter, "Array.prototype.filter"}, 361 {ArraySome, "Array.prototype.some"}, 362 {ArrayMap, "Array.prototype.map"}, 363 {ArrayEvery, "Array.prototype.every"}, 364 {ArrayPop, "Array.prototype.pop"}, 365 {ArrayPush, "Array.prototype.push"}, 366 {ArraySlice, "Array.prototype.slice"}, 367 {DataViewGetInt8, "DataView.prototype.GetInt8"}, 368 {DataViewGetUint8, "DataView.prototype.GetUint8"}, 369 {DataViewGetInt16, "DataView.prototype.GetInt16"}, 370 {DataViewGetUint16, "DataView.prototype.GetUint16"}, 371 {DataViewGetInt32, "DataView.prototype.GetInt32"}, 372 {DataViewGetUint32, "DataView.prototype.GetUint32"}, 373 {DataViewGetFloat32, "DataView.prototype.GetFloat32"}, 374 {DataViewGetFloat64, "DataView.prototype.GetFloat64"}, 375 {DataViewSetInt8, "DataView.prototype.SetInt8"}, 376 {DataViewSetUint8, "DataView.prototype.SetUint8"}, 377 {DataViewSetInt16, "DataView.prototype.SetInt16"}, 378 {DataViewSetUint16, "DataView.prototype.SetUint16"}, 379 {DataViewSetInt32, "DataView.prototype.SetInt32"}, 380 {DataViewSetUint32, "DataView.prototype.SetUint32"}, 381 {DataViewSetFloat32, "DataView.prototype.SetFloat32"}, 382 {DataViewSetFloat64, "DataView.prototype.SetFloat64"}, 383 {ArrayIteratorProtoNext, "ArrayIterator.next"}, 384 {MapIteratorProtoNext, "MapIterator.next"}, 385 {SetIteratorProtoNext, "SetIterator.next"}, 386 {StringLocaleCompare, "String.LocaleCompare"}, 387 {ArraySort, "Array.Sort"}, 388 }; 389 if (builtinId2Str.count(id) > 0) { 390 return builtinId2Str.at(id); 391 } 392 #define ID_TO_STRING(Method, Object, ...) {BuiltinsStubCSigns::ID::Object##Method, #Object"."#Method}, 393 static const std::unordered_map<BuiltinsStubCSigns::ID, const std::string> builtinId2Str2 = { 394 BUILTINS_METHOD_STUB_LIST(ID_TO_STRING, ID_TO_STRING, ID_TO_STRING, ID_TO_STRING) 395 }; 396 #undef ID_TO_STRING 397 if (builtinId2Str2.count(id) > 0) { 398 return builtinId2Str2.at(id); 399 } 400 return "unnamed-builtin-"+std::to_string(id); 401 } 402 GetGlobalEnvFieldIndex(ID builtinId)403 static GlobalEnvField GetGlobalEnvFieldIndex(ID builtinId) 404 { 405 ASSERT(builtinId != kungfu::BuiltinsStubCSigns::ID::INVALID); 406 #define GET_BUILTIN_GLOBAL_ENV_FIELD_INDEX(type, name, index) \ 407 case kungfu::BuiltinsStubCSigns::ID::name: \ 408 return GlobalEnvField::index; 409 #define GET_BUILTIN_METHOD_STUB_INDEX_IMPL4(name, builtin, unused, index) \ 410 GET_BUILTIN_GLOBAL_ENV_FIELD_INDEX(unused, builtin##name, index##_INDEX) 411 #define GET_BUILTIN_METHOD_STUB_INDEX_IMPL6(name, builtin, unused0, unused1, unused2, index) \ 412 GET_BUILTIN_GLOBAL_ENV_FIELD_INDEX(unused0, builtin##name, index##_INDEX) 413 switch (builtinId) { 414 GLOBAL_ENV_INLINED_BUILTINS(GET_BUILTIN_GLOBAL_ENV_FIELD_INDEX) 415 BUILTINS_METHOD_STUB_LIST(GET_BUILTIN_METHOD_STUB_INDEX_IMPL4, GET_BUILTIN_METHOD_STUB_INDEX_IMPL4, 416 GET_BUILTIN_METHOD_STUB_INDEX_IMPL4, GET_BUILTIN_METHOD_STUB_INDEX_IMPL6) 417 default: 418 LOG_ECMA(DEBUG) << "GetGlobalEnvFieldIndex Invalid Id:" << builtinId; 419 return GlobalEnvField::INVALID; 420 } 421 #undef SET_BUILTIN_METHOD_STUB_IMPL6 422 #undef SET_BUILTIN_METHOD_STUB_IMPL4 423 #undef SET_BUILTIN_FUNCTION_CASE 424 } 425 426 private: 427 static CallSignature callSigns_[NUM_OF_BUILTINS_STUBS_EXTEND]; 428 static CallSignature builtinsCSign_; 429 static CallSignature builtinsWithArgvCSign_; 430 }; 431 432 enum class BuiltinsArgs : size_t { 433 GLUE = 0, 434 NATIVECODE, 435 FUNC, 436 NEWTARGET, 437 THISVALUE, 438 NUMARGS, 439 ARG0_OR_ARGV, 440 ARG1, 441 ARG2, 442 NUM_OF_INPUTS, 443 }; 444 445 #define BUILTINS_STUB_ID(name) (::panda::ecmascript::kungfu::BuiltinsStubCSigns::ID::name) 446 // to distinguish with the positive method offset of js function 447 #define PGO_BUILTINS_STUB_ID(name) ((-1) * (::panda::ecmascript::kungfu::BuiltinsStubCSigns::ID::name)) 448 #define IS_TYPED_BUILTINS_ID(id) kungfu::BuiltinsStubCSigns::IsTypedBuiltin(id) 449 #define IS_TYPED_INLINE_BUILTINS_ID(id) kungfu::BuiltinsStubCSigns::IsTypedInlineBuiltin(id) 450 #define IS_TYPED_BUILTINS_NUMBER_ID(id) kungfu::BuiltinsStubCSigns::IsTypedBuiltinNumber(id) 451 #define IS_TYPED_BUILTINS_GLOBAL_ID(id) kungfu::BuiltinsStubCSigns::IsTypedBuiltinGlobal(id) 452 #define IS_TYPED_BUILTINS_ID_CALL_THIS0(id) kungfu::BuiltinsStubCSigns::IsTypedBuiltinCallThis0(id) 453 #define IS_TYPED_BUILTINS_ID_CALL_THIS1(id) kungfu::BuiltinsStubCSigns::IsTypedBuiltinCallThis1(id) 454 #define IS_TYPED_BUILTINS_ID_CALL_THIS2(id) kungfu::BuiltinsStubCSigns::IsTypedBuiltinCallThis2(id) 455 #define IS_TYPED_BUILTINS_ID_CALL_THIS3(id) kungfu::BuiltinsStubCSigns::IsTypedBuiltinCallThis3(id) 456 #define GET_TYPED_ENV_FIELD_INEDX(id) kungfu::BuiltinsStubCSigns::GetGlobalEnvFieldIndex(id) 457 #define IS_INVALID_ID(id) kungfu::BuiltinsStubCSigns::CheckBuiltinsIdInvalid(id) 458 #define GET_TYPED_GLOBAL_ENV_INDEX(id) kungfu::BuiltinsStubCSigns::GetGlobalEnvIndex(id) 459 #define IS_SIDE_EFFECT_BUILTINS_ID(id) kungfu::BuiltinsStubCSigns::IsSideEffectBuiltin(id) 460 } // namespace panda::ecmascript::kungfu 461 #endif // ECMASCRIPT_COMPILER_BUILTINS_CALL_SIGNATURE_H 462