1 2 // Copyright 2011 the V8 project authors. All rights reserved. 3 // Use of this source code is governed by a BSD-style license that can be 4 // found in the LICENSE file. 5 6 #ifndef V8_BUILTINS_H_ 7 #define V8_BUILTINS_H_ 8 9 #include "src/base/flags.h" 10 #include "src/handles.h" 11 12 namespace v8 { 13 namespace internal { 14 15 // Forward declarations. 16 class CodeStubAssembler; 17 18 #define CODE_AGE_LIST_WITH_ARG(V, A) \ 19 V(Quadragenarian, A) \ 20 V(Quinquagenarian, A) \ 21 V(Sexagenarian, A) \ 22 V(Septuagenarian, A) \ 23 V(Octogenarian, A) 24 25 #define CODE_AGE_LIST_IGNORE_ARG(X, V) V(X) 26 27 #define CODE_AGE_LIST(V) \ 28 CODE_AGE_LIST_WITH_ARG(CODE_AGE_LIST_IGNORE_ARG, V) 29 30 #define CODE_AGE_LIST_COMPLETE(V) \ 31 V(ToBeExecutedOnce) \ 32 V(NotExecuted) \ 33 V(ExecutedOnce) \ 34 V(NoAge) \ 35 CODE_AGE_LIST_WITH_ARG(CODE_AGE_LIST_IGNORE_ARG, V) 36 37 #define DECLARE_CODE_AGE_BUILTIN(C, V) \ 38 V(Make##C##CodeYoungAgainOddMarking, BUILTIN, kNoExtraICState) \ 39 V(Make##C##CodeYoungAgainEvenMarking, BUILTIN, kNoExtraICState) 40 41 // Define list of builtins implemented in C++. 42 #define BUILTIN_LIST_C(V) \ 43 V(Illegal) \ 44 \ 45 V(EmptyFunction) \ 46 \ 47 V(ArrayConcat) \ 48 V(ArrayPop) \ 49 V(ArrayPush) \ 50 V(ArrayShift) \ 51 V(ArraySlice) \ 52 V(ArraySplice) \ 53 V(ArrayUnshift) \ 54 \ 55 V(ArrayBufferConstructor) \ 56 V(ArrayBufferConstructor_ConstructStub) \ 57 V(ArrayBufferIsView) \ 58 \ 59 V(BooleanConstructor) \ 60 V(BooleanConstructor_ConstructStub) \ 61 V(BooleanPrototypeToString) \ 62 V(BooleanPrototypeValueOf) \ 63 \ 64 V(DataViewConstructor) \ 65 V(DataViewConstructor_ConstructStub) \ 66 V(DataViewPrototypeGetBuffer) \ 67 V(DataViewPrototypeGetByteLength) \ 68 V(DataViewPrototypeGetByteOffset) \ 69 \ 70 V(DateConstructor) \ 71 V(DateConstructor_ConstructStub) \ 72 V(DateNow) \ 73 V(DateParse) \ 74 V(DateUTC) \ 75 V(DatePrototypeSetDate) \ 76 V(DatePrototypeSetFullYear) \ 77 V(DatePrototypeSetHours) \ 78 V(DatePrototypeSetMilliseconds) \ 79 V(DatePrototypeSetMinutes) \ 80 V(DatePrototypeSetMonth) \ 81 V(DatePrototypeSetSeconds) \ 82 V(DatePrototypeSetTime) \ 83 V(DatePrototypeSetUTCDate) \ 84 V(DatePrototypeSetUTCFullYear) \ 85 V(DatePrototypeSetUTCHours) \ 86 V(DatePrototypeSetUTCMilliseconds) \ 87 V(DatePrototypeSetUTCMinutes) \ 88 V(DatePrototypeSetUTCMonth) \ 89 V(DatePrototypeSetUTCSeconds) \ 90 V(DatePrototypeToDateString) \ 91 V(DatePrototypeToISOString) \ 92 V(DatePrototypeToPrimitive) \ 93 V(DatePrototypeToUTCString) \ 94 V(DatePrototypeToString) \ 95 V(DatePrototypeToTimeString) \ 96 V(DatePrototypeValueOf) \ 97 V(DatePrototypeGetYear) \ 98 V(DatePrototypeSetYear) \ 99 V(DatePrototypeToJson) \ 100 \ 101 V(FunctionConstructor) \ 102 V(FunctionPrototypeBind) \ 103 V(FunctionPrototypeToString) \ 104 \ 105 V(GeneratorFunctionConstructor) \ 106 V(AsyncFunctionConstructor) \ 107 \ 108 V(GlobalDecodeURI) \ 109 V(GlobalDecodeURIComponent) \ 110 V(GlobalEncodeURI) \ 111 V(GlobalEncodeURIComponent) \ 112 V(GlobalEscape) \ 113 V(GlobalUnescape) \ 114 \ 115 V(GlobalEval) \ 116 \ 117 V(JsonParse) \ 118 V(JsonStringify) \ 119 \ 120 V(MathAcos) \ 121 V(MathAsin) \ 122 V(MathFround) \ 123 V(MathImul) \ 124 \ 125 V(ObjectAssign) \ 126 V(ObjectCreate) \ 127 V(ObjectDefineGetter) \ 128 V(ObjectDefineProperties) \ 129 V(ObjectDefineProperty) \ 130 V(ObjectDefineSetter) \ 131 V(ObjectEntries) \ 132 V(ObjectFreeze) \ 133 V(ObjectGetOwnPropertyDescriptor) \ 134 V(ObjectGetOwnPropertyDescriptors) \ 135 V(ObjectGetOwnPropertyNames) \ 136 V(ObjectGetOwnPropertySymbols) \ 137 V(ObjectGetPrototypeOf) \ 138 V(ObjectIs) \ 139 V(ObjectIsExtensible) \ 140 V(ObjectIsFrozen) \ 141 V(ObjectIsSealed) \ 142 V(ObjectKeys) \ 143 V(ObjectLookupGetter) \ 144 V(ObjectLookupSetter) \ 145 V(ObjectPreventExtensions) \ 146 V(ObjectProtoToString) \ 147 V(ObjectSeal) \ 148 V(ObjectValues) \ 149 \ 150 V(ProxyConstructor) \ 151 V(ProxyConstructor_ConstructStub) \ 152 \ 153 V(ReflectDefineProperty) \ 154 V(ReflectDeleteProperty) \ 155 V(ReflectGet) \ 156 V(ReflectGetOwnPropertyDescriptor) \ 157 V(ReflectGetPrototypeOf) \ 158 V(ReflectHas) \ 159 V(ReflectIsExtensible) \ 160 V(ReflectOwnKeys) \ 161 V(ReflectPreventExtensions) \ 162 V(ReflectSet) \ 163 V(ReflectSetPrototypeOf) \ 164 \ 165 V(StringFromCodePoint) \ 166 \ 167 V(StringPrototypeTrim) \ 168 V(StringPrototypeTrimLeft) \ 169 V(StringPrototypeTrimRight) \ 170 \ 171 V(SymbolConstructor) \ 172 V(SymbolConstructor_ConstructStub) \ 173 \ 174 V(TypedArrayPrototypeBuffer) \ 175 \ 176 V(HandleApiCall) \ 177 V(HandleApiCallAsFunction) \ 178 V(HandleApiCallAsConstructor) \ 179 \ 180 V(RestrictedFunctionPropertiesThrower) \ 181 V(RestrictedStrictArgumentsPropertiesThrower) 182 183 // Define list of builtins implemented in assembly. 184 #define BUILTIN_LIST_A(V) \ 185 V(AllocateInNewSpace, BUILTIN, kNoExtraICState) \ 186 V(AllocateInOldSpace, BUILTIN, kNoExtraICState) \ 187 \ 188 V(ArgumentsAdaptorTrampoline, BUILTIN, kNoExtraICState) \ 189 \ 190 V(ConstructedNonConstructable, BUILTIN, kNoExtraICState) \ 191 \ 192 V(CallFunction_ReceiverIsNullOrUndefined, BUILTIN, kNoExtraICState) \ 193 V(CallFunction_ReceiverIsNotNullOrUndefined, BUILTIN, kNoExtraICState) \ 194 V(CallFunction_ReceiverIsAny, BUILTIN, kNoExtraICState) \ 195 V(TailCallFunction_ReceiverIsNullOrUndefined, BUILTIN, kNoExtraICState) \ 196 V(TailCallFunction_ReceiverIsNotNullOrUndefined, BUILTIN, kNoExtraICState) \ 197 V(TailCallFunction_ReceiverIsAny, BUILTIN, kNoExtraICState) \ 198 V(CallBoundFunction, BUILTIN, kNoExtraICState) \ 199 V(TailCallBoundFunction, BUILTIN, kNoExtraICState) \ 200 V(Call_ReceiverIsNullOrUndefined, BUILTIN, kNoExtraICState) \ 201 V(Call_ReceiverIsNotNullOrUndefined, BUILTIN, kNoExtraICState) \ 202 V(Call_ReceiverIsAny, BUILTIN, kNoExtraICState) \ 203 V(TailCall_ReceiverIsNullOrUndefined, BUILTIN, kNoExtraICState) \ 204 V(TailCall_ReceiverIsNotNullOrUndefined, BUILTIN, kNoExtraICState) \ 205 V(TailCall_ReceiverIsAny, BUILTIN, kNoExtraICState) \ 206 \ 207 V(ConstructFunction, BUILTIN, kNoExtraICState) \ 208 V(ConstructBoundFunction, BUILTIN, kNoExtraICState) \ 209 V(ConstructProxy, BUILTIN, kNoExtraICState) \ 210 V(Construct, BUILTIN, kNoExtraICState) \ 211 \ 212 V(StringToNumber, BUILTIN, kNoExtraICState) \ 213 V(NonNumberToNumber, BUILTIN, kNoExtraICState) \ 214 V(ToNumber, BUILTIN, kNoExtraICState) \ 215 \ 216 V(Apply, BUILTIN, kNoExtraICState) \ 217 \ 218 V(HandleFastApiCall, BUILTIN, kNoExtraICState) \ 219 \ 220 V(InOptimizationQueue, BUILTIN, kNoExtraICState) \ 221 V(JSConstructStubGeneric, BUILTIN, kNoExtraICState) \ 222 V(JSBuiltinsConstructStub, BUILTIN, kNoExtraICState) \ 223 V(JSBuiltinsConstructStubForDerived, BUILTIN, kNoExtraICState) \ 224 V(JSConstructStubApi, BUILTIN, kNoExtraICState) \ 225 V(JSEntryTrampoline, BUILTIN, kNoExtraICState) \ 226 V(JSConstructEntryTrampoline, BUILTIN, kNoExtraICState) \ 227 V(ResumeGeneratorTrampoline, BUILTIN, kNoExtraICState) \ 228 V(CompileLazy, BUILTIN, kNoExtraICState) \ 229 V(CompileBaseline, BUILTIN, kNoExtraICState) \ 230 V(CompileOptimized, BUILTIN, kNoExtraICState) \ 231 V(CompileOptimizedConcurrent, BUILTIN, kNoExtraICState) \ 232 V(NotifyDeoptimized, BUILTIN, kNoExtraICState) \ 233 V(NotifySoftDeoptimized, BUILTIN, kNoExtraICState) \ 234 V(NotifyLazyDeoptimized, BUILTIN, kNoExtraICState) \ 235 V(NotifyStubFailure, BUILTIN, kNoExtraICState) \ 236 V(NotifyStubFailureSaveDoubles, BUILTIN, kNoExtraICState) \ 237 \ 238 V(InterpreterEntryTrampoline, BUILTIN, kNoExtraICState) \ 239 V(InterpreterMarkBaselineOnReturn, BUILTIN, kNoExtraICState) \ 240 V(InterpreterPushArgsAndCall, BUILTIN, kNoExtraICState) \ 241 V(InterpreterPushArgsAndTailCall, BUILTIN, kNoExtraICState) \ 242 V(InterpreterPushArgsAndConstruct, BUILTIN, kNoExtraICState) \ 243 V(InterpreterEnterBytecodeDispatch, BUILTIN, kNoExtraICState) \ 244 \ 245 V(KeyedLoadIC_Miss, BUILTIN, kNoExtraICState) \ 246 V(StoreIC_Miss, BUILTIN, kNoExtraICState) \ 247 V(KeyedStoreIC_Miss, BUILTIN, kNoExtraICState) \ 248 V(LoadIC_Getter_ForDeopt, LOAD_IC, kNoExtraICState) \ 249 V(KeyedLoadIC_Megamorphic, KEYED_LOAD_IC, kNoExtraICState) \ 250 \ 251 V(StoreIC_Setter_ForDeopt, STORE_IC, StoreICState::kStrictModeState) \ 252 \ 253 V(KeyedStoreIC_Megamorphic, KEYED_STORE_IC, kNoExtraICState) \ 254 V(KeyedStoreIC_Megamorphic_Strict, KEYED_STORE_IC, \ 255 StoreICState::kStrictModeState) \ 256 \ 257 V(DatePrototypeGetDate, BUILTIN, kNoExtraICState) \ 258 V(DatePrototypeGetDay, BUILTIN, kNoExtraICState) \ 259 V(DatePrototypeGetFullYear, BUILTIN, kNoExtraICState) \ 260 V(DatePrototypeGetHours, BUILTIN, kNoExtraICState) \ 261 V(DatePrototypeGetMilliseconds, BUILTIN, kNoExtraICState) \ 262 V(DatePrototypeGetMinutes, BUILTIN, kNoExtraICState) \ 263 V(DatePrototypeGetMonth, BUILTIN, kNoExtraICState) \ 264 V(DatePrototypeGetSeconds, BUILTIN, kNoExtraICState) \ 265 V(DatePrototypeGetTime, BUILTIN, kNoExtraICState) \ 266 V(DatePrototypeGetTimezoneOffset, BUILTIN, kNoExtraICState) \ 267 V(DatePrototypeGetUTCDate, BUILTIN, kNoExtraICState) \ 268 V(DatePrototypeGetUTCDay, BUILTIN, kNoExtraICState) \ 269 V(DatePrototypeGetUTCFullYear, BUILTIN, kNoExtraICState) \ 270 V(DatePrototypeGetUTCHours, BUILTIN, kNoExtraICState) \ 271 V(DatePrototypeGetUTCMilliseconds, BUILTIN, kNoExtraICState) \ 272 V(DatePrototypeGetUTCMinutes, BUILTIN, kNoExtraICState) \ 273 V(DatePrototypeGetUTCMonth, BUILTIN, kNoExtraICState) \ 274 V(DatePrototypeGetUTCSeconds, BUILTIN, kNoExtraICState) \ 275 \ 276 V(FunctionPrototypeApply, BUILTIN, kNoExtraICState) \ 277 V(FunctionPrototypeCall, BUILTIN, kNoExtraICState) \ 278 \ 279 V(ReflectApply, BUILTIN, kNoExtraICState) \ 280 V(ReflectConstruct, BUILTIN, kNoExtraICState) \ 281 \ 282 V(InternalArrayCode, BUILTIN, kNoExtraICState) \ 283 V(ArrayCode, BUILTIN, kNoExtraICState) \ 284 \ 285 V(MathMax, BUILTIN, kNoExtraICState) \ 286 V(MathMin, BUILTIN, kNoExtraICState) \ 287 \ 288 V(NumberConstructor, BUILTIN, kNoExtraICState) \ 289 V(NumberConstructor_ConstructStub, BUILTIN, kNoExtraICState) \ 290 \ 291 V(StringConstructor, BUILTIN, kNoExtraICState) \ 292 V(StringConstructor_ConstructStub, BUILTIN, kNoExtraICState) \ 293 \ 294 V(OnStackReplacement, BUILTIN, kNoExtraICState) \ 295 V(InterruptCheck, BUILTIN, kNoExtraICState) \ 296 V(StackCheck, BUILTIN, kNoExtraICState) \ 297 \ 298 V(MarkCodeAsToBeExecutedOnce, BUILTIN, kNoExtraICState) \ 299 V(MarkCodeAsExecutedOnce, BUILTIN, kNoExtraICState) \ 300 V(MarkCodeAsExecutedTwice, BUILTIN, kNoExtraICState) \ 301 CODE_AGE_LIST_WITH_ARG(DECLARE_CODE_AGE_BUILTIN, V) 302 303 // Define list of builtins implemented in TurboFan (with JS linkage). 304 #define BUILTIN_LIST_T(V) \ 305 V(FunctionPrototypeHasInstance, 2) \ 306 V(GeneratorPrototypeNext, 2) \ 307 V(GeneratorPrototypeReturn, 2) \ 308 V(GeneratorPrototypeThrow, 2) \ 309 V(MathAtan, 2) \ 310 V(MathAtan2, 3) \ 311 V(MathAtanh, 2) \ 312 V(MathCeil, 2) \ 313 V(MathCbrt, 2) \ 314 V(MathExpm1, 2) \ 315 V(MathClz32, 2) \ 316 V(MathCos, 2) \ 317 V(MathExp, 2) \ 318 V(MathFloor, 2) \ 319 V(MathLog, 2) \ 320 V(MathLog1p, 2) \ 321 V(MathLog2, 2) \ 322 V(MathLog10, 2) \ 323 V(MathRound, 2) \ 324 V(MathSin, 2) \ 325 V(MathTan, 2) \ 326 V(MathSqrt, 2) \ 327 V(MathTrunc, 2) \ 328 V(ObjectHasOwnProperty, 2) \ 329 V(ArrayIsArray, 2) \ 330 V(StringFromCharCode, 2) \ 331 V(StringPrototypeCharAt, 2) \ 332 V(StringPrototypeCharCodeAt, 2) \ 333 V(TypedArrayPrototypeByteLength, 1) \ 334 V(TypedArrayPrototypeByteOffset, 1) \ 335 V(TypedArrayPrototypeLength, 1) \ 336 V(AtomicsLoad, 3) \ 337 V(AtomicsStore, 4) 338 339 // Define list of builtins implemented in TurboFan (with CallStub linkage). 340 #define BUILTIN_LIST_S(V) \ 341 V(LoadGlobalIC_Miss, BUILTIN, kNoExtraICState, LoadGlobalWithVector) \ 342 V(LoadGlobalIC_Slow, HANDLER, Code::LOAD_GLOBAL_IC, LoadGlobalWithVector) \ 343 V(LoadIC_Miss, BUILTIN, kNoExtraICState, LoadWithVector) \ 344 V(LoadIC_Slow, HANDLER, Code::LOAD_IC, LoadWithVector) 345 346 // Define list of builtin handlers implemented in assembly. 347 #define BUILTIN_LIST_H(V) \ 348 V(KeyedLoadIC_Slow, KEYED_LOAD_IC) \ 349 V(StoreIC_Slow, STORE_IC) \ 350 V(KeyedStoreIC_Slow, KEYED_STORE_IC) \ 351 V(LoadIC_Normal, LOAD_IC) \ 352 V(StoreIC_Normal, STORE_IC) 353 354 // Define list of builtins used by the debugger implemented in assembly. 355 #define BUILTIN_LIST_DEBUG_A(V) \ 356 V(Return_DebugBreak, BUILTIN, kNoExtraICState) \ 357 V(Slot_DebugBreak, BUILTIN, kNoExtraICState) \ 358 V(FrameDropper_LiveEdit, BUILTIN, kNoExtraICState) 359 360 class BuiltinFunctionTable; 361 class ObjectVisitor; 362 363 364 class Builtins { 365 public: 366 ~Builtins(); 367 368 // Generate all builtin code objects. Should be called once during 369 // isolate initialization. 370 void SetUp(Isolate* isolate, bool create_heap_objects); 371 void TearDown(); 372 373 // Garbage collection support. 374 void IterateBuiltins(ObjectVisitor* v); 375 376 // Disassembler support. 377 const char* Lookup(byte* pc); 378 379 enum Name { 380 #define DEF_ENUM_C(name) k##name, 381 #define DEF_ENUM_A(name, kind, extra) k##name, 382 #define DEF_ENUM_T(name, argc) k##name, 383 #define DEF_ENUM_S(name, kind, extra, interface_descriptor) k##name, 384 #define DEF_ENUM_H(name, kind) k##name, 385 BUILTIN_LIST_C(DEF_ENUM_C) BUILTIN_LIST_A(DEF_ENUM_A) 386 BUILTIN_LIST_T(DEF_ENUM_T) BUILTIN_LIST_S(DEF_ENUM_S) 387 BUILTIN_LIST_H(DEF_ENUM_H) BUILTIN_LIST_DEBUG_A(DEF_ENUM_A) 388 #undef DEF_ENUM_C 389 #undef DEF_ENUM_A 390 #undef DEF_ENUM_T 391 #undef DEF_ENUM_S 392 #undef DEF_ENUM_H 393 builtin_count 394 }; 395 396 enum CFunctionId { 397 #define DEF_ENUM_C(name) c_##name, 398 BUILTIN_LIST_C(DEF_ENUM_C) 399 #undef DEF_ENUM_C 400 cfunction_count 401 }; 402 403 #define DECLARE_BUILTIN_ACCESSOR_C(name) Handle<Code> name(); 404 #define DECLARE_BUILTIN_ACCESSOR_A(name, kind, extra) Handle<Code> name(); 405 #define DECLARE_BUILTIN_ACCESSOR_T(name, argc) Handle<Code> name(); 406 #define DECLARE_BUILTIN_ACCESSOR_S(name, kind, extra, interface_descriptor) \ 407 Handle<Code> name(); 408 #define DECLARE_BUILTIN_ACCESSOR_H(name, kind) Handle<Code> name(); 409 BUILTIN_LIST_C(DECLARE_BUILTIN_ACCESSOR_C) 410 BUILTIN_LIST_A(DECLARE_BUILTIN_ACCESSOR_A) 411 BUILTIN_LIST_T(DECLARE_BUILTIN_ACCESSOR_T) 412 BUILTIN_LIST_S(DECLARE_BUILTIN_ACCESSOR_S) 413 BUILTIN_LIST_H(DECLARE_BUILTIN_ACCESSOR_H) 414 BUILTIN_LIST_DEBUG_A(DECLARE_BUILTIN_ACCESSOR_A) 415 #undef DECLARE_BUILTIN_ACCESSOR_C 416 #undef DECLARE_BUILTIN_ACCESSOR_A 417 #undef DECLARE_BUILTIN_ACCESSOR_T 418 #undef DECLARE_BUILTIN_ACCESSOR_S 419 #undef DECLARE_BUILTIN_ACCESSOR_H 420 421 // Convenience wrappers. 422 Handle<Code> CallFunction( 423 ConvertReceiverMode = ConvertReceiverMode::kAny, 424 TailCallMode tail_call_mode = TailCallMode::kDisallow); 425 Handle<Code> Call(ConvertReceiverMode = ConvertReceiverMode::kAny, 426 TailCallMode tail_call_mode = TailCallMode::kDisallow); 427 Handle<Code> CallBoundFunction(TailCallMode tail_call_mode); 428 Handle<Code> InterpreterPushArgsAndCall(TailCallMode tail_call_mode); 429 builtin(Name name)430 Code* builtin(Name name) { 431 // Code::cast cannot be used here since we access builtins 432 // during the marking phase of mark sweep. See IC::Clear. 433 return reinterpret_cast<Code*>(builtins_[name]); 434 } 435 builtin_address(Name name)436 Address builtin_address(Name name) { 437 return reinterpret_cast<Address>(&builtins_[name]); 438 } 439 c_function_address(CFunctionId id)440 static Address c_function_address(CFunctionId id) { 441 return c_functions_[id]; 442 } 443 name(int index)444 const char* name(int index) { 445 DCHECK(index >= 0); 446 DCHECK(index < builtin_count); 447 return names_[index]; 448 } 449 is_initialized()450 bool is_initialized() const { return initialized_; } 451 452 MUST_USE_RESULT static MaybeHandle<Object> InvokeApiFunction( 453 Isolate* isolate, Handle<HeapObject> function, Handle<Object> receiver, 454 int argc, Handle<Object> args[]); 455 456 private: 457 Builtins(); 458 459 // The external C++ functions called from the code. 460 static Address const c_functions_[cfunction_count]; 461 462 // Note: These are always Code objects, but to conform with 463 // IterateBuiltins() above which assumes Object**'s for the callback 464 // function f, we use an Object* array here. 465 Object* builtins_[builtin_count]; 466 const char* names_[builtin_count]; 467 468 static void Generate_Adaptor(MacroAssembler* masm, CFunctionId id); 469 static void Generate_AllocateInNewSpace(MacroAssembler* masm); 470 static void Generate_AllocateInOldSpace(MacroAssembler* masm); 471 static void Generate_ConstructedNonConstructable(MacroAssembler* masm); 472 static void Generate_CompileLazy(MacroAssembler* masm); 473 static void Generate_CompileBaseline(MacroAssembler* masm); 474 static void Generate_InOptimizationQueue(MacroAssembler* masm); 475 static void Generate_CompileOptimized(MacroAssembler* masm); 476 static void Generate_CompileOptimizedConcurrent(MacroAssembler* masm); 477 static void Generate_JSConstructStubGeneric(MacroAssembler* masm); 478 static void Generate_JSBuiltinsConstructStub(MacroAssembler* masm); 479 static void Generate_JSBuiltinsConstructStubForDerived(MacroAssembler* masm); 480 static void Generate_JSConstructStubApi(MacroAssembler* masm); 481 static void Generate_JSEntryTrampoline(MacroAssembler* masm); 482 static void Generate_JSConstructEntryTrampoline(MacroAssembler* masm); 483 static void Generate_ResumeGeneratorTrampoline(MacroAssembler* masm); 484 static void Generate_NotifyDeoptimized(MacroAssembler* masm); 485 static void Generate_NotifySoftDeoptimized(MacroAssembler* masm); 486 static void Generate_NotifyLazyDeoptimized(MacroAssembler* masm); 487 static void Generate_NotifyStubFailure(MacroAssembler* masm); 488 static void Generate_NotifyStubFailureSaveDoubles(MacroAssembler* masm); 489 static void Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm); 490 static void Generate_StringToNumber(MacroAssembler* masm); 491 static void Generate_NonNumberToNumber(MacroAssembler* masm); 492 static void Generate_ToNumber(MacroAssembler* masm); 493 494 static void Generate_Apply(MacroAssembler* masm); 495 496 // ES6 section 9.2.1 [[Call]] ( thisArgument, argumentsList) 497 static void Generate_CallFunction(MacroAssembler* masm, 498 ConvertReceiverMode mode, 499 TailCallMode tail_call_mode); Generate_CallFunction_ReceiverIsNullOrUndefined(MacroAssembler * masm)500 static void Generate_CallFunction_ReceiverIsNullOrUndefined( 501 MacroAssembler* masm) { 502 Generate_CallFunction(masm, ConvertReceiverMode::kNullOrUndefined, 503 TailCallMode::kDisallow); 504 } Generate_CallFunction_ReceiverIsNotNullOrUndefined(MacroAssembler * masm)505 static void Generate_CallFunction_ReceiverIsNotNullOrUndefined( 506 MacroAssembler* masm) { 507 Generate_CallFunction(masm, ConvertReceiverMode::kNotNullOrUndefined, 508 TailCallMode::kDisallow); 509 } Generate_CallFunction_ReceiverIsAny(MacroAssembler * masm)510 static void Generate_CallFunction_ReceiverIsAny(MacroAssembler* masm) { 511 Generate_CallFunction(masm, ConvertReceiverMode::kAny, 512 TailCallMode::kDisallow); 513 } Generate_TailCallFunction_ReceiverIsNullOrUndefined(MacroAssembler * masm)514 static void Generate_TailCallFunction_ReceiverIsNullOrUndefined( 515 MacroAssembler* masm) { 516 Generate_CallFunction(masm, ConvertReceiverMode::kNullOrUndefined, 517 TailCallMode::kAllow); 518 } Generate_TailCallFunction_ReceiverIsNotNullOrUndefined(MacroAssembler * masm)519 static void Generate_TailCallFunction_ReceiverIsNotNullOrUndefined( 520 MacroAssembler* masm) { 521 Generate_CallFunction(masm, ConvertReceiverMode::kNotNullOrUndefined, 522 TailCallMode::kAllow); 523 } Generate_TailCallFunction_ReceiverIsAny(MacroAssembler * masm)524 static void Generate_TailCallFunction_ReceiverIsAny(MacroAssembler* masm) { 525 Generate_CallFunction(masm, ConvertReceiverMode::kAny, 526 TailCallMode::kAllow); 527 } 528 // ES6 section 9.4.1.1 [[Call]] ( thisArgument, argumentsList) 529 static void Generate_CallBoundFunctionImpl(MacroAssembler* masm, 530 TailCallMode tail_call_mode); Generate_CallBoundFunction(MacroAssembler * masm)531 static void Generate_CallBoundFunction(MacroAssembler* masm) { 532 Generate_CallBoundFunctionImpl(masm, TailCallMode::kDisallow); 533 } Generate_TailCallBoundFunction(MacroAssembler * masm)534 static void Generate_TailCallBoundFunction(MacroAssembler* masm) { 535 Generate_CallBoundFunctionImpl(masm, TailCallMode::kAllow); 536 } 537 // ES6 section 7.3.12 Call(F, V, [argumentsList]) 538 static void Generate_Call(MacroAssembler* masm, ConvertReceiverMode mode, 539 TailCallMode tail_call_mode); Generate_Call_ReceiverIsNullOrUndefined(MacroAssembler * masm)540 static void Generate_Call_ReceiverIsNullOrUndefined(MacroAssembler* masm) { 541 Generate_Call(masm, ConvertReceiverMode::kNullOrUndefined, 542 TailCallMode::kDisallow); 543 } Generate_Call_ReceiverIsNotNullOrUndefined(MacroAssembler * masm)544 static void Generate_Call_ReceiverIsNotNullOrUndefined(MacroAssembler* masm) { 545 Generate_Call(masm, ConvertReceiverMode::kNotNullOrUndefined, 546 TailCallMode::kDisallow); 547 } Generate_Call_ReceiverIsAny(MacroAssembler * masm)548 static void Generate_Call_ReceiverIsAny(MacroAssembler* masm) { 549 Generate_Call(masm, ConvertReceiverMode::kAny, TailCallMode::kDisallow); 550 } Generate_TailCall_ReceiverIsNullOrUndefined(MacroAssembler * masm)551 static void Generate_TailCall_ReceiverIsNullOrUndefined( 552 MacroAssembler* masm) { 553 Generate_Call(masm, ConvertReceiverMode::kNullOrUndefined, 554 TailCallMode::kAllow); 555 } Generate_TailCall_ReceiverIsNotNullOrUndefined(MacroAssembler * masm)556 static void Generate_TailCall_ReceiverIsNotNullOrUndefined( 557 MacroAssembler* masm) { 558 Generate_Call(masm, ConvertReceiverMode::kNotNullOrUndefined, 559 TailCallMode::kAllow); 560 } Generate_TailCall_ReceiverIsAny(MacroAssembler * masm)561 static void Generate_TailCall_ReceiverIsAny(MacroAssembler* masm) { 562 Generate_Call(masm, ConvertReceiverMode::kAny, TailCallMode::kAllow); 563 } 564 565 // ES6 section 9.2.2 [[Construct]] ( argumentsList, newTarget) 566 static void Generate_ConstructFunction(MacroAssembler* masm); 567 // ES6 section 9.4.1.2 [[Construct]] (argumentsList, newTarget) 568 static void Generate_ConstructBoundFunction(MacroAssembler* masm); 569 // ES6 section 9.5.14 [[Construct]] ( argumentsList, newTarget) 570 static void Generate_ConstructProxy(MacroAssembler* masm); 571 // ES6 section 7.3.13 Construct (F, [argumentsList], [newTarget]) 572 static void Generate_Construct(MacroAssembler* masm); 573 574 static void Generate_HandleFastApiCall(MacroAssembler* masm); 575 576 static void Generate_DatePrototype_GetField(MacroAssembler* masm, 577 int field_index); 578 // ES6 section 20.3.4.2 Date.prototype.getDate ( ) 579 static void Generate_DatePrototypeGetDate(MacroAssembler* masm); 580 // ES6 section 20.3.4.3 Date.prototype.getDay ( ) 581 static void Generate_DatePrototypeGetDay(MacroAssembler* masm); 582 // ES6 section 20.3.4.4 Date.prototype.getFullYear ( ) 583 static void Generate_DatePrototypeGetFullYear(MacroAssembler* masm); 584 // ES6 section 20.3.4.5 Date.prototype.getHours ( ) 585 static void Generate_DatePrototypeGetHours(MacroAssembler* masm); 586 // ES6 section 20.3.4.6 Date.prototype.getMilliseconds ( ) 587 static void Generate_DatePrototypeGetMilliseconds(MacroAssembler* masm); 588 // ES6 section 20.3.4.7 Date.prototype.getMinutes ( ) 589 static void Generate_DatePrototypeGetMinutes(MacroAssembler* masm); 590 // ES6 section 20.3.4.8 Date.prototype.getMonth ( ) 591 static void Generate_DatePrototypeGetMonth(MacroAssembler* masm); 592 // ES6 section 20.3.4.9 Date.prototype.getSeconds ( ) 593 static void Generate_DatePrototypeGetSeconds(MacroAssembler* masm); 594 // ES6 section 20.3.4.10 Date.prototype.getTime ( ) 595 static void Generate_DatePrototypeGetTime(MacroAssembler* masm); 596 // ES6 section 20.3.4.11 Date.prototype.getTimezoneOffset ( ) 597 static void Generate_DatePrototypeGetTimezoneOffset(MacroAssembler* masm); 598 // ES6 section 20.3.4.12 Date.prototype.getUTCDate ( ) 599 static void Generate_DatePrototypeGetUTCDate(MacroAssembler* masm); 600 // ES6 section 20.3.4.13 Date.prototype.getUTCDay ( ) 601 static void Generate_DatePrototypeGetUTCDay(MacroAssembler* masm); 602 // ES6 section 20.3.4.14 Date.prototype.getUTCFullYear ( ) 603 static void Generate_DatePrototypeGetUTCFullYear(MacroAssembler* masm); 604 // ES6 section 20.3.4.15 Date.prototype.getUTCHours ( ) 605 static void Generate_DatePrototypeGetUTCHours(MacroAssembler* masm); 606 // ES6 section 20.3.4.16 Date.prototype.getUTCMilliseconds ( ) 607 static void Generate_DatePrototypeGetUTCMilliseconds(MacroAssembler* masm); 608 // ES6 section 20.3.4.17 Date.prototype.getUTCMinutes ( ) 609 static void Generate_DatePrototypeGetUTCMinutes(MacroAssembler* masm); 610 // ES6 section 20.3.4.18 Date.prototype.getUTCMonth ( ) 611 static void Generate_DatePrototypeGetUTCMonth(MacroAssembler* masm); 612 // ES6 section 20.3.4.19 Date.prototype.getUTCSeconds ( ) 613 static void Generate_DatePrototypeGetUTCSeconds(MacroAssembler* masm); 614 615 static void Generate_FunctionPrototypeApply(MacroAssembler* masm); 616 static void Generate_FunctionPrototypeCall(MacroAssembler* masm); 617 618 static void Generate_ReflectApply(MacroAssembler* masm); 619 static void Generate_ReflectConstruct(MacroAssembler* masm); 620 621 static void Generate_InternalArrayCode(MacroAssembler* masm); 622 static void Generate_ArrayCode(MacroAssembler* masm); 623 624 // ES6 section 20.2.2.6 Math.atan ( x ) 625 static void Generate_MathAtan(CodeStubAssembler* assembler); 626 // ES6 section 20.2.2.8 Math.atan2 ( y, x ) 627 static void Generate_MathAtan2(CodeStubAssembler* assembler); 628 // ES6 section 20.2.2.7 Math.atanh ( x ) 629 static void Generate_MathAtanh(CodeStubAssembler* assembler); 630 // ES6 section 20.2.2.10 Math.ceil ( x ) 631 static void Generate_MathCeil(CodeStubAssembler* assembler); 632 // ES6 section 20.2.2.9 Math.ceil ( x ) 633 static void Generate_MathCbrt(CodeStubAssembler* assembler); 634 // ES6 section 20.2.2.15 Math.expm1 ( x ) 635 static void Generate_MathExpm1(CodeStubAssembler* assembler); 636 // ES6 section 20.2.2.11 Math.clz32 ( x ) 637 static void Generate_MathClz32(CodeStubAssembler* assembler); 638 // ES6 section 20.2.2.12 Math.cos ( x ) 639 static void Generate_MathCos(CodeStubAssembler* assembler); 640 // ES6 section 20.2.2.14 Math.exp ( x ) 641 static void Generate_MathExp(CodeStubAssembler* assembler); 642 // ES6 section 20.2.2.16 Math.floor ( x ) 643 static void Generate_MathFloor(CodeStubAssembler* assembler); 644 // ES6 section 20.2.2.20 Math.log ( x ) 645 static void Generate_MathLog(CodeStubAssembler* assembler); 646 // ES6 section 20.2.2.21 Math.log ( x ) 647 static void Generate_MathLog1p(CodeStubAssembler* assembler); 648 649 static void Generate_MathLog2(CodeStubAssembler* assembler); 650 static void Generate_MathLog10(CodeStubAssembler* assembler); 651 652 enum class MathMaxMinKind { kMax, kMin }; 653 static void Generate_MathMaxMin(MacroAssembler* masm, MathMaxMinKind kind); 654 // ES6 section 20.2.2.24 Math.max ( value1, value2 , ...values ) Generate_MathMax(MacroAssembler * masm)655 static void Generate_MathMax(MacroAssembler* masm) { 656 Generate_MathMaxMin(masm, MathMaxMinKind::kMax); 657 } 658 // ES6 section 20.2.2.25 Math.min ( value1, value2 , ...values ) Generate_MathMin(MacroAssembler * masm)659 static void Generate_MathMin(MacroAssembler* masm) { 660 Generate_MathMaxMin(masm, MathMaxMinKind::kMin); 661 } 662 // ES6 section 20.2.2.28 Math.round ( x ) 663 static void Generate_MathRound(CodeStubAssembler* assembler); 664 // ES6 section 20.2.2.20 Math.sin ( x ) 665 static void Generate_MathSin(CodeStubAssembler* assembler); 666 // ES6 section 20.2.2.32 Math.sqrt ( x ) 667 static void Generate_MathSqrt(CodeStubAssembler* assembler); 668 // ES6 section 20.2.2.33 Math.sin ( x ) 669 static void Generate_MathTan(CodeStubAssembler* assembler); 670 // ES6 section 20.2.2.35 Math.trunc ( x ) 671 static void Generate_MathTrunc(CodeStubAssembler* assembler); 672 673 // ES6 section 20.1.1.1 Number ( [ value ] ) for the [[Call]] case. 674 static void Generate_NumberConstructor(MacroAssembler* masm); 675 // ES6 section 20.1.1.1 Number ( [ value ] ) for the [[Construct]] case. 676 static void Generate_NumberConstructor_ConstructStub(MacroAssembler* masm); 677 678 // ES6 section 19.2.3.6 Function.prototype [ @@hasInstance ] ( V ) 679 static void Generate_FunctionPrototypeHasInstance( 680 CodeStubAssembler* assembler); 681 682 // ES6 section 25.3.1.2 Generator.prototype.next ( value ) 683 static void Generate_GeneratorPrototypeNext(CodeStubAssembler* assembler); 684 // ES6 section 25.3.1.3 Generator.prototype.return ( value ) 685 static void Generate_GeneratorPrototypeReturn(CodeStubAssembler* assembler); 686 // ES6 section 25.3.1.4 Generator.prototype.throw ( exception ) 687 static void Generate_GeneratorPrototypeThrow(CodeStubAssembler* assembler); 688 689 // ES6 section 19.1.3.2 Object.prototype.hasOwnProperty 690 static void Generate_ObjectHasOwnProperty(CodeStubAssembler* assembler); 691 692 // ES6 section 22.1.2.2 Array.isArray 693 static void Generate_ArrayIsArray(CodeStubAssembler* assembler); 694 695 // ES6 section 21.1.2.1 String.fromCharCode ( ...codeUnits ) 696 static void Generate_StringFromCharCode(CodeStubAssembler* assembler); 697 // ES6 section 21.1.3.1 String.prototype.charAt ( pos ) 698 static void Generate_StringPrototypeCharAt(CodeStubAssembler* assembler); 699 // ES6 section 21.1.3.2 String.prototype.charCodeAt ( pos ) 700 static void Generate_StringPrototypeCharCodeAt(CodeStubAssembler* assembler); 701 702 static void Generate_StringConstructor(MacroAssembler* masm); 703 static void Generate_StringConstructor_ConstructStub(MacroAssembler* masm); 704 705 // ES6 section 22.2.3.2 get %TypedArray%.prototype.byteLength 706 static void Generate_TypedArrayPrototypeByteLength( 707 CodeStubAssembler* assembler); 708 // ES6 section 22.2.3.3 get %TypedArray%.prototype.byteOffset 709 static void Generate_TypedArrayPrototypeByteOffset( 710 CodeStubAssembler* assembler); 711 // ES6 section 22.2.3.18 get %TypedArray%.prototype.length 712 static void Generate_TypedArrayPrototypeLength(CodeStubAssembler* assembler); 713 714 static void Generate_OnStackReplacement(MacroAssembler* masm); 715 static void Generate_InterruptCheck(MacroAssembler* masm); 716 static void Generate_StackCheck(MacroAssembler* masm); 717 718 static void Generate_InterpreterEntryTrampoline(MacroAssembler* masm); 719 static void Generate_InterpreterEnterBytecodeDispatch(MacroAssembler* masm); 720 static void Generate_InterpreterMarkBaselineOnReturn(MacroAssembler* masm); Generate_InterpreterPushArgsAndCall(MacroAssembler * masm)721 static void Generate_InterpreterPushArgsAndCall(MacroAssembler* masm) { 722 return Generate_InterpreterPushArgsAndCallImpl(masm, 723 TailCallMode::kDisallow); 724 } Generate_InterpreterPushArgsAndTailCall(MacroAssembler * masm)725 static void Generate_InterpreterPushArgsAndTailCall(MacroAssembler* masm) { 726 return Generate_InterpreterPushArgsAndCallImpl(masm, TailCallMode::kAllow); 727 } 728 static void Generate_InterpreterPushArgsAndCallImpl( 729 MacroAssembler* masm, TailCallMode tail_call_mode); 730 static void Generate_InterpreterPushArgsAndConstruct(MacroAssembler* masm); 731 732 #define DECLARE_CODE_AGE_BUILTIN_GENERATOR(C) \ 733 static void Generate_Make##C##CodeYoungAgainEvenMarking( \ 734 MacroAssembler* masm); \ 735 static void Generate_Make##C##CodeYoungAgainOddMarking( \ 736 MacroAssembler* masm); 737 CODE_AGE_LIST(DECLARE_CODE_AGE_BUILTIN_GENERATOR) 738 #undef DECLARE_CODE_AGE_BUILTIN_GENERATOR 739 740 static void Generate_MarkCodeAsToBeExecutedOnce(MacroAssembler* masm); 741 static void Generate_MarkCodeAsExecutedOnce(MacroAssembler* masm); 742 static void Generate_MarkCodeAsExecutedTwice(MacroAssembler* masm); 743 744 static void Generate_AtomicsLoad(CodeStubAssembler* assembler); 745 static void Generate_AtomicsStore(CodeStubAssembler* assembler); 746 747 static void InitBuiltinFunctionTable(); 748 749 bool initialized_; 750 751 friend class BuiltinFunctionTable; 752 friend class Isolate; 753 754 DISALLOW_COPY_AND_ASSIGN(Builtins); 755 }; 756 757 } // namespace internal 758 } // namespace v8 759 760 #endif // V8_BUILTINS_H_ 761