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