OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
138 CODE_STUB_LIST(DEF_ENUM) | 138 CODE_STUB_LIST(DEF_ENUM) |
139 #undef DEF_ENUM | 139 #undef DEF_ENUM |
140 NoCache, // marker for stubs that do custom caching | 140 NoCache, // marker for stubs that do custom caching |
141 NUMBER_OF_IDS | 141 NUMBER_OF_IDS |
142 }; | 142 }; |
143 | 143 |
144 // Retrieve the code for the stub. Generate the code if needed. | 144 // Retrieve the code for the stub. Generate the code if needed. |
145 Handle<Code> GetCode(Isolate* isolate); | 145 Handle<Code> GetCode(Isolate* isolate); |
146 | 146 |
147 // Retrieve the code for the stub, make and return a copy of the code. | 147 // Retrieve the code for the stub, make and return a copy of the code. |
148 Handle<Code> GetCodeCopyFromTemplate(Isolate* isolate); | 148 Handle<Code> GetCodeCopy( |
| 149 Isolate* isolate, const Code::FindAndReplacePattern& pattern); |
| 150 |
149 static Major MajorKeyFromKey(uint32_t key) { | 151 static Major MajorKeyFromKey(uint32_t key) { |
150 return static_cast<Major>(MajorKeyBits::decode(key)); | 152 return static_cast<Major>(MajorKeyBits::decode(key)); |
151 } | 153 } |
152 static int MinorKeyFromKey(uint32_t key) { | 154 static int MinorKeyFromKey(uint32_t key) { |
153 return MinorKeyBits::decode(key); | 155 return MinorKeyBits::decode(key); |
154 } | 156 } |
155 | 157 |
156 // Gets the major key from a code object that is a code stub or binary op IC. | 158 // Gets the major key from a code object that is a code stub or binary op IC. |
157 static Major GetMajorKey(Code* code_stub) { | 159 static Major GetMajorKey(Code* code_stub) { |
158 return static_cast<Major>(code_stub->major_key()); | 160 return static_cast<Major>(code_stub->major_key()); |
(...skipping 833 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
992 explicit StoreGlobalStub(bool is_constant, bool check_global) { | 994 explicit StoreGlobalStub(bool is_constant, bool check_global) { |
993 bit_field_ = IsConstantBits::encode(is_constant) | | 995 bit_field_ = IsConstantBits::encode(is_constant) | |
994 CheckGlobalBits::encode(check_global); | 996 CheckGlobalBits::encode(check_global); |
995 } | 997 } |
996 | 998 |
997 static Handle<HeapObject> global_placeholder(Isolate* isolate) { | 999 static Handle<HeapObject> global_placeholder(Isolate* isolate) { |
998 return isolate->factory()->uninitialized_value(); | 1000 return isolate->factory()->uninitialized_value(); |
999 } | 1001 } |
1000 | 1002 |
1001 Handle<Code> GetCodeCopyFromTemplate(Isolate* isolate, | 1003 Handle<Code> GetCodeCopyFromTemplate(Isolate* isolate, |
1002 GlobalObject* global, | 1004 Handle<GlobalObject> global, |
1003 PropertyCell* cell) { | 1005 Handle<PropertyCell> cell) { |
1004 Handle<Code> code = CodeStub::GetCodeCopyFromTemplate(isolate); | |
1005 if (check_global()) { | 1006 if (check_global()) { |
1006 // Replace the placeholder cell and global object map with the actual | 1007 Code::FindAndReplacePattern pattern; |
1007 // global cell and receiver map. | 1008 pattern.Add(Handle<Map>(global_placeholder(isolate)->map()), global); |
1008 code->ReplaceNthObject(1, global_placeholder(isolate)->map(), global); | 1009 pattern.Add(isolate->factory()->meta_map(), Handle<Map>(global->map())); |
1009 code->ReplaceNthObject(1, isolate->heap()->meta_map(), global->map()); | 1010 pattern.Add(isolate->factory()->global_property_cell_map(), cell); |
| 1011 return CodeStub::GetCodeCopy(isolate, pattern); |
| 1012 } else { |
| 1013 Code::FindAndReplacePattern pattern; |
| 1014 pattern.Add(isolate->factory()->global_property_cell_map(), cell); |
| 1015 return CodeStub::GetCodeCopy(isolate, pattern); |
1010 } | 1016 } |
1011 Map* cell_map = isolate->heap()->global_property_cell_map(); | |
1012 code->ReplaceNthObject(1, cell_map, cell); | |
1013 return code; | |
1014 } | 1017 } |
1015 | 1018 |
1016 virtual Code::Kind kind() const { return Code::STORE_IC; } | 1019 virtual Code::Kind kind() const { return Code::STORE_IC; } |
1017 | 1020 |
1018 virtual Handle<Code> GenerateCode(Isolate* isolate); | 1021 virtual Handle<Code> GenerateCode(Isolate* isolate); |
1019 | 1022 |
1020 virtual void InitializeInterfaceDescriptor( | 1023 virtual void InitializeInterfaceDescriptor( |
1021 Isolate* isolate, | 1024 Isolate* isolate, |
1022 CodeStubInterfaceDescriptor* descriptor); | 1025 CodeStubInterfaceDescriptor* descriptor); |
1023 | 1026 |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1188 // call support for stubs in Hydrogen. | 1191 // call support for stubs in Hydrogen. |
1189 class BinaryOpICWithAllocationSiteStub V8_FINAL : public PlatformCodeStub { | 1192 class BinaryOpICWithAllocationSiteStub V8_FINAL : public PlatformCodeStub { |
1190 public: | 1193 public: |
1191 explicit BinaryOpICWithAllocationSiteStub(const BinaryOpIC::State& state) | 1194 explicit BinaryOpICWithAllocationSiteStub(const BinaryOpIC::State& state) |
1192 : state_(state) {} | 1195 : state_(state) {} |
1193 | 1196 |
1194 static void GenerateAheadOfTime(Isolate* isolate); | 1197 static void GenerateAheadOfTime(Isolate* isolate); |
1195 | 1198 |
1196 Handle<Code> GetCodeCopyFromTemplate(Isolate* isolate, | 1199 Handle<Code> GetCodeCopyFromTemplate(Isolate* isolate, |
1197 Handle<AllocationSite> allocation_site) { | 1200 Handle<AllocationSite> allocation_site) { |
1198 Handle<Code> code = CodeStub::GetCodeCopyFromTemplate(isolate); | 1201 Code::FindAndReplacePattern pattern; |
1199 // Replace the placeholder oddball with the actual allocation site. | 1202 pattern.Add(isolate->factory()->oddball_map(), allocation_site); |
1200 code->ReplaceNthObject(1, isolate->heap()->oddball_map(), *allocation_site); | 1203 return CodeStub::GetCodeCopy(isolate, pattern); |
1201 return code; | |
1202 } | 1204 } |
1203 | 1205 |
1204 virtual Code::Kind GetCodeKind() const V8_OVERRIDE { | 1206 virtual Code::Kind GetCodeKind() const V8_OVERRIDE { |
1205 return Code::BINARY_OP_IC; | 1207 return Code::BINARY_OP_IC; |
1206 } | 1208 } |
1207 | 1209 |
1208 virtual InlineCacheState GetICState() V8_OVERRIDE { | 1210 virtual InlineCacheState GetICState() V8_OVERRIDE { |
1209 return state_.GetICState(); | 1211 return state_.GetICState(); |
1210 } | 1212 } |
1211 | 1213 |
(...skipping 1302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2514 | 2516 |
2515 | 2517 |
2516 class CallDescriptors { | 2518 class CallDescriptors { |
2517 public: | 2519 public: |
2518 static void InitializeForIsolate(Isolate* isolate); | 2520 static void InitializeForIsolate(Isolate* isolate); |
2519 }; | 2521 }; |
2520 | 2522 |
2521 } } // namespace v8::internal | 2523 } } // namespace v8::internal |
2522 | 2524 |
2523 #endif // V8_CODE_STUBS_H_ | 2525 #endif // V8_CODE_STUBS_H_ |
OLD | NEW |