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 #include "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/bootstrapper.h" | 7 #include "src/bootstrapper.h" |
8 #include "src/code-stubs.h" | 8 #include "src/code-stubs.h" |
9 #include "src/cpu-profiler.h" | 9 #include "src/cpu-profiler.h" |
10 #include "src/factory.h" | 10 #include "src/factory.h" |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
170 return Handle<Code>(code, isolate()); | 170 return Handle<Code>(code, isolate()); |
171 } | 171 } |
172 | 172 |
173 | 173 |
174 const char* CodeStub::MajorName(CodeStub::Major major_key, | 174 const char* CodeStub::MajorName(CodeStub::Major major_key, |
175 bool allow_unknown_keys) { | 175 bool allow_unknown_keys) { |
176 switch (major_key) { | 176 switch (major_key) { |
177 #define DEF_CASE(name) case name: return #name "Stub"; | 177 #define DEF_CASE(name) case name: return #name "Stub"; |
178 CODE_STUB_LIST(DEF_CASE) | 178 CODE_STUB_LIST(DEF_CASE) |
179 #undef DEF_CASE | 179 #undef DEF_CASE |
180 case UninitializedMajorKey: return "<UninitializedMajorKey>Stub"; | |
181 case NoCache: | 180 case NoCache: |
182 return "<NoCache>Stub"; | 181 return "<NoCache>Stub"; |
183 default: | 182 case NUMBER_OF_IDS: |
184 if (!allow_unknown_keys) { | 183 UNREACHABLE(); |
185 UNREACHABLE(); | |
186 } | |
187 return NULL; | 184 return NULL; |
188 } | 185 } |
186 return NULL; | |
189 } | 187 } |
190 | 188 |
191 | 189 |
192 void CodeStub::PrintBaseName(OStream& os) const { // NOLINT | 190 void CodeStub::PrintBaseName(OStream& os) const { // NOLINT |
193 os << MajorName(MajorKey(), false); | 191 os << MajorName(MajorKey(), false); |
194 } | 192 } |
195 | 193 |
196 | 194 |
197 void CodeStub::PrintName(OStream& os) const { // NOLINT | 195 void CodeStub::PrintName(OStream& os) const { // NOLINT |
198 PrintBaseName(os); | 196 PrintBaseName(os); |
199 PrintState(os); | 197 PrintState(os); |
200 } | 198 } |
201 | 199 |
202 | 200 |
201 void CodeStub::Dispatch(Isolate* isolate, uint32_t key, void** value_out, | |
mvstanton
2014/09/05 13:38:43
As we discussed, this is a better solution than ma
| |
202 DispatchedCall call) { | |
203 switch (MajorKeyFromKey(key)) { | |
204 #define DEF_CASE(NAME) \ | |
205 case NAME: { \ | |
206 NAME##Stub stub(key, isolate); \ | |
207 CodeStub* pstub = &stub; \ | |
208 call(pstub, value_out); \ | |
209 break; \ | |
210 } | |
211 CODE_STUB_LIST(DEF_CASE) | |
212 #undef DEF_CASE | |
213 case NUMBER_OF_IDS: | |
214 UNREACHABLE(); | |
215 case NoCache: | |
216 *value_out = NULL; | |
217 break; | |
218 } | |
219 } | |
220 | |
221 | |
222 static void GetInterfaceDescriptorDispatchedCall(CodeStub* stub, | |
223 void** value_out) { | |
224 CodeStubInterfaceDescriptor* descriptor_out = | |
225 reinterpret_cast<CodeStubInterfaceDescriptor*>(value_out); | |
226 stub->InitializeInterfaceDescriptor(descriptor_out); | |
227 } | |
228 | |
229 | |
230 void CodeStub::InitializeInterfaceDescriptor( | |
231 Isolate* isolate, uint32_t key, CodeStubInterfaceDescriptor* desc) { | |
232 void** value_out = reinterpret_cast<void**>(desc); | |
233 Dispatch(isolate, key, value_out, &GetInterfaceDescriptorDispatchedCall); | |
234 } | |
235 | |
236 | |
203 // static | 237 // static |
204 void BinaryOpICStub::GenerateAheadOfTime(Isolate* isolate) { | 238 void BinaryOpICStub::GenerateAheadOfTime(Isolate* isolate) { |
205 // Generate the uninitialized versions of the stub. | 239 // Generate the uninitialized versions of the stub. |
206 for (int op = Token::BIT_OR; op <= Token::MOD; ++op) { | 240 for (int op = Token::BIT_OR; op <= Token::MOD; ++op) { |
207 for (int mode = NO_OVERWRITE; mode <= OVERWRITE_RIGHT; ++mode) { | 241 for (int mode = NO_OVERWRITE; mode <= OVERWRITE_RIGHT; ++mode) { |
208 BinaryOpICStub stub(isolate, | 242 BinaryOpICStub stub(isolate, |
209 static_cast<Token::Value>(op), | 243 static_cast<Token::Value>(op), |
210 static_cast<OverwriteMode>(mode)); | 244 static_cast<OverwriteMode>(mode)); |
211 stub.GetCode(); | 245 stub.GetCode(); |
212 } | 246 } |
(...skipping 708 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
921 | 955 |
922 void ProfileEntryHookStub::EntryHookTrampoline(intptr_t function, | 956 void ProfileEntryHookStub::EntryHookTrampoline(intptr_t function, |
923 intptr_t stack_pointer, | 957 intptr_t stack_pointer, |
924 Isolate* isolate) { | 958 Isolate* isolate) { |
925 FunctionEntryHook entry_hook = isolate->function_entry_hook(); | 959 FunctionEntryHook entry_hook = isolate->function_entry_hook(); |
926 DCHECK(entry_hook != NULL); | 960 DCHECK(entry_hook != NULL); |
927 entry_hook(function, stack_pointer); | 961 entry_hook(function, stack_pointer); |
928 } | 962 } |
929 | 963 |
930 | 964 |
931 static void InstallDescriptor(Isolate* isolate, HydrogenCodeStub* stub) { | |
932 int major_key = stub->MajorKey(); | |
933 CodeStubInterfaceDescriptor* descriptor = | |
934 isolate->code_stub_interface_descriptor(major_key); | |
935 if (!descriptor->IsInitialized()) { | |
936 stub->InitializeInterfaceDescriptor(descriptor); | |
937 } | |
938 } | |
939 | |
940 | |
941 void ArrayConstructorStubBase::InstallDescriptors(Isolate* isolate) { | |
942 ArrayNoArgumentConstructorStub stub1(isolate, GetInitialFastElementsKind()); | |
943 InstallDescriptor(isolate, &stub1); | |
944 ArraySingleArgumentConstructorStub stub2(isolate, | |
945 GetInitialFastElementsKind()); | |
946 InstallDescriptor(isolate, &stub2); | |
947 ArrayNArgumentsConstructorStub stub3(isolate, GetInitialFastElementsKind()); | |
948 InstallDescriptor(isolate, &stub3); | |
949 } | |
950 | |
951 | |
952 void NumberToStringStub::InstallDescriptors(Isolate* isolate) { | |
953 NumberToStringStub stub(isolate); | |
954 InstallDescriptor(isolate, &stub); | |
955 } | |
956 | |
957 | |
958 void FastNewClosureStub::InstallDescriptors(Isolate* isolate) { | |
959 FastNewClosureStub stub(isolate, STRICT, false); | |
960 InstallDescriptor(isolate, &stub); | |
961 } | |
962 | |
963 | |
964 void FastNewContextStub::InstallDescriptors(Isolate* isolate) { | |
965 FastNewContextStub stub(isolate, FastNewContextStub::kMaximumSlots); | |
966 InstallDescriptor(isolate, &stub); | |
967 } | |
968 | |
969 | |
970 // static | |
971 void FastCloneShallowArrayStub::InstallDescriptors(Isolate* isolate) { | |
972 FastCloneShallowArrayStub stub(isolate, DONT_TRACK_ALLOCATION_SITE); | |
973 InstallDescriptor(isolate, &stub); | |
974 } | |
975 | |
976 | |
977 // static | |
978 void BinaryOpICStub::InstallDescriptors(Isolate* isolate) { | |
979 BinaryOpICStub stub(isolate, Token::ADD, NO_OVERWRITE); | |
980 InstallDescriptor(isolate, &stub); | |
981 } | |
982 | |
983 | |
984 // static | |
985 void BinaryOpWithAllocationSiteStub::InstallDescriptors(Isolate* isolate) { | |
986 BinaryOpWithAllocationSiteStub stub(isolate, Token::ADD, NO_OVERWRITE); | |
987 InstallDescriptor(isolate, &stub); | |
988 } | |
989 | |
990 | |
991 // static | |
992 void StringAddStub::InstallDescriptors(Isolate* isolate) { | |
993 StringAddStub stub(isolate, STRING_ADD_CHECK_NONE, NOT_TENURED); | |
994 InstallDescriptor(isolate, &stub); | |
995 } | |
996 | |
997 | |
998 // static | |
999 void RegExpConstructResultStub::InstallDescriptors(Isolate* isolate) { | |
1000 RegExpConstructResultStub stub(isolate); | |
1001 InstallDescriptor(isolate, &stub); | |
1002 } | |
1003 | |
1004 | |
1005 // static | |
1006 void KeyedLoadGenericStub::InstallDescriptors(Isolate* isolate) { | |
1007 KeyedLoadGenericStub stub(isolate); | |
1008 InstallDescriptor(isolate, &stub); | |
1009 } | |
1010 | |
1011 | |
1012 // static | |
1013 void StoreFieldStub::InstallDescriptors(Isolate* isolate) { | |
1014 StoreFieldStub stub(isolate, FieldIndex::ForInObjectOffset(0), | |
1015 Representation::None()); | |
1016 InstallDescriptor(isolate, &stub); | |
1017 } | |
1018 | |
1019 | |
1020 // static | |
1021 void LoadFastElementStub::InstallDescriptors(Isolate* isolate) { | |
1022 LoadFastElementStub stub(isolate, true, FAST_ELEMENTS); | |
1023 InstallDescriptor(isolate, &stub); | |
1024 } | |
1025 | |
1026 | |
1027 ArrayConstructorStub::ArrayConstructorStub(Isolate* isolate) | 965 ArrayConstructorStub::ArrayConstructorStub(Isolate* isolate) |
1028 : PlatformCodeStub(isolate) { | 966 : PlatformCodeStub(isolate) { |
1029 minor_key_ = ArgumentCountBits::encode(ANY); | 967 minor_key_ = ArgumentCountBits::encode(ANY); |
1030 ArrayConstructorStubBase::GenerateStubsAheadOfTime(isolate); | 968 ArrayConstructorStubBase::GenerateStubsAheadOfTime(isolate); |
1031 } | 969 } |
1032 | 970 |
1033 | 971 |
1034 ArrayConstructorStub::ArrayConstructorStub(Isolate* isolate, | 972 ArrayConstructorStub::ArrayConstructorStub(Isolate* isolate, |
1035 int argument_count) | 973 int argument_count) |
1036 : PlatformCodeStub(isolate) { | 974 : PlatformCodeStub(isolate) { |
1037 if (argument_count == 0) { | 975 if (argument_count == 0) { |
1038 minor_key_ = ArgumentCountBits::encode(NONE); | 976 minor_key_ = ArgumentCountBits::encode(NONE); |
1039 } else if (argument_count == 1) { | 977 } else if (argument_count == 1) { |
1040 minor_key_ = ArgumentCountBits::encode(ONE); | 978 minor_key_ = ArgumentCountBits::encode(ONE); |
1041 } else if (argument_count >= 2) { | 979 } else if (argument_count >= 2) { |
1042 minor_key_ = ArgumentCountBits::encode(MORE_THAN_ONE); | 980 minor_key_ = ArgumentCountBits::encode(MORE_THAN_ONE); |
1043 } else { | 981 } else { |
1044 UNREACHABLE(); | 982 UNREACHABLE(); |
1045 } | 983 } |
1046 ArrayConstructorStubBase::GenerateStubsAheadOfTime(isolate); | 984 ArrayConstructorStubBase::GenerateStubsAheadOfTime(isolate); |
1047 } | 985 } |
1048 | 986 |
1049 | 987 |
1050 void InternalArrayConstructorStubBase::InstallDescriptors(Isolate* isolate) { | |
1051 InternalArrayNoArgumentConstructorStub stub1(isolate, FAST_ELEMENTS); | |
1052 InstallDescriptor(isolate, &stub1); | |
1053 InternalArraySingleArgumentConstructorStub stub2(isolate, FAST_ELEMENTS); | |
1054 InstallDescriptor(isolate, &stub2); | |
1055 InternalArrayNArgumentsConstructorStub stub3(isolate, FAST_ELEMENTS); | |
1056 InstallDescriptor(isolate, &stub3); | |
1057 } | |
1058 | |
1059 InternalArrayConstructorStub::InternalArrayConstructorStub( | 988 InternalArrayConstructorStub::InternalArrayConstructorStub( |
1060 Isolate* isolate) : PlatformCodeStub(isolate) { | 989 Isolate* isolate) : PlatformCodeStub(isolate) { |
1061 InternalArrayConstructorStubBase::GenerateStubsAheadOfTime(isolate); | 990 InternalArrayConstructorStubBase::GenerateStubsAheadOfTime(isolate); |
1062 } | 991 } |
1063 | 992 |
1064 | 993 |
1065 } } // namespace v8::internal | 994 } } // namespace v8::internal |
OLD | NEW |