OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_BUILTINS_H_ | 5 #ifndef V8_BUILTINS_H_ |
6 #define V8_BUILTINS_H_ | 6 #define V8_BUILTINS_H_ |
7 | 7 |
8 #include "src/base/flags.h" | 8 #include "src/base/flags.h" |
9 #include "src/handles.h" | 9 #include "src/handles.h" |
10 | 10 |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
150 #define BUILTIN_LIST_A(V) \ | 150 #define BUILTIN_LIST_A(V) \ |
151 V(ArgumentsAdaptorTrampoline, BUILTIN, UNINITIALIZED, kNoExtraICState) \ | 151 V(ArgumentsAdaptorTrampoline, BUILTIN, UNINITIALIZED, kNoExtraICState) \ |
152 \ | 152 \ |
153 V(ConstructedNonConstructable, BUILTIN, UNINITIALIZED, kNoExtraICState) \ | 153 V(ConstructedNonConstructable, BUILTIN, UNINITIALIZED, kNoExtraICState) \ |
154 \ | 154 \ |
155 V(CallFunction_ReceiverIsNullOrUndefined, BUILTIN, UNINITIALIZED, \ | 155 V(CallFunction_ReceiverIsNullOrUndefined, BUILTIN, UNINITIALIZED, \ |
156 kNoExtraICState) \ | 156 kNoExtraICState) \ |
157 V(CallFunction_ReceiverIsNotNullOrUndefined, BUILTIN, UNINITIALIZED, \ | 157 V(CallFunction_ReceiverIsNotNullOrUndefined, BUILTIN, UNINITIALIZED, \ |
158 kNoExtraICState) \ | 158 kNoExtraICState) \ |
159 V(CallFunction_ReceiverIsAny, BUILTIN, UNINITIALIZED, kNoExtraICState) \ | 159 V(CallFunction_ReceiverIsAny, BUILTIN, UNINITIALIZED, kNoExtraICState) \ |
| 160 V(TailCallFunction_ReceiverIsNullOrUndefined, BUILTIN, UNINITIALIZED, \ |
| 161 kNoExtraICState) \ |
| 162 V(TailCallFunction_ReceiverIsNotNullOrUndefined, BUILTIN, UNINITIALIZED, \ |
| 163 kNoExtraICState) \ |
| 164 V(TailCallFunction_ReceiverIsAny, BUILTIN, UNINITIALIZED, kNoExtraICState) \ |
160 V(CallBoundFunction, BUILTIN, UNINITIALIZED, kNoExtraICState) \ | 165 V(CallBoundFunction, BUILTIN, UNINITIALIZED, kNoExtraICState) \ |
| 166 V(TailCallBoundFunction, BUILTIN, UNINITIALIZED, kNoExtraICState) \ |
161 V(Call_ReceiverIsNullOrUndefined, BUILTIN, UNINITIALIZED, kNoExtraICState) \ | 167 V(Call_ReceiverIsNullOrUndefined, BUILTIN, UNINITIALIZED, kNoExtraICState) \ |
162 V(Call_ReceiverIsNotNullOrUndefined, BUILTIN, UNINITIALIZED, \ | 168 V(Call_ReceiverIsNotNullOrUndefined, BUILTIN, UNINITIALIZED, \ |
163 kNoExtraICState) \ | 169 kNoExtraICState) \ |
164 V(Call_ReceiverIsAny, BUILTIN, UNINITIALIZED, kNoExtraICState) \ | 170 V(Call_ReceiverIsAny, BUILTIN, UNINITIALIZED, kNoExtraICState) \ |
| 171 V(TailCall_ReceiverIsNullOrUndefined, BUILTIN, UNINITIALIZED, \ |
| 172 kNoExtraICState) \ |
| 173 V(TailCall_ReceiverIsNotNullOrUndefined, BUILTIN, UNINITIALIZED, \ |
| 174 kNoExtraICState) \ |
| 175 V(TailCall_ReceiverIsAny, BUILTIN, UNINITIALIZED, kNoExtraICState) \ |
165 \ | 176 \ |
166 V(ConstructFunction, BUILTIN, UNINITIALIZED, kNoExtraICState) \ | 177 V(ConstructFunction, BUILTIN, UNINITIALIZED, kNoExtraICState) \ |
167 V(ConstructBoundFunction, BUILTIN, UNINITIALIZED, kNoExtraICState) \ | 178 V(ConstructBoundFunction, BUILTIN, UNINITIALIZED, kNoExtraICState) \ |
168 V(ConstructProxy, BUILTIN, UNINITIALIZED, kNoExtraICState) \ | 179 V(ConstructProxy, BUILTIN, UNINITIALIZED, kNoExtraICState) \ |
169 V(Construct, BUILTIN, UNINITIALIZED, kNoExtraICState) \ | 180 V(Construct, BUILTIN, UNINITIALIZED, kNoExtraICState) \ |
170 \ | 181 \ |
171 V(Apply, BUILTIN, UNINITIALIZED, kNoExtraICState) \ | 182 V(Apply, BUILTIN, UNINITIALIZED, kNoExtraICState) \ |
172 \ | 183 \ |
173 V(HandleFastApiCall, BUILTIN, UNINITIALIZED, kNoExtraICState) \ | 184 V(HandleFastApiCall, BUILTIN, UNINITIALIZED, kNoExtraICState) \ |
174 \ | 185 \ |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
330 Handle<Code> name(); | 341 Handle<Code> name(); |
331 #define DECLARE_BUILTIN_ACCESSOR_H(name, kind) Handle<Code> name(); | 342 #define DECLARE_BUILTIN_ACCESSOR_H(name, kind) Handle<Code> name(); |
332 BUILTIN_LIST_C(DECLARE_BUILTIN_ACCESSOR_C) | 343 BUILTIN_LIST_C(DECLARE_BUILTIN_ACCESSOR_C) |
333 BUILTIN_LIST_A(DECLARE_BUILTIN_ACCESSOR_A) | 344 BUILTIN_LIST_A(DECLARE_BUILTIN_ACCESSOR_A) |
334 BUILTIN_LIST_H(DECLARE_BUILTIN_ACCESSOR_H) | 345 BUILTIN_LIST_H(DECLARE_BUILTIN_ACCESSOR_H) |
335 BUILTIN_LIST_DEBUG_A(DECLARE_BUILTIN_ACCESSOR_A) | 346 BUILTIN_LIST_DEBUG_A(DECLARE_BUILTIN_ACCESSOR_A) |
336 #undef DECLARE_BUILTIN_ACCESSOR_C | 347 #undef DECLARE_BUILTIN_ACCESSOR_C |
337 #undef DECLARE_BUILTIN_ACCESSOR_A | 348 #undef DECLARE_BUILTIN_ACCESSOR_A |
338 | 349 |
339 // Convenience wrappers. | 350 // Convenience wrappers. |
340 Handle<Code> CallFunction(ConvertReceiverMode = ConvertReceiverMode::kAny); | 351 Handle<Code> CallFunction( |
341 Handle<Code> Call(ConvertReceiverMode = ConvertReceiverMode::kAny); | 352 ConvertReceiverMode = ConvertReceiverMode::kAny, |
| 353 TailCallMode tail_call_mode = TailCallMode::kDisallow); |
| 354 Handle<Code> Call(ConvertReceiverMode = ConvertReceiverMode::kAny, |
| 355 TailCallMode tail_call_mode = TailCallMode::kDisallow); |
| 356 Handle<Code> CallBoundFunction(TailCallMode tail_call_mode); |
342 | 357 |
343 Code* builtin(Name name) { | 358 Code* builtin(Name name) { |
344 // Code::cast cannot be used here since we access builtins | 359 // Code::cast cannot be used here since we access builtins |
345 // during the marking phase of mark sweep. See IC::Clear. | 360 // during the marking phase of mark sweep. See IC::Clear. |
346 return reinterpret_cast<Code*>(builtins_[name]); | 361 return reinterpret_cast<Code*>(builtins_[name]); |
347 } | 362 } |
348 | 363 |
349 Address builtin_address(Name name) { | 364 Address builtin_address(Name name) { |
350 return reinterpret_cast<Address>(&builtins_[name]); | 365 return reinterpret_cast<Address>(&builtins_[name]); |
351 } | 366 } |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
396 static void Generate_NotifySoftDeoptimized(MacroAssembler* masm); | 411 static void Generate_NotifySoftDeoptimized(MacroAssembler* masm); |
397 static void Generate_NotifyLazyDeoptimized(MacroAssembler* masm); | 412 static void Generate_NotifyLazyDeoptimized(MacroAssembler* masm); |
398 static void Generate_NotifyStubFailure(MacroAssembler* masm); | 413 static void Generate_NotifyStubFailure(MacroAssembler* masm); |
399 static void Generate_NotifyStubFailureSaveDoubles(MacroAssembler* masm); | 414 static void Generate_NotifyStubFailureSaveDoubles(MacroAssembler* masm); |
400 static void Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm); | 415 static void Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm); |
401 | 416 |
402 static void Generate_Apply(MacroAssembler* masm); | 417 static void Generate_Apply(MacroAssembler* masm); |
403 | 418 |
404 // ES6 section 9.2.1 [[Call]] ( thisArgument, argumentsList) | 419 // ES6 section 9.2.1 [[Call]] ( thisArgument, argumentsList) |
405 static void Generate_CallFunction(MacroAssembler* masm, | 420 static void Generate_CallFunction(MacroAssembler* masm, |
406 ConvertReceiverMode mode); | 421 ConvertReceiverMode mode, |
| 422 TailCallMode tail_call_mode); |
407 static void Generate_CallFunction_ReceiverIsNullOrUndefined( | 423 static void Generate_CallFunction_ReceiverIsNullOrUndefined( |
408 MacroAssembler* masm) { | 424 MacroAssembler* masm) { |
409 Generate_CallFunction(masm, ConvertReceiverMode::kNullOrUndefined); | 425 Generate_CallFunction(masm, ConvertReceiverMode::kNullOrUndefined, |
| 426 TailCallMode::kDisallow); |
410 } | 427 } |
411 static void Generate_CallFunction_ReceiverIsNotNullOrUndefined( | 428 static void Generate_CallFunction_ReceiverIsNotNullOrUndefined( |
412 MacroAssembler* masm) { | 429 MacroAssembler* masm) { |
413 Generate_CallFunction(masm, ConvertReceiverMode::kNotNullOrUndefined); | 430 Generate_CallFunction(masm, ConvertReceiverMode::kNotNullOrUndefined, |
| 431 TailCallMode::kDisallow); |
414 } | 432 } |
415 static void Generate_CallFunction_ReceiverIsAny(MacroAssembler* masm) { | 433 static void Generate_CallFunction_ReceiverIsAny(MacroAssembler* masm) { |
416 Generate_CallFunction(masm, ConvertReceiverMode::kAny); | 434 Generate_CallFunction(masm, ConvertReceiverMode::kAny, |
| 435 TailCallMode::kDisallow); |
| 436 } |
| 437 static void Generate_TailCallFunction_ReceiverIsNullOrUndefined( |
| 438 MacroAssembler* masm) { |
| 439 Generate_CallFunction(masm, ConvertReceiverMode::kNullOrUndefined, |
| 440 TailCallMode::kAllow); |
| 441 } |
| 442 static void Generate_TailCallFunction_ReceiverIsNotNullOrUndefined( |
| 443 MacroAssembler* masm) { |
| 444 Generate_CallFunction(masm, ConvertReceiverMode::kNotNullOrUndefined, |
| 445 TailCallMode::kAllow); |
| 446 } |
| 447 static void Generate_TailCallFunction_ReceiverIsAny(MacroAssembler* masm) { |
| 448 Generate_CallFunction(masm, ConvertReceiverMode::kAny, |
| 449 TailCallMode::kAllow); |
417 } | 450 } |
418 // ES6 section 9.4.1.1 [[Call]] ( thisArgument, argumentsList) | 451 // ES6 section 9.4.1.1 [[Call]] ( thisArgument, argumentsList) |
419 static void Generate_CallBoundFunction(MacroAssembler* masm); | 452 static void Generate_CallBoundFunctionImpl(MacroAssembler* masm, |
| 453 TailCallMode tail_call_mode); |
| 454 static void Generate_CallBoundFunction(MacroAssembler* masm) { |
| 455 Generate_CallBoundFunctionImpl(masm, TailCallMode::kDisallow); |
| 456 } |
| 457 static void Generate_TailCallBoundFunction(MacroAssembler* masm) { |
| 458 Generate_CallBoundFunctionImpl(masm, TailCallMode::kAllow); |
| 459 } |
420 // ES6 section 7.3.12 Call(F, V, [argumentsList]) | 460 // ES6 section 7.3.12 Call(F, V, [argumentsList]) |
421 static void Generate_Call(MacroAssembler* masm, ConvertReceiverMode mode); | 461 static void Generate_Call(MacroAssembler* masm, ConvertReceiverMode mode, |
| 462 TailCallMode tail_call_mode); |
422 static void Generate_Call_ReceiverIsNullOrUndefined(MacroAssembler* masm) { | 463 static void Generate_Call_ReceiverIsNullOrUndefined(MacroAssembler* masm) { |
423 Generate_Call(masm, ConvertReceiverMode::kNullOrUndefined); | 464 Generate_Call(masm, ConvertReceiverMode::kNullOrUndefined, |
| 465 TailCallMode::kDisallow); |
424 } | 466 } |
425 static void Generate_Call_ReceiverIsNotNullOrUndefined(MacroAssembler* masm) { | 467 static void Generate_Call_ReceiverIsNotNullOrUndefined(MacroAssembler* masm) { |
426 Generate_Call(masm, ConvertReceiverMode::kNotNullOrUndefined); | 468 Generate_Call(masm, ConvertReceiverMode::kNotNullOrUndefined, |
| 469 TailCallMode::kDisallow); |
427 } | 470 } |
428 static void Generate_Call_ReceiverIsAny(MacroAssembler* masm) { | 471 static void Generate_Call_ReceiverIsAny(MacroAssembler* masm) { |
429 Generate_Call(masm, ConvertReceiverMode::kAny); | 472 Generate_Call(masm, ConvertReceiverMode::kAny, TailCallMode::kDisallow); |
430 } | 473 } |
| 474 static void Generate_TailCall_ReceiverIsNullOrUndefined( |
| 475 MacroAssembler* masm) { |
| 476 Generate_Call(masm, ConvertReceiverMode::kNullOrUndefined, |
| 477 TailCallMode::kAllow); |
| 478 } |
| 479 static void Generate_TailCall_ReceiverIsNotNullOrUndefined( |
| 480 MacroAssembler* masm) { |
| 481 Generate_Call(masm, ConvertReceiverMode::kNotNullOrUndefined, |
| 482 TailCallMode::kAllow); |
| 483 } |
| 484 static void Generate_TailCall_ReceiverIsAny(MacroAssembler* masm) { |
| 485 Generate_Call(masm, ConvertReceiverMode::kAny, TailCallMode::kAllow); |
| 486 } |
| 487 |
431 | 488 |
432 // ES6 section 9.2.2 [[Construct]] ( argumentsList, newTarget) | 489 // ES6 section 9.2.2 [[Construct]] ( argumentsList, newTarget) |
433 static void Generate_ConstructFunction(MacroAssembler* masm); | 490 static void Generate_ConstructFunction(MacroAssembler* masm); |
434 // ES6 section 9.4.1.2 [[Construct]] (argumentsList, newTarget) | 491 // ES6 section 9.4.1.2 [[Construct]] (argumentsList, newTarget) |
435 static void Generate_ConstructBoundFunction(MacroAssembler* masm); | 492 static void Generate_ConstructBoundFunction(MacroAssembler* masm); |
436 // ES6 section 9.5.14 [[Construct]] ( argumentsList, newTarget) | 493 // ES6 section 9.5.14 [[Construct]] ( argumentsList, newTarget) |
437 static void Generate_ConstructProxy(MacroAssembler* masm); | 494 static void Generate_ConstructProxy(MacroAssembler* masm); |
438 // ES6 section 7.3.13 Construct (F, [argumentsList], [newTarget]) | 495 // ES6 section 7.3.13 Construct (F, [argumentsList], [newTarget]) |
439 static void Generate_Construct(MacroAssembler* masm); | 496 static void Generate_Construct(MacroAssembler* masm); |
440 | 497 |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
528 friend class BuiltinFunctionTable; | 585 friend class BuiltinFunctionTable; |
529 friend class Isolate; | 586 friend class Isolate; |
530 | 587 |
531 DISALLOW_COPY_AND_ASSIGN(Builtins); | 588 DISALLOW_COPY_AND_ASSIGN(Builtins); |
532 }; | 589 }; |
533 | 590 |
534 } // namespace internal | 591 } // namespace internal |
535 } // namespace v8 | 592 } // namespace v8 |
536 | 593 |
537 #endif // V8_BUILTINS_H_ | 594 #endif // V8_BUILTINS_H_ |
OLD | NEW |