Chromium Code Reviews| 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_CODE_STUBS_H_ | 5 #ifndef V8_CODE_STUBS_H_ |
| 6 #define V8_CODE_STUBS_H_ | 6 #define V8_CODE_STUBS_H_ |
| 7 | 7 |
| 8 #include "src/allocation.h" | 8 #include "src/allocation.h" |
| 9 #include "src/assembler.h" | 9 #include "src/assembler.h" |
| 10 #include "src/codegen.h" | 10 #include "src/codegen.h" |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 126 #define CODE_STUB_LIST(V) \ | 126 #define CODE_STUB_LIST(V) \ |
| 127 CODE_STUB_LIST_ALL_PLATFORMS(V) \ | 127 CODE_STUB_LIST_ALL_PLATFORMS(V) \ |
| 128 CODE_STUB_LIST_ARM(V) \ | 128 CODE_STUB_LIST_ARM(V) \ |
| 129 CODE_STUB_LIST_ARM64(V) \ | 129 CODE_STUB_LIST_ARM64(V) \ |
| 130 CODE_STUB_LIST_MIPS(V) | 130 CODE_STUB_LIST_MIPS(V) |
| 131 | 131 |
| 132 // Stub is base classes of all stubs. | 132 // Stub is base classes of all stubs. |
| 133 class CodeStub BASE_EMBEDDED { | 133 class CodeStub BASE_EMBEDDED { |
| 134 public: | 134 public: |
| 135 enum Major { | 135 enum Major { |
| 136 UninitializedMajorKey = 0, | |
|
mvstanton
2014/09/05 13:38:43
yay, this is gone! :)
| |
| 137 #define DEF_ENUM(name) name, | 136 #define DEF_ENUM(name) name, |
| 138 CODE_STUB_LIST(DEF_ENUM) | 137 CODE_STUB_LIST(DEF_ENUM) |
| 139 #undef DEF_ENUM | 138 #undef DEF_ENUM |
| 140 NoCache, // marker for stubs that do custom caching | 139 NoCache, // marker for stubs that do custom caching |
| 141 NUMBER_OF_IDS | 140 NUMBER_OF_IDS |
| 142 }; | 141 }; |
| 143 | 142 |
| 144 // Retrieve the code for the stub. Generate the code if needed. | 143 // Retrieve the code for the stub. Generate the code if needed. |
| 145 Handle<Code> GetCode(); | 144 Handle<Code> GetCode(); |
| 146 | 145 |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 173 // GC. This means that we must be statically sure that no GC can occur while | 172 // GC. This means that we must be statically sure that no GC can occur while |
| 174 // they are running. If that is the case they should override this to return | 173 // they are running. If that is the case they should override this to return |
| 175 // true, which will cause an assertion if we try to call something that can | 174 // true, which will cause an assertion if we try to call something that can |
| 176 // GC or if we try to put a stack frame on top of the junk, which would not | 175 // GC or if we try to put a stack frame on top of the junk, which would not |
| 177 // result in a traversable stack. | 176 // result in a traversable stack. |
| 178 virtual bool SometimesSetsUpAFrame() { return true; } | 177 virtual bool SometimesSetsUpAFrame() { return true; } |
| 179 | 178 |
| 180 // Lookup the code in the (possibly custom) cache. | 179 // Lookup the code in the (possibly custom) cache. |
| 181 bool FindCodeInCache(Code** code_out); | 180 bool FindCodeInCache(Code** code_out); |
| 182 | 181 |
| 182 virtual void InitializeInterfaceDescriptor( | |
| 183 CodeStubInterfaceDescriptor* descriptor) {} | |
| 184 | |
| 185 static void InitializeInterfaceDescriptor(Isolate* isolate, uint32_t key, | |
| 186 CodeStubInterfaceDescriptor* desc); | |
| 187 | |
| 183 // Returns information for computing the number key. | 188 // Returns information for computing the number key. |
| 184 virtual Major MajorKey() const = 0; | 189 virtual Major MajorKey() const = 0; |
| 185 uint32_t MinorKey() const { return minor_key_; } | 190 uint32_t MinorKey() const { return minor_key_; } |
| 186 | 191 |
| 187 virtual InlineCacheState GetICState() const { return UNINITIALIZED; } | 192 virtual InlineCacheState GetICState() const { return UNINITIALIZED; } |
| 188 virtual ExtraICState GetExtraICState() const { return kNoExtraICState; } | 193 virtual ExtraICState GetExtraICState() const { return kNoExtraICState; } |
| 189 virtual Code::StubType GetStubType() { | 194 virtual Code::StubType GetStubType() { |
| 190 return Code::NORMAL; | 195 return Code::NORMAL; |
| 191 } | 196 } |
| 192 | 197 |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 241 virtual void AddToSpecialCache(Handle<Code> new_object) { } | 246 virtual void AddToSpecialCache(Handle<Code> new_object) { } |
| 242 | 247 |
| 243 // Find code in a specialized cache, work is delegated to the specific stub. | 248 // Find code in a specialized cache, work is delegated to the specific stub. |
| 244 virtual bool FindCodeInSpecialCache(Code** code_out) { | 249 virtual bool FindCodeInSpecialCache(Code** code_out) { |
| 245 return false; | 250 return false; |
| 246 } | 251 } |
| 247 | 252 |
| 248 // If a stub uses a special cache override this. | 253 // If a stub uses a special cache override this. |
| 249 virtual bool UseSpecialCache() { return false; } | 254 virtual bool UseSpecialCache() { return false; } |
| 250 | 255 |
| 256 // We use this dispatch to statically instantiate the correct code stub for | |
| 257 // the given stub key and call the passed function with that code stub. | |
| 258 typedef void (*DispatchedCall)(CodeStub* stub, void** value_out); | |
| 259 static void Dispatch(Isolate* isolate, uint32_t key, void** value_out, | |
| 260 DispatchedCall call); | |
| 261 | |
| 251 STATIC_ASSERT(NUMBER_OF_IDS < (1 << kStubMajorKeyBits)); | 262 STATIC_ASSERT(NUMBER_OF_IDS < (1 << kStubMajorKeyBits)); |
| 252 class MajorKeyBits: public BitField<uint32_t, 0, kStubMajorKeyBits> {}; | 263 class MajorKeyBits: public BitField<uint32_t, 0, kStubMajorKeyBits> {}; |
| 253 class MinorKeyBits: public BitField<uint32_t, | 264 class MinorKeyBits: public BitField<uint32_t, |
| 254 kStubMajorKeyBits, kStubMinorKeyBits> {}; // NOLINT | 265 kStubMajorKeyBits, kStubMinorKeyBits> {}; // NOLINT |
| 255 | 266 |
| 256 friend class BreakPointIterator; | 267 friend class BreakPointIterator; |
| 257 | 268 |
| 258 Isolate* isolate_; | 269 Isolate* isolate_; |
| 259 }; | 270 }; |
| 260 | 271 |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 419 | 430 |
| 420 class HydrogenCodeStub : public CodeStub { | 431 class HydrogenCodeStub : public CodeStub { |
| 421 public: | 432 public: |
| 422 enum InitializationState { | 433 enum InitializationState { |
| 423 UNINITIALIZED, | 434 UNINITIALIZED, |
| 424 INITIALIZED | 435 INITIALIZED |
| 425 }; | 436 }; |
| 426 | 437 |
| 427 virtual Code::Kind GetCodeKind() const { return Code::STUB; } | 438 virtual Code::Kind GetCodeKind() const { return Code::STUB; } |
| 428 | 439 |
| 429 CodeStubInterfaceDescriptor* GetInterfaceDescriptor() { | |
| 430 return isolate()->code_stub_interface_descriptor(MajorKey()); | |
| 431 } | |
| 432 | |
| 433 template<class SubClass> | 440 template<class SubClass> |
| 434 static Handle<Code> GetUninitialized(Isolate* isolate) { | 441 static Handle<Code> GetUninitialized(Isolate* isolate) { |
| 435 SubClass::GenerateAheadOfTime(isolate); | 442 SubClass::GenerateAheadOfTime(isolate); |
| 436 return SubClass().GetCode(isolate); | 443 return SubClass().GetCode(isolate); |
| 437 } | 444 } |
| 438 | 445 |
| 439 virtual void InitializeInterfaceDescriptor( | |
| 440 CodeStubInterfaceDescriptor* descriptor) = 0; | |
| 441 | |
| 442 // Retrieve the code for the stub. Generate the code if needed. | 446 // Retrieve the code for the stub. Generate the code if needed. |
| 443 virtual Handle<Code> GenerateCode() = 0; | 447 virtual Handle<Code> GenerateCode() = 0; |
| 444 | 448 |
| 445 bool IsUninitialized() const { return IsMissBits::decode(minor_key_); } | 449 bool IsUninitialized() const { return IsMissBits::decode(minor_key_); } |
| 446 | 450 |
| 447 Handle<Code> GenerateLightweightMissCode(); | 451 Handle<Code> GenerateLightweightMissCode(); |
| 448 | 452 |
| 449 template<class StateType> | 453 template<class StateType> |
| 450 void TraceTransition(StateType from, StateType to); | 454 void TraceTransition(StateType from, StateType to); |
| 451 | 455 |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 535 virtual void BeforeCall(MacroAssembler* masm) const {} | 539 virtual void BeforeCall(MacroAssembler* masm) const {} |
| 536 | 540 |
| 537 virtual void AfterCall(MacroAssembler* masm) const {} | 541 virtual void AfterCall(MacroAssembler* masm) const {} |
| 538 }; | 542 }; |
| 539 | 543 |
| 540 | 544 |
| 541 class ToNumberStub: public HydrogenCodeStub { | 545 class ToNumberStub: public HydrogenCodeStub { |
| 542 public: | 546 public: |
| 543 explicit ToNumberStub(Isolate* isolate) : HydrogenCodeStub(isolate) { } | 547 explicit ToNumberStub(Isolate* isolate) : HydrogenCodeStub(isolate) { } |
| 544 | 548 |
| 545 static void InstallDescriptors(Isolate* isolate) { | |
| 546 ToNumberStub stub(isolate); | |
| 547 stub.InitializeInterfaceDescriptor( | |
| 548 isolate->code_stub_interface_descriptor(CodeStub::ToNumber)); | |
| 549 } | |
| 550 | |
| 551 DEFINE_HYDROGEN_CODE_STUB(ToNumber, HydrogenCodeStub); | 549 DEFINE_HYDROGEN_CODE_STUB(ToNumber, HydrogenCodeStub); |
| 552 }; | 550 }; |
| 553 | 551 |
| 554 | 552 |
| 555 class NumberToStringStub FINAL : public HydrogenCodeStub { | 553 class NumberToStringStub FINAL : public HydrogenCodeStub { |
| 556 public: | 554 public: |
| 557 explicit NumberToStringStub(Isolate* isolate) : HydrogenCodeStub(isolate) {} | 555 explicit NumberToStringStub(Isolate* isolate) : HydrogenCodeStub(isolate) {} |
| 558 | 556 |
| 559 static void InstallDescriptors(Isolate* isolate); | |
| 560 | |
| 561 // Parameters accessed via CodeStubGraphBuilder::GetParameter() | 557 // Parameters accessed via CodeStubGraphBuilder::GetParameter() |
| 562 static const int kNumber = 0; | 558 static const int kNumber = 0; |
| 563 | 559 |
| 564 DEFINE_HYDROGEN_CODE_STUB(NumberToString, HydrogenCodeStub); | 560 DEFINE_HYDROGEN_CODE_STUB(NumberToString, HydrogenCodeStub); |
| 565 }; | 561 }; |
| 566 | 562 |
| 567 | 563 |
| 568 class FastNewClosureStub : public HydrogenCodeStub { | 564 class FastNewClosureStub : public HydrogenCodeStub { |
| 569 public: | 565 public: |
| 570 FastNewClosureStub(Isolate* isolate, StrictMode strict_mode, | 566 FastNewClosureStub(Isolate* isolate, StrictMode strict_mode, |
| 571 bool is_generator) | 567 bool is_generator) |
| 572 : HydrogenCodeStub(isolate) { | 568 : HydrogenCodeStub(isolate) { |
| 573 set_sub_minor_key(StrictModeBits::encode(strict_mode) | | 569 set_sub_minor_key(StrictModeBits::encode(strict_mode) | |
| 574 IsGeneratorBits::encode(is_generator)); | 570 IsGeneratorBits::encode(is_generator)); |
| 575 } | 571 } |
| 576 | 572 |
| 577 static void InstallDescriptors(Isolate* isolate); | |
| 578 | |
| 579 StrictMode strict_mode() const { | 573 StrictMode strict_mode() const { |
| 580 return StrictModeBits::decode(sub_minor_key()); | 574 return StrictModeBits::decode(sub_minor_key()); |
| 581 } | 575 } |
| 582 | 576 |
| 583 bool is_generator() const { return IsGeneratorBits::decode(sub_minor_key()); } | 577 bool is_generator() const { return IsGeneratorBits::decode(sub_minor_key()); } |
| 584 | 578 |
| 585 private: | 579 private: |
| 586 class StrictModeBits : public BitField<StrictMode, 0, 1> {}; | 580 class StrictModeBits : public BitField<StrictMode, 0, 1> {}; |
| 587 class IsGeneratorBits : public BitField<bool, 1, 1> {}; | 581 class IsGeneratorBits : public BitField<bool, 1, 1> {}; |
| 588 | 582 |
| 589 DEFINE_HYDROGEN_CODE_STUB(FastNewClosure, HydrogenCodeStub); | 583 DEFINE_HYDROGEN_CODE_STUB(FastNewClosure, HydrogenCodeStub); |
| 590 }; | 584 }; |
| 591 | 585 |
| 592 | 586 |
| 593 class FastNewContextStub FINAL : public HydrogenCodeStub { | 587 class FastNewContextStub FINAL : public HydrogenCodeStub { |
| 594 public: | 588 public: |
| 595 static const int kMaximumSlots = 64; | 589 static const int kMaximumSlots = 64; |
| 596 | 590 |
| 597 FastNewContextStub(Isolate* isolate, int slots) : HydrogenCodeStub(isolate) { | 591 FastNewContextStub(Isolate* isolate, int slots) : HydrogenCodeStub(isolate) { |
| 598 DCHECK(slots > 0 && slots <= kMaximumSlots); | 592 DCHECK(slots > 0 && slots <= kMaximumSlots); |
| 599 set_sub_minor_key(SlotsBits::encode(slots)); | 593 set_sub_minor_key(SlotsBits::encode(slots)); |
| 600 } | 594 } |
| 601 | 595 |
| 602 static void InstallDescriptors(Isolate* isolate); | |
| 603 | |
| 604 int slots() const { return SlotsBits::decode(sub_minor_key()); } | 596 int slots() const { return SlotsBits::decode(sub_minor_key()); } |
| 605 | 597 |
| 606 // Parameters accessed via CodeStubGraphBuilder::GetParameter() | 598 // Parameters accessed via CodeStubGraphBuilder::GetParameter() |
| 607 static const int kFunction = 0; | 599 static const int kFunction = 0; |
| 608 | 600 |
| 609 private: | 601 private: |
| 610 class SlotsBits : public BitField<int, 0, 8> {}; | 602 class SlotsBits : public BitField<int, 0, 8> {}; |
| 611 | 603 |
| 612 DEFINE_HYDROGEN_CODE_STUB(FastNewContext, HydrogenCodeStub); | 604 DEFINE_HYDROGEN_CODE_STUB(FastNewContext, HydrogenCodeStub); |
| 613 }; | 605 }; |
| 614 | 606 |
| 615 | 607 |
| 616 class FastCloneShallowArrayStub : public HydrogenCodeStub { | 608 class FastCloneShallowArrayStub : public HydrogenCodeStub { |
| 617 public: | 609 public: |
| 618 FastCloneShallowArrayStub(Isolate* isolate, | 610 FastCloneShallowArrayStub(Isolate* isolate, |
| 619 AllocationSiteMode allocation_site_mode) | 611 AllocationSiteMode allocation_site_mode) |
| 620 : HydrogenCodeStub(isolate) { | 612 : HydrogenCodeStub(isolate) { |
| 621 set_sub_minor_key(AllocationSiteModeBits::encode(allocation_site_mode)); | 613 set_sub_minor_key(AllocationSiteModeBits::encode(allocation_site_mode)); |
| 622 } | 614 } |
| 623 | 615 |
| 624 AllocationSiteMode allocation_site_mode() const { | 616 AllocationSiteMode allocation_site_mode() const { |
| 625 return AllocationSiteModeBits::decode(sub_minor_key()); | 617 return AllocationSiteModeBits::decode(sub_minor_key()); |
| 626 } | 618 } |
| 627 | 619 |
| 628 static void InstallDescriptors(Isolate* isolate); | |
| 629 | |
| 630 private: | 620 private: |
| 631 class AllocationSiteModeBits: public BitField<AllocationSiteMode, 0, 1> {}; | 621 class AllocationSiteModeBits: public BitField<AllocationSiteMode, 0, 1> {}; |
| 632 | 622 |
| 633 DEFINE_HYDROGEN_CODE_STUB(FastCloneShallowArray, HydrogenCodeStub); | 623 DEFINE_HYDROGEN_CODE_STUB(FastCloneShallowArray, HydrogenCodeStub); |
| 634 }; | 624 }; |
| 635 | 625 |
| 636 | 626 |
| 637 class FastCloneShallowObjectStub : public HydrogenCodeStub { | 627 class FastCloneShallowObjectStub : public HydrogenCodeStub { |
| 638 public: | 628 public: |
| 639 // Maximum number of properties in copied object. | 629 // Maximum number of properties in copied object. |
| (...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 924 FieldIndex index() const { | 914 FieldIndex index() const { |
| 925 int property_index_key = StoreFieldByIndexBits::decode(sub_minor_key()); | 915 int property_index_key = StoreFieldByIndexBits::decode(sub_minor_key()); |
| 926 return FieldIndex::FromFieldAccessStubKey(property_index_key); | 916 return FieldIndex::FromFieldAccessStubKey(property_index_key); |
| 927 } | 917 } |
| 928 | 918 |
| 929 Representation representation() { | 919 Representation representation() { |
| 930 uint8_t repr = RepresentationBits::decode(sub_minor_key()); | 920 uint8_t repr = RepresentationBits::decode(sub_minor_key()); |
| 931 return PropertyDetails::DecodeRepresentation(repr); | 921 return PropertyDetails::DecodeRepresentation(repr); |
| 932 } | 922 } |
| 933 | 923 |
| 934 static void InstallDescriptors(Isolate* isolate); | |
| 935 | |
| 936 protected: | 924 protected: |
| 937 virtual Code::Kind kind() const { return Code::STORE_IC; } | 925 virtual Code::Kind kind() const { return Code::STORE_IC; } |
| 938 virtual Code::StubType GetStubType() { return Code::FAST; } | 926 virtual Code::StubType GetStubType() { return Code::FAST; } |
| 939 | 927 |
| 940 private: | 928 private: |
| 941 class StoreFieldByIndexBits : public BitField<int, 0, 13> {}; | 929 class StoreFieldByIndexBits : public BitField<int, 0, 13> {}; |
| 942 class RepresentationBits : public BitField<uint8_t, 13, 4> {}; | 930 class RepresentationBits : public BitField<uint8_t, 13, 4> {}; |
| 943 | 931 |
| 944 DEFINE_HANDLER_CODE_STUB(StoreField, HandlerStub); | 932 DEFINE_HANDLER_CODE_STUB(StoreField, HandlerStub); |
| 945 }; | 933 }; |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1045 set_sub_minor_key(state.GetExtraICState()); | 1033 set_sub_minor_key(state.GetExtraICState()); |
| 1046 } | 1034 } |
| 1047 | 1035 |
| 1048 BinaryOpICStub(Isolate* isolate, const BinaryOpIC::State& state) | 1036 BinaryOpICStub(Isolate* isolate, const BinaryOpIC::State& state) |
| 1049 : HydrogenCodeStub(isolate) { | 1037 : HydrogenCodeStub(isolate) { |
| 1050 set_sub_minor_key(state.GetExtraICState()); | 1038 set_sub_minor_key(state.GetExtraICState()); |
| 1051 } | 1039 } |
| 1052 | 1040 |
| 1053 static void GenerateAheadOfTime(Isolate* isolate); | 1041 static void GenerateAheadOfTime(Isolate* isolate); |
| 1054 | 1042 |
| 1055 static void InstallDescriptors(Isolate* isolate); | |
| 1056 | |
| 1057 virtual Code::Kind GetCodeKind() const OVERRIDE { | 1043 virtual Code::Kind GetCodeKind() const OVERRIDE { |
| 1058 return Code::BINARY_OP_IC; | 1044 return Code::BINARY_OP_IC; |
| 1059 } | 1045 } |
| 1060 | 1046 |
| 1061 virtual InlineCacheState GetICState() const FINAL OVERRIDE { | 1047 virtual InlineCacheState GetICState() const FINAL OVERRIDE { |
| 1062 return state().GetICState(); | 1048 return state().GetICState(); |
| 1063 } | 1049 } |
| 1064 | 1050 |
| 1065 virtual ExtraICState GetExtraICState() const FINAL OVERRIDE { | 1051 virtual ExtraICState GetExtraICState() const FINAL OVERRIDE { |
| 1066 return static_cast<ExtraICState>(sub_minor_key()); | 1052 return static_cast<ExtraICState>(sub_minor_key()); |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1132 public: | 1118 public: |
| 1133 BinaryOpWithAllocationSiteStub(Isolate* isolate, | 1119 BinaryOpWithAllocationSiteStub(Isolate* isolate, |
| 1134 Token::Value op, | 1120 Token::Value op, |
| 1135 OverwriteMode mode) | 1121 OverwriteMode mode) |
| 1136 : BinaryOpICStub(isolate, op, mode) {} | 1122 : BinaryOpICStub(isolate, op, mode) {} |
| 1137 | 1123 |
| 1138 BinaryOpWithAllocationSiteStub(Isolate* isolate, | 1124 BinaryOpWithAllocationSiteStub(Isolate* isolate, |
| 1139 const BinaryOpIC::State& state) | 1125 const BinaryOpIC::State& state) |
| 1140 : BinaryOpICStub(isolate, state) {} | 1126 : BinaryOpICStub(isolate, state) {} |
| 1141 | 1127 |
| 1142 static void InstallDescriptors(Isolate* isolate); | |
| 1143 | |
| 1144 virtual Code::Kind GetCodeKind() const FINAL OVERRIDE { | 1128 virtual Code::Kind GetCodeKind() const FINAL OVERRIDE { |
| 1145 return Code::STUB; | 1129 return Code::STUB; |
| 1146 } | 1130 } |
| 1147 | 1131 |
| 1148 // Parameters accessed via CodeStubGraphBuilder::GetParameter() | 1132 // Parameters accessed via CodeStubGraphBuilder::GetParameter() |
| 1149 static const int kAllocationSite = 0; | 1133 static const int kAllocationSite = 0; |
| 1150 static const int kLeft = 1; | 1134 static const int kLeft = 1; |
| 1151 static const int kRight = 2; | 1135 static const int kRight = 2; |
| 1152 | 1136 |
| 1153 DEFINE_HYDROGEN_CODE_STUB(BinaryOpWithAllocationSite, BinaryOpICStub); | 1137 DEFINE_HYDROGEN_CODE_STUB(BinaryOpWithAllocationSite, BinaryOpICStub); |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 1176 } | 1160 } |
| 1177 | 1161 |
| 1178 StringAddFlags flags() const { | 1162 StringAddFlags flags() const { |
| 1179 return StringAddFlagsBits::decode(sub_minor_key()); | 1163 return StringAddFlagsBits::decode(sub_minor_key()); |
| 1180 } | 1164 } |
| 1181 | 1165 |
| 1182 PretenureFlag pretenure_flag() const { | 1166 PretenureFlag pretenure_flag() const { |
| 1183 return PretenureFlagBits::decode(sub_minor_key()); | 1167 return PretenureFlagBits::decode(sub_minor_key()); |
| 1184 } | 1168 } |
| 1185 | 1169 |
| 1186 static void InstallDescriptors(Isolate* isolate); | |
| 1187 | |
| 1188 // Parameters accessed via CodeStubGraphBuilder::GetParameter() | 1170 // Parameters accessed via CodeStubGraphBuilder::GetParameter() |
| 1189 static const int kLeft = 0; | 1171 static const int kLeft = 0; |
| 1190 static const int kRight = 1; | 1172 static const int kRight = 1; |
| 1191 | 1173 |
| 1192 private: | 1174 private: |
| 1193 class StringAddFlagsBits: public BitField<StringAddFlags, 0, 2> {}; | 1175 class StringAddFlagsBits: public BitField<StringAddFlags, 0, 2> {}; |
| 1194 class PretenureFlagBits: public BitField<PretenureFlag, 2, 1> {}; | 1176 class PretenureFlagBits: public BitField<PretenureFlag, 2, 1> {}; |
| 1195 | 1177 |
| 1196 virtual void PrintBaseName(OStream& os) const OVERRIDE; // NOLINT | 1178 virtual void PrintBaseName(OStream& os) const OVERRIDE; // NOLINT |
| 1197 | 1179 |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1265 InitializationState init_state = INITIALIZED) | 1247 InitializationState init_state = INITIALIZED) |
| 1266 : HydrogenCodeStub(isolate, init_state) { | 1248 : HydrogenCodeStub(isolate, init_state) { |
| 1267 set_sub_minor_key(ic_state); | 1249 set_sub_minor_key(ic_state); |
| 1268 } | 1250 } |
| 1269 | 1251 |
| 1270 static Handle<Code> GetUninitialized(Isolate* isolate, | 1252 static Handle<Code> GetUninitialized(Isolate* isolate, |
| 1271 NilValue nil) { | 1253 NilValue nil) { |
| 1272 return CompareNilICStub(isolate, nil, UNINITIALIZED).GetCode(); | 1254 return CompareNilICStub(isolate, nil, UNINITIALIZED).GetCode(); |
| 1273 } | 1255 } |
| 1274 | 1256 |
| 1275 static void InstallDescriptors(Isolate* isolate) { | |
| 1276 CompareNilICStub compare_stub(isolate, kNullValue, UNINITIALIZED); | |
| 1277 compare_stub.InitializeInterfaceDescriptor( | |
| 1278 isolate->code_stub_interface_descriptor(CodeStub::CompareNilIC)); | |
| 1279 } | |
| 1280 | |
| 1281 virtual InlineCacheState GetICState() const { | 1257 virtual InlineCacheState GetICState() const { |
| 1282 State state = this->state(); | 1258 State state = this->state(); |
| 1283 if (state.Contains(GENERIC)) { | 1259 if (state.Contains(GENERIC)) { |
| 1284 return MEGAMORPHIC; | 1260 return MEGAMORPHIC; |
| 1285 } else if (state.Contains(MONOMORPHIC_MAP)) { | 1261 } else if (state.Contains(MONOMORPHIC_MAP)) { |
| 1286 return MONOMORPHIC; | 1262 return MONOMORPHIC; |
| 1287 } else { | 1263 } else { |
| 1288 return PREMONOMORPHIC; | 1264 return PREMONOMORPHIC; |
| 1289 } | 1265 } |
| 1290 } | 1266 } |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1443 | 1419 |
| 1444 DEFINE_PLATFORM_CODE_STUB(RegExpExec, PlatformCodeStub); | 1420 DEFINE_PLATFORM_CODE_STUB(RegExpExec, PlatformCodeStub); |
| 1445 }; | 1421 }; |
| 1446 | 1422 |
| 1447 | 1423 |
| 1448 class RegExpConstructResultStub FINAL : public HydrogenCodeStub { | 1424 class RegExpConstructResultStub FINAL : public HydrogenCodeStub { |
| 1449 public: | 1425 public: |
| 1450 explicit RegExpConstructResultStub(Isolate* isolate) | 1426 explicit RegExpConstructResultStub(Isolate* isolate) |
| 1451 : HydrogenCodeStub(isolate) { } | 1427 : HydrogenCodeStub(isolate) { } |
| 1452 | 1428 |
| 1453 static void InstallDescriptors(Isolate* isolate); | |
| 1454 | |
| 1455 // Parameters accessed via CodeStubGraphBuilder::GetParameter() | 1429 // Parameters accessed via CodeStubGraphBuilder::GetParameter() |
| 1456 static const int kLength = 0; | 1430 static const int kLength = 0; |
| 1457 static const int kIndex = 1; | 1431 static const int kIndex = 1; |
| 1458 static const int kInput = 2; | 1432 static const int kInput = 2; |
| 1459 | 1433 |
| 1460 DEFINE_HYDROGEN_CODE_STUB(RegExpConstructResult, HydrogenCodeStub); | 1434 DEFINE_HYDROGEN_CODE_STUB(RegExpConstructResult, HydrogenCodeStub); |
| 1461 }; | 1435 }; |
| 1462 | 1436 |
| 1463 | 1437 |
| 1464 class CallFunctionStub: public PlatformCodeStub { | 1438 class CallFunctionStub: public PlatformCodeStub { |
| (...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1706 : HydrogenCodeStub(isolate) {} | 1680 : HydrogenCodeStub(isolate) {} |
| 1707 | 1681 |
| 1708 DEFINE_HYDROGEN_CODE_STUB(LoadDictionaryElement, HydrogenCodeStub); | 1682 DEFINE_HYDROGEN_CODE_STUB(LoadDictionaryElement, HydrogenCodeStub); |
| 1709 }; | 1683 }; |
| 1710 | 1684 |
| 1711 | 1685 |
| 1712 class KeyedLoadGenericStub : public HydrogenCodeStub { | 1686 class KeyedLoadGenericStub : public HydrogenCodeStub { |
| 1713 public: | 1687 public: |
| 1714 explicit KeyedLoadGenericStub(Isolate* isolate) : HydrogenCodeStub(isolate) {} | 1688 explicit KeyedLoadGenericStub(Isolate* isolate) : HydrogenCodeStub(isolate) {} |
| 1715 | 1689 |
| 1716 static void InstallDescriptors(Isolate* isolate); | |
| 1717 | |
| 1718 virtual Code::Kind GetCodeKind() const { return Code::KEYED_LOAD_IC; } | 1690 virtual Code::Kind GetCodeKind() const { return Code::KEYED_LOAD_IC; } |
| 1719 virtual InlineCacheState GetICState() const { return GENERIC; } | 1691 virtual InlineCacheState GetICState() const { return GENERIC; } |
| 1720 | 1692 |
| 1721 DEFINE_HYDROGEN_CODE_STUB(KeyedLoadGeneric, HydrogenCodeStub); | 1693 DEFINE_HYDROGEN_CODE_STUB(KeyedLoadGeneric, HydrogenCodeStub); |
| 1722 }; | 1694 }; |
| 1723 | 1695 |
| 1724 | 1696 |
| 1725 class LoadICTrampolineStub : public PlatformCodeStub { | 1697 class LoadICTrampolineStub : public PlatformCodeStub { |
| 1726 public: | 1698 public: |
| 1727 LoadICTrampolineStub(Isolate* isolate, const LoadIC::State& state) | 1699 LoadICTrampolineStub(Isolate* isolate, const LoadIC::State& state) |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1761 }; | 1733 }; |
| 1762 | 1734 |
| 1763 | 1735 |
| 1764 class VectorLoadStub : public HydrogenCodeStub { | 1736 class VectorLoadStub : public HydrogenCodeStub { |
| 1765 public: | 1737 public: |
| 1766 explicit VectorLoadStub(Isolate* isolate, const LoadIC::State& state) | 1738 explicit VectorLoadStub(Isolate* isolate, const LoadIC::State& state) |
| 1767 : HydrogenCodeStub(isolate) { | 1739 : HydrogenCodeStub(isolate) { |
| 1768 set_sub_minor_key(state.GetExtraICState()); | 1740 set_sub_minor_key(state.GetExtraICState()); |
| 1769 } | 1741 } |
| 1770 | 1742 |
| 1771 static void InstallDescriptors(Isolate* isolate); | |
| 1772 | |
| 1773 virtual Code::Kind GetCodeKind() const OVERRIDE { return Code::LOAD_IC; } | 1743 virtual Code::Kind GetCodeKind() const OVERRIDE { return Code::LOAD_IC; } |
| 1774 | 1744 |
| 1775 virtual InlineCacheState GetICState() const FINAL OVERRIDE { | 1745 virtual InlineCacheState GetICState() const FINAL OVERRIDE { |
| 1776 return GENERIC; | 1746 return GENERIC; |
| 1777 } | 1747 } |
| 1778 | 1748 |
| 1779 virtual ExtraICState GetExtraICState() const FINAL OVERRIDE { | 1749 virtual ExtraICState GetExtraICState() const FINAL OVERRIDE { |
| 1780 return static_cast<ExtraICState>(sub_minor_key()); | 1750 return static_cast<ExtraICState>(sub_minor_key()); |
| 1781 } | 1751 } |
| 1782 | 1752 |
| 1783 private: | 1753 private: |
| 1784 LoadIC::State state() const { return LoadIC::State(GetExtraICState()); } | 1754 LoadIC::State state() const { return LoadIC::State(GetExtraICState()); } |
| 1785 | 1755 |
| 1786 DEFINE_HYDROGEN_CODE_STUB(VectorLoad, HydrogenCodeStub); | 1756 DEFINE_HYDROGEN_CODE_STUB(VectorLoad, HydrogenCodeStub); |
| 1787 }; | 1757 }; |
| 1788 | 1758 |
| 1789 | 1759 |
| 1790 class VectorKeyedLoadStub : public VectorLoadStub { | 1760 class VectorKeyedLoadStub : public VectorLoadStub { |
| 1791 public: | 1761 public: |
| 1792 explicit VectorKeyedLoadStub(Isolate* isolate) | 1762 explicit VectorKeyedLoadStub(Isolate* isolate) |
| 1793 : VectorLoadStub(isolate, LoadIC::State(0)) {} | 1763 : VectorLoadStub(isolate, LoadIC::State(0)) {} |
| 1794 | 1764 |
| 1795 static void InstallDescriptors(Isolate* isolate); | |
| 1796 | |
| 1797 virtual Code::Kind GetCodeKind() const OVERRIDE { | 1765 virtual Code::Kind GetCodeKind() const OVERRIDE { |
| 1798 return Code::KEYED_LOAD_IC; | 1766 return Code::KEYED_LOAD_IC; |
| 1799 } | 1767 } |
| 1800 | 1768 |
| 1801 DEFINE_HYDROGEN_CODE_STUB(VectorKeyedLoad, VectorLoadStub); | 1769 DEFINE_HYDROGEN_CODE_STUB(VectorKeyedLoad, VectorLoadStub); |
| 1802 }; | 1770 }; |
| 1803 | 1771 |
| 1804 | 1772 |
| 1805 class DoubleToIStub : public PlatformCodeStub { | 1773 class DoubleToIStub : public PlatformCodeStub { |
| 1806 public: | 1774 public: |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1856 set_sub_minor_key(ElementsKindBits::encode(elements_kind) | | 1824 set_sub_minor_key(ElementsKindBits::encode(elements_kind) | |
| 1857 IsJSArrayBits::encode(is_js_array)); | 1825 IsJSArrayBits::encode(is_js_array)); |
| 1858 } | 1826 } |
| 1859 | 1827 |
| 1860 bool is_js_array() const { return IsJSArrayBits::decode(sub_minor_key()); } | 1828 bool is_js_array() const { return IsJSArrayBits::decode(sub_minor_key()); } |
| 1861 | 1829 |
| 1862 ElementsKind elements_kind() const { | 1830 ElementsKind elements_kind() const { |
| 1863 return ElementsKindBits::decode(sub_minor_key()); | 1831 return ElementsKindBits::decode(sub_minor_key()); |
| 1864 } | 1832 } |
| 1865 | 1833 |
| 1866 static void InstallDescriptors(Isolate* isolate); | |
| 1867 | |
| 1868 private: | 1834 private: |
| 1869 class ElementsKindBits: public BitField<ElementsKind, 0, 8> {}; | 1835 class ElementsKindBits: public BitField<ElementsKind, 0, 8> {}; |
| 1870 class IsJSArrayBits: public BitField<bool, 8, 1> {}; | 1836 class IsJSArrayBits: public BitField<bool, 8, 1> {}; |
| 1871 | 1837 |
| 1872 DEFINE_HYDROGEN_CODE_STUB(LoadFastElement, HydrogenCodeStub); | 1838 DEFINE_HYDROGEN_CODE_STUB(LoadFastElement, HydrogenCodeStub); |
| 1873 }; | 1839 }; |
| 1874 | 1840 |
| 1875 | 1841 |
| 1876 class StoreFastElementStub : public HydrogenCodeStub { | 1842 class StoreFastElementStub : public HydrogenCodeStub { |
| 1877 public: | 1843 public: |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1947 | 1913 |
| 1948 ElementsKind elements_kind() const { | 1914 ElementsKind elements_kind() const { |
| 1949 return ElementsKindBits::decode(sub_minor_key()); | 1915 return ElementsKindBits::decode(sub_minor_key()); |
| 1950 } | 1916 } |
| 1951 | 1917 |
| 1952 AllocationSiteOverrideMode override_mode() const { | 1918 AllocationSiteOverrideMode override_mode() const { |
| 1953 return AllocationSiteOverrideModeBits::decode(sub_minor_key()); | 1919 return AllocationSiteOverrideModeBits::decode(sub_minor_key()); |
| 1954 } | 1920 } |
| 1955 | 1921 |
| 1956 static void GenerateStubsAheadOfTime(Isolate* isolate); | 1922 static void GenerateStubsAheadOfTime(Isolate* isolate); |
| 1957 static void InstallDescriptors(Isolate* isolate); | |
| 1958 | 1923 |
| 1959 // Parameters accessed via CodeStubGraphBuilder::GetParameter() | 1924 // Parameters accessed via CodeStubGraphBuilder::GetParameter() |
| 1960 static const int kConstructor = 0; | 1925 static const int kConstructor = 0; |
| 1961 static const int kAllocationSite = 1; | 1926 static const int kAllocationSite = 1; |
| 1962 | 1927 |
| 1963 protected: | 1928 protected: |
| 1964 OStream& BasePrintName(OStream& os, const char* name) const; // NOLINT | 1929 OStream& BasePrintName(OStream& os, const char* name) const; // NOLINT |
| 1965 | 1930 |
| 1966 private: | 1931 private: |
| 1967 // Ensure data fits within available bits. | 1932 // Ensure data fits within available bits. |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2033 | 1998 |
| 2034 | 1999 |
| 2035 class InternalArrayConstructorStubBase : public HydrogenCodeStub { | 2000 class InternalArrayConstructorStubBase : public HydrogenCodeStub { |
| 2036 public: | 2001 public: |
| 2037 InternalArrayConstructorStubBase(Isolate* isolate, ElementsKind kind) | 2002 InternalArrayConstructorStubBase(Isolate* isolate, ElementsKind kind) |
| 2038 : HydrogenCodeStub(isolate) { | 2003 : HydrogenCodeStub(isolate) { |
| 2039 set_sub_minor_key(ElementsKindBits::encode(kind)); | 2004 set_sub_minor_key(ElementsKindBits::encode(kind)); |
| 2040 } | 2005 } |
| 2041 | 2006 |
| 2042 static void GenerateStubsAheadOfTime(Isolate* isolate); | 2007 static void GenerateStubsAheadOfTime(Isolate* isolate); |
| 2043 static void InstallDescriptors(Isolate* isolate); | |
| 2044 | 2008 |
| 2045 // Parameters accessed via CodeStubGraphBuilder::GetParameter() | 2009 // Parameters accessed via CodeStubGraphBuilder::GetParameter() |
| 2046 static const int kConstructor = 0; | 2010 static const int kConstructor = 0; |
| 2047 | 2011 |
| 2048 ElementsKind elements_kind() const { | 2012 ElementsKind elements_kind() const { |
| 2049 return ElementsKindBits::decode(sub_minor_key()); | 2013 return ElementsKindBits::decode(sub_minor_key()); |
| 2050 } | 2014 } |
| 2051 | 2015 |
| 2052 private: | 2016 private: |
| 2053 class ElementsKindBits : public BitField<ElementsKind, 0, 8> {}; | 2017 class ElementsKindBits : public BitField<ElementsKind, 0, 8> {}; |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2161 | 2125 |
| 2162 bool UpdateStatus(Handle<Object> object); | 2126 bool UpdateStatus(Handle<Object> object); |
| 2163 Types types() const { return Types(TypesBits::decode(sub_minor_key())); } | 2127 Types types() const { return Types(TypesBits::decode(sub_minor_key())); } |
| 2164 ResultMode mode() const { return ResultModeBits::decode(sub_minor_key()); } | 2128 ResultMode mode() const { return ResultModeBits::decode(sub_minor_key()); } |
| 2165 | 2129 |
| 2166 virtual Code::Kind GetCodeKind() const { return Code::TO_BOOLEAN_IC; } | 2130 virtual Code::Kind GetCodeKind() const { return Code::TO_BOOLEAN_IC; } |
| 2167 virtual void PrintState(OStream& os) const OVERRIDE; // NOLINT | 2131 virtual void PrintState(OStream& os) const OVERRIDE; // NOLINT |
| 2168 | 2132 |
| 2169 virtual bool SometimesSetsUpAFrame() { return false; } | 2133 virtual bool SometimesSetsUpAFrame() { return false; } |
| 2170 | 2134 |
| 2171 static void InstallDescriptors(Isolate* isolate) { | |
| 2172 ToBooleanStub stub(isolate, RESULT_AS_SMI); | |
| 2173 stub.InitializeInterfaceDescriptor( | |
| 2174 isolate->code_stub_interface_descriptor(CodeStub::ToBoolean)); | |
| 2175 } | |
| 2176 | |
| 2177 static Handle<Code> GetUninitialized(Isolate* isolate) { | 2135 static Handle<Code> GetUninitialized(Isolate* isolate) { |
| 2178 return ToBooleanStub(isolate, UNINITIALIZED).GetCode(); | 2136 return ToBooleanStub(isolate, UNINITIALIZED).GetCode(); |
| 2179 } | 2137 } |
| 2180 | 2138 |
| 2181 virtual ExtraICState GetExtraICState() const { return types().ToIntegral(); } | 2139 virtual ExtraICState GetExtraICState() const { return types().ToIntegral(); } |
| 2182 | 2140 |
| 2183 virtual InlineCacheState GetICState() const { | 2141 virtual InlineCacheState GetICState() const { |
| 2184 if (types().IsEmpty()) { | 2142 if (types().IsEmpty()) { |
| 2185 return ::v8::internal::UNINITIALIZED; | 2143 return ::v8::internal::UNINITIALIZED; |
| 2186 } else { | 2144 } else { |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2338 | 2296 |
| 2339 | 2297 |
| 2340 #undef DEFINE_PLATFORM_CODE_STUB | 2298 #undef DEFINE_PLATFORM_CODE_STUB |
| 2341 #undef DEFINE_HANDLER_CODE_STUB | 2299 #undef DEFINE_HANDLER_CODE_STUB |
| 2342 #undef DEFINE_HYDROGEN_CODE_STUB | 2300 #undef DEFINE_HYDROGEN_CODE_STUB |
| 2343 #undef DEFINE_CODE_STUB | 2301 #undef DEFINE_CODE_STUB |
| 2344 #undef DEFINE_CODE_STUB_BASE | 2302 #undef DEFINE_CODE_STUB_BASE |
| 2345 } } // namespace v8::internal | 2303 } } // namespace v8::internal |
| 2346 | 2304 |
| 2347 #endif // V8_CODE_STUBS_H_ | 2305 #endif // V8_CODE_STUBS_H_ |
| OLD | NEW |