OLD | NEW |
---|---|
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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_RUNTIME_RUNTIME_H_ | 5 #ifndef V8_RUNTIME_RUNTIME_H_ |
6 #define V8_RUNTIME_RUNTIME_H_ | 6 #define V8_RUNTIME_RUNTIME_H_ |
7 | 7 |
8 #include "src/allocation.h" | 8 #include "src/allocation.h" |
9 #include "src/objects.h" | 9 #include "src/objects.h" |
10 #include "src/zone.h" | 10 #include "src/zone.h" |
11 | 11 |
12 namespace v8 { | 12 namespace v8 { |
13 namespace internal { | 13 namespace internal { |
14 | 14 |
15 // The interface to C++ runtime functions. | 15 // The interface to C++ runtime functions. |
16 | 16 |
17 // ---------------------------------------------------------------------------- | 17 // ---------------------------------------------------------------------------- |
18 // RUNTIME_FUNCTION_LIST_ALWAYS defines runtime calls available in both | |
19 // release and debug mode. | |
20 // This macro should only be used by the macro RUNTIME_FUNCTION_LIST. | |
21 | |
22 // WARNING: RUNTIME_FUNCTION_LIST_ALWAYS_* is a very large macro that caused | 18 // WARNING: RUNTIME_FUNCTION_LIST_ALWAYS_* is a very large macro that caused |
23 // MSVC Intellisense to crash. It was broken into two macros to work around | 19 // MSVC Intellisense to crash. It was broken into two macros to work around |
24 // this problem. Please avoid large recursive macros whenever possible. | 20 // this problem. Please avoid large recursive macros whenever possible. |
25 #define RUNTIME_FUNCTION_LIST_ALWAYS_1(F) \ | 21 #define RUNTIME_FUNCTION_LIST_ALWAYS_1(F) \ |
26 /* Property access */ \ | 22 /* Property access */ \ |
27 F(GetProperty, 2, 1) \ | 23 F(GetProperty, 2, 1) \ |
28 F(KeyedGetProperty, 2, 1) \ | 24 F(KeyedGetProperty, 2, 1) \ |
29 F(DeleteProperty, 3, 1) \ | 25 F(DeleteProperty, 3, 1) \ |
30 F(HasOwnProperty, 2, 1) \ | 26 F(HasOwnProperty, 2, 1) \ |
31 F(HasProperty, 2, 1) \ | 27 F(HasProperty, 2, 1) \ |
(...skipping 591 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
623 F(BreakIteratorFirst, 1, 1) \ | 619 F(BreakIteratorFirst, 1, 1) \ |
624 F(BreakIteratorNext, 1, 1) \ | 620 F(BreakIteratorNext, 1, 1) \ |
625 F(BreakIteratorCurrent, 1, 1) \ | 621 F(BreakIteratorCurrent, 1, 1) \ |
626 F(BreakIteratorBreakType, 1, 1) | 622 F(BreakIteratorBreakType, 1, 1) |
627 | 623 |
628 #else | 624 #else |
629 #define RUNTIME_FUNCTION_LIST_I18N_SUPPORT(F) | 625 #define RUNTIME_FUNCTION_LIST_I18N_SUPPORT(F) |
630 #endif | 626 #endif |
631 | 627 |
632 | 628 |
633 // ---------------------------------------------------------------------------- | |
634 // RUNTIME_FUNCTION_LIST defines all runtime functions accessed | |
635 // either directly by id (via the code generator), or indirectly | |
636 // via a native call by name (from within JS code). | |
637 // Entries have the form F(name, number of arguments, number of return values). | |
638 | |
639 #define RUNTIME_FUNCTION_LIST_RETURN_OBJECT(F) \ | 629 #define RUNTIME_FUNCTION_LIST_RETURN_OBJECT(F) \ |
640 RUNTIME_FUNCTION_LIST_ALWAYS_1(F) \ | 630 RUNTIME_FUNCTION_LIST_ALWAYS_1(F) \ |
641 RUNTIME_FUNCTION_LIST_ALWAYS_2(F) \ | 631 RUNTIME_FUNCTION_LIST_ALWAYS_2(F) \ |
642 RUNTIME_FUNCTION_LIST_ALWAYS_3(F) \ | 632 RUNTIME_FUNCTION_LIST_ALWAYS_3(F) \ |
643 RUNTIME_FUNCTION_LIST_DEBUGGER(F) \ | 633 RUNTIME_FUNCTION_LIST_DEBUGGER(F) \ |
644 RUNTIME_FUNCTION_LIST_I18N_SUPPORT(F) | 634 RUNTIME_FUNCTION_LIST_I18N_SUPPORT(F) |
645 | 635 |
646 | 636 |
637 // RUNTIME_FUNCTION_LIST_ defines the intrinsics typically implemented only | |
638 // as runtime functions. The come in 2 flavors, either returning an object or | |
Michael Starzinger
2015/03/11 12:57:33
nit: s/The/These/ in the comment.
Sven Panne
2015/03/11 13:40:34
Done.
| |
639 // returning a pair. | |
640 // Entries have the form F(name, number of arguments, number of return values). | |
647 #define RUNTIME_FUNCTION_LIST(F) \ | 641 #define RUNTIME_FUNCTION_LIST(F) \ |
648 RUNTIME_FUNCTION_LIST_RETURN_OBJECT(F) \ | 642 RUNTIME_FUNCTION_LIST_RETURN_OBJECT(F) \ |
649 RUNTIME_FUNCTION_LIST_RETURN_PAIR(F) | 643 RUNTIME_FUNCTION_LIST_RETURN_PAIR(F) |
650 | 644 |
645 | |
651 // ---------------------------------------------------------------------------- | 646 // ---------------------------------------------------------------------------- |
652 // INLINE_FUNCTION_LIST defines all inlined functions accessed | 647 // INLINE_FUNCTION_LIST defines the intrinsics typically handled specially by |
653 // with a native call of the form %_name from within JS code. | 648 // the various compilers. |
654 // Entries have the form F(name, number of arguments, number of return values). | 649 // Entries have the form F(name, number of arguments, number of return values). |
655 #define INLINE_FUNCTION_LIST(F) \ | 650 #define INLINE_FUNCTION_LIST(F) \ |
656 F(IsSmi, 1, 1) \ | 651 F(IsSmi, 1, 1) \ |
657 F(IsNonNegativeSmi, 1, 1) \ | 652 F(IsNonNegativeSmi, 1, 1) \ |
658 F(IsArray, 1, 1) \ | 653 F(IsArray, 1, 1) \ |
659 F(IsRegExp, 1, 1) \ | 654 F(IsRegExp, 1, 1) \ |
660 F(IsJSProxy, 1, 1) \ | 655 F(IsJSProxy, 1, 1) \ |
661 F(IsConstructCall, 0, 1) \ | 656 F(IsConstructCall, 0, 1) \ |
662 F(CallFunction, -1 /* receiver + n args + function */, 1) \ | 657 F(CallFunction, -1 /* receiver + n args + function */, 1) \ |
663 F(DefaultConstructorCallSuper, 0, 1) \ | 658 F(DefaultConstructorCallSuper, 0, 1) \ |
(...skipping 26 matching lines...) Expand all Loading... | |
690 F(SubString, 3, 1) \ | 685 F(SubString, 3, 1) \ |
691 F(StringCompare, 2, 1) \ | 686 F(StringCompare, 2, 1) \ |
692 F(RegExpExec, 4, 1) \ | 687 F(RegExpExec, 4, 1) \ |
693 F(RegExpConstructResult, 3, 1) \ | 688 F(RegExpConstructResult, 3, 1) \ |
694 F(GetFromCache, 2, 1) \ | 689 F(GetFromCache, 2, 1) \ |
695 F(NumberToString, 1, 1) \ | 690 F(NumberToString, 1, 1) \ |
696 F(DebugIsActive, 0, 1) | 691 F(DebugIsActive, 0, 1) |
697 | 692 |
698 | 693 |
699 // ---------------------------------------------------------------------------- | 694 // ---------------------------------------------------------------------------- |
700 // INLINE_OPTIMIZED_FUNCTION_LIST defines all inlined functions accessed | 695 // INLINE_OPTIMIZED_FUNCTION_LIST defines the intrinsics typically handled |
701 // with a native call of the form %_name from within JS code that also have | 696 // specially by Crankshaft. |
702 // a corresponding runtime function, that is called from non-optimized code. | |
703 // For the benefit of (fuzz) tests, the runtime version can also be called | |
704 // directly as %name (i.e. without the leading underscore). | |
705 // Entries have the form F(name, number of arguments, number of return values). | 697 // Entries have the form F(name, number of arguments, number of return values). |
706 #define INLINE_OPTIMIZED_FUNCTION_LIST(F) \ | 698 #define INLINE_OPTIMIZED_FUNCTION_LIST(F) \ |
707 /* Typed Arrays */ \ | 699 /* Typed Arrays */ \ |
708 F(TypedArrayInitialize, 5, 1) \ | 700 F(TypedArrayInitialize, 5, 1) \ |
709 F(DataViewInitialize, 4, 1) \ | 701 F(DataViewInitialize, 4, 1) \ |
710 F(MaxSmi, 0, 1) \ | 702 F(MaxSmi, 0, 1) \ |
711 F(TypedArrayMaxSizeInHeap, 0, 1) \ | 703 F(TypedArrayMaxSizeInHeap, 0, 1) \ |
712 F(ArrayBufferViewGetByteLength, 1, 1) \ | 704 F(ArrayBufferViewGetByteLength, 1, 1) \ |
713 F(ArrayBufferViewGetByteOffset, 1, 1) \ | 705 F(ArrayBufferViewGetByteOffset, 1, 1) \ |
714 F(TypedArrayGetLength, 1, 1) \ | 706 F(TypedArrayGetLength, 1, 1) \ |
(...skipping 18 matching lines...) Expand all Loading... | |
733 F(SetClear, 1, 1) \ | 725 F(SetClear, 1, 1) \ |
734 F(SetDelete, 2, 1) \ | 726 F(SetDelete, 2, 1) \ |
735 F(SetGetSize, 1, 1) \ | 727 F(SetGetSize, 1, 1) \ |
736 F(SetHas, 2, 1) \ | 728 F(SetHas, 2, 1) \ |
737 F(SetInitialize, 1, 1) \ | 729 F(SetInitialize, 1, 1) \ |
738 /* Arrays */ \ | 730 /* Arrays */ \ |
739 F(HasFastPackedElements, 1, 1) \ | 731 F(HasFastPackedElements, 1, 1) \ |
740 F(GetPrototype, 1, 1) | 732 F(GetPrototype, 1, 1) |
741 | 733 |
742 | 734 |
735 #define FOR_EACH_INTRINSIC(F) \ | |
736 RUNTIME_FUNCTION_LIST(F) \ | |
737 INLINE_FUNCTION_LIST(F) \ | |
738 INLINE_OPTIMIZED_FUNCTION_LIST(F) | |
739 | |
743 //--------------------------------------------------------------------------- | 740 //--------------------------------------------------------------------------- |
744 // Runtime provides access to all C++ runtime functions. | 741 // Runtime provides access to all C++ runtime functions. |
745 | 742 |
746 class RuntimeState { | 743 class RuntimeState { |
747 public: | 744 public: |
748 unibrow::Mapping<unibrow::ToUppercase, 128>* to_upper_mapping() { | 745 unibrow::Mapping<unibrow::ToUppercase, 128>* to_upper_mapping() { |
749 return &to_upper_mapping_; | 746 return &to_upper_mapping_; |
750 } | 747 } |
751 unibrow::Mapping<unibrow::ToLowercase, 128>* to_lower_mapping() { | 748 unibrow::Mapping<unibrow::ToLowercase, 128>* to_lower_mapping() { |
752 return &to_lower_mapping_; | 749 return &to_lower_mapping_; |
(...skipping 12 matching lines...) Expand all Loading... | |
765 | 762 |
766 | 763 |
767 class JavaScriptFrameIterator; // Forward declaration. | 764 class JavaScriptFrameIterator; // Forward declaration. |
768 | 765 |
769 | 766 |
770 class Runtime : public AllStatic { | 767 class Runtime : public AllStatic { |
771 public: | 768 public: |
772 enum FunctionId { | 769 enum FunctionId { |
773 #define F(name, nargs, ressize) k##name, | 770 #define F(name, nargs, ressize) k##name, |
774 #define I(name, nargs, ressize) kInline##name, | 771 #define I(name, nargs, ressize) kInline##name, |
775 RUNTIME_FUNCTION_LIST(F) INLINE_FUNCTION_LIST(F) | 772 FOR_EACH_INTRINSIC(F) FOR_EACH_INTRINSIC(I) |
776 INLINE_OPTIMIZED_FUNCTION_LIST(F) RUNTIME_FUNCTION_LIST(I) | |
777 INLINE_FUNCTION_LIST(I) INLINE_OPTIMIZED_FUNCTION_LIST(I) | |
778 #undef I | 773 #undef I |
779 #undef F | 774 #undef F |
780 kNumFunctions, | 775 kNumFunctions, |
781 // TODO(svenpanne) The values below are cruel hacks, remove them! | |
782 kFirstInlineFunction = kInlineIsSmi, | |
783 kLastInlineFunction = kInlineDebugIsActive | |
784 }; | 776 }; |
785 | 777 |
786 enum IntrinsicType { RUNTIME, INLINE }; | 778 enum IntrinsicType { RUNTIME, INLINE }; |
787 | 779 |
788 // Intrinsic function descriptor. | 780 // Intrinsic function descriptor. |
789 struct Function { | 781 struct Function { |
790 FunctionId function_id; | 782 FunctionId function_id; |
791 IntrinsicType intrinsic_type; | 783 IntrinsicType intrinsic_type; |
792 // The JS name of the function. | 784 // The JS name of the function. |
793 const char* name; | 785 const char* name; |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
904 | 896 |
905 class DeclareGlobalsEvalFlag : public BitField<bool, 0, 1> {}; | 897 class DeclareGlobalsEvalFlag : public BitField<bool, 0, 1> {}; |
906 class DeclareGlobalsNativeFlag : public BitField<bool, 1, 1> {}; | 898 class DeclareGlobalsNativeFlag : public BitField<bool, 1, 1> {}; |
907 STATIC_ASSERT(LANGUAGE_END == 3); | 899 STATIC_ASSERT(LANGUAGE_END == 3); |
908 class DeclareGlobalsLanguageMode : public BitField<LanguageMode, 2, 2> {}; | 900 class DeclareGlobalsLanguageMode : public BitField<LanguageMode, 2, 2> {}; |
909 | 901 |
910 } // namespace internal | 902 } // namespace internal |
911 } // namespace v8 | 903 } // namespace v8 |
912 | 904 |
913 #endif // V8_RUNTIME_RUNTIME_H_ | 905 #endif // V8_RUNTIME_RUNTIME_H_ |
OLD | NEW |