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