OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2017 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_BUILTINS_H_ | 5 #ifndef V8_BUILTINS_BUILTINS_DEFINITIONS_H_ |
6 #define V8_BUILTINS_BUILTINS_H_ | 6 #define V8_BUILTINS_BUILTINS_DEFINITIONS_H_ |
7 | |
8 #include "src/base/flags.h" | |
9 #include "src/globals.h" | |
10 | 7 |
11 namespace v8 { | 8 namespace v8 { |
12 namespace internal { | 9 namespace internal { |
13 | 10 |
14 class Callable; | |
15 template <typename T> | |
16 class Handle; | |
17 class Isolate; | |
18 | |
19 #define CODE_AGE_LIST_WITH_ARG(V, A) \ | 11 #define CODE_AGE_LIST_WITH_ARG(V, A) \ |
20 V(Quadragenarian, A) \ | 12 V(Quadragenarian, A) \ |
21 V(Quinquagenarian, A) \ | 13 V(Quinquagenarian, A) \ |
22 V(Sexagenarian, A) \ | 14 V(Sexagenarian, A) \ |
23 V(Septuagenarian, A) \ | 15 V(Septuagenarian, A) \ |
24 V(Octogenarian, A) | 16 V(Octogenarian, A) |
25 | 17 |
26 #define CODE_AGE_LIST_IGNORE_ARG(X, V) V(X) | 18 #define CODE_AGE_LIST_IGNORE_ARG(X, V) V(X) |
27 | 19 |
28 #define CODE_AGE_LIST(V) CODE_AGE_LIST_WITH_ARG(CODE_AGE_LIST_IGNORE_ARG, V) | 20 #define CODE_AGE_LIST(V) CODE_AGE_LIST_WITH_ARG(CODE_AGE_LIST_IGNORE_ARG, V) |
(...skipping 932 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
961 #define BUILTIN_LIST_A(V) \ | 953 #define BUILTIN_LIST_A(V) \ |
962 BUILTIN_LIST(IGNORE_BUILTIN, IGNORE_BUILTIN, IGNORE_BUILTIN, IGNORE_BUILTIN, \ | 954 BUILTIN_LIST(IGNORE_BUILTIN, IGNORE_BUILTIN, IGNORE_BUILTIN, IGNORE_BUILTIN, \ |
963 IGNORE_BUILTIN, V, V) | 955 IGNORE_BUILTIN, V, V) |
964 | 956 |
965 #define BUILTIN_LIST_DBG(V) \ | 957 #define BUILTIN_LIST_DBG(V) \ |
966 BUILTIN_LIST(IGNORE_BUILTIN, IGNORE_BUILTIN, IGNORE_BUILTIN, IGNORE_BUILTIN, \ | 958 BUILTIN_LIST(IGNORE_BUILTIN, IGNORE_BUILTIN, IGNORE_BUILTIN, IGNORE_BUILTIN, \ |
967 IGNORE_BUILTIN, IGNORE_BUILTIN, V) | 959 IGNORE_BUILTIN, IGNORE_BUILTIN, V) |
968 | 960 |
969 #define BUILTINS_WITH_UNTAGGED_PARAMS(V) V(WasmCompileLazy) | 961 #define BUILTINS_WITH_UNTAGGED_PARAMS(V) V(WasmCompileLazy) |
970 | 962 |
971 // Forward declarations. | |
972 class ObjectVisitor; | |
973 enum class InterpreterPushArgsMode : unsigned; | |
974 namespace compiler { | |
975 class CodeAssemblerState; | |
976 } | |
977 | |
978 class Builtins { | |
979 public: | |
980 ~Builtins(); | |
981 | |
982 // Generate all builtin code objects. Should be called once during | |
983 // isolate initialization. | |
984 void SetUp(Isolate* isolate, bool create_heap_objects); | |
985 void TearDown(); | |
986 | |
987 // Garbage collection support. | |
988 void IterateBuiltins(ObjectVisitor* v); | |
989 | |
990 // Disassembler support. | |
991 const char* Lookup(byte* pc); | |
992 | |
993 enum Name : int32_t { | |
994 #define DEF_ENUM(Name, ...) k##Name, | |
995 BUILTIN_LIST_ALL(DEF_ENUM) | |
996 #undef DEF_ENUM | |
997 builtin_count | |
998 }; | |
999 | |
1000 #define DECLARE_BUILTIN_ACCESSOR(Name, ...) \ | |
1001 V8_EXPORT_PRIVATE Handle<Code> Name(); | |
1002 BUILTIN_LIST_ALL(DECLARE_BUILTIN_ACCESSOR) | |
1003 #undef DECLARE_BUILTIN_ACCESSOR | |
1004 | |
1005 // Convenience wrappers. | |
1006 Handle<Code> CallFunction( | |
1007 ConvertReceiverMode = ConvertReceiverMode::kAny, | |
1008 TailCallMode tail_call_mode = TailCallMode::kDisallow); | |
1009 Handle<Code> Call(ConvertReceiverMode = ConvertReceiverMode::kAny, | |
1010 TailCallMode tail_call_mode = TailCallMode::kDisallow); | |
1011 Handle<Code> CallBoundFunction(TailCallMode tail_call_mode); | |
1012 Handle<Code> NonPrimitiveToPrimitive( | |
1013 ToPrimitiveHint hint = ToPrimitiveHint::kDefault); | |
1014 Handle<Code> OrdinaryToPrimitive(OrdinaryToPrimitiveHint hint); | |
1015 Handle<Code> InterpreterPushArgsAndCall(TailCallMode tail_call_mode, | |
1016 InterpreterPushArgsMode mode); | |
1017 Handle<Code> InterpreterPushArgsAndConstruct(InterpreterPushArgsMode mode); | |
1018 Handle<Code> NewFunctionContext(ScopeType scope_type); | |
1019 Handle<Code> NewCloneShallowArray(AllocationSiteMode allocation_mode); | |
1020 Handle<Code> NewCloneShallowObject(int length); | |
1021 | |
1022 Code* builtin(Name name) { | |
1023 // Code::cast cannot be used here since we access builtins | |
1024 // during the marking phase of mark sweep. See IC::Clear. | |
1025 return reinterpret_cast<Code*>(builtins_[name]); | |
1026 } | |
1027 | |
1028 Address builtin_address(Name name) { | |
1029 return reinterpret_cast<Address>(&builtins_[name]); | |
1030 } | |
1031 | |
1032 static Callable CallableFor(Isolate* isolate, Name name); | |
1033 | |
1034 static const char* name(int index); | |
1035 | |
1036 // Returns the C++ entry point for builtins implemented in C++, and the null | |
1037 // Address otherwise. | |
1038 static Address CppEntryOf(int index); | |
1039 | |
1040 static bool IsCpp(int index); | |
1041 static bool IsApi(int index); | |
1042 static bool HasCppImplementation(int index); | |
1043 | |
1044 bool is_initialized() const { return initialized_; } | |
1045 | |
1046 MUST_USE_RESULT static MaybeHandle<Object> InvokeApiFunction( | |
1047 Isolate* isolate, bool is_construct, Handle<HeapObject> function, | |
1048 Handle<Object> receiver, int argc, Handle<Object> args[], | |
1049 Handle<HeapObject> new_target); | |
1050 | |
1051 enum ExitFrameType { EXIT, BUILTIN_EXIT }; | |
1052 | |
1053 static void Generate_Adaptor(MacroAssembler* masm, Address builtin_address, | |
1054 ExitFrameType exit_frame_type); | |
1055 | |
1056 static bool AllowDynamicFunction(Isolate* isolate, Handle<JSFunction> target, | |
1057 Handle<JSObject> target_global_proxy); | |
1058 | |
1059 private: | |
1060 Builtins(); | |
1061 | |
1062 static void Generate_CallFunction(MacroAssembler* masm, | |
1063 ConvertReceiverMode mode, | |
1064 TailCallMode tail_call_mode); | |
1065 | |
1066 static void Generate_CallBoundFunctionImpl(MacroAssembler* masm, | |
1067 TailCallMode tail_call_mode); | |
1068 | |
1069 static void Generate_Call(MacroAssembler* masm, ConvertReceiverMode mode, | |
1070 TailCallMode tail_call_mode); | |
1071 static void Generate_CallForwardVarargs(MacroAssembler* masm, | |
1072 Handle<Code> code); | |
1073 | |
1074 static void Generate_InterpreterPushArgsAndCallImpl( | |
1075 MacroAssembler* masm, TailCallMode tail_call_mode, | |
1076 InterpreterPushArgsMode mode); | |
1077 | |
1078 static void Generate_InterpreterPushArgsAndConstructImpl( | |
1079 MacroAssembler* masm, InterpreterPushArgsMode mode); | |
1080 | |
1081 #define DECLARE_ASM(Name, ...) \ | |
1082 static void Generate_##Name(MacroAssembler* masm); | |
1083 #define DECLARE_TF(Name, ...) \ | |
1084 static void Generate_##Name(compiler::CodeAssemblerState* state); | |
1085 | |
1086 BUILTIN_LIST(IGNORE_BUILTIN, IGNORE_BUILTIN, DECLARE_TF, DECLARE_TF, | |
1087 DECLARE_TF, DECLARE_ASM, DECLARE_ASM) | |
1088 | |
1089 #undef DECLARE_ASM | |
1090 #undef DECLARE_TF | |
1091 | |
1092 // Note: These are always Code objects, but to conform with | |
1093 // IterateBuiltins() above which assumes Object**'s for the callback | |
1094 // function f, we use an Object* array here. | |
1095 Object* builtins_[builtin_count]; | |
1096 bool initialized_; | |
1097 | |
1098 friend class Isolate; | |
1099 | |
1100 DISALLOW_COPY_AND_ASSIGN(Builtins); | |
1101 }; | |
1102 | |
1103 } // namespace internal | 963 } // namespace internal |
1104 } // namespace v8 | 964 } // namespace v8 |
1105 | 965 |
1106 #endif // V8_BUILTINS_BUILTINS_H_ | 966 #endif // V8_BUILTINS_BUILTINS_DEFINITIONS_H_ |
OLD | NEW |