Chromium Code Reviews| Index: src/objects.h |
| diff --git a/src/objects.h b/src/objects.h |
| index e6ec722cf92a86c535fd3eae9834d6a1fc4cccb4..2116d1533be591e63305fe43ea4afcdd084f3c66 100644 |
| --- a/src/objects.h |
| +++ b/src/objects.h |
| @@ -8104,6 +8104,10 @@ enum AllocationSiteMode { |
| class AllocationSite: public Struct { |
| public: |
| static const uint32_t kMaximumArrayBytesToPretransition = 8 * 1024; |
| + static const int kUndecided = 0; |
| + static const int kDontTenure = 1; |
| + static const int kTenure = 2; |
| + static const int kZombie = 3; |
|
Hannes Payer (out of office)
2013/11/21 20:52:24
Right now the state diagram (should) looks like th
mvstanton
2013/11/22 11:18:51
Thx. I made these 4 state values into an enum to i
|
| DECL_ACCESSORS(transition_info, Object) |
| // nested_site threads a list of sites that represent nested literals |
| @@ -8118,10 +8122,6 @@ class AllocationSite: public Struct { |
| inline void Initialize(); |
| - bool HasNestedSites() { |
| - return nested_site()->IsAllocationSite(); |
| - } |
| - |
| // This method is expensive, it should only be called for reporting. |
| bool IsNestedSite(); |
| @@ -8129,6 +8129,33 @@ class AllocationSite: public Struct { |
| class UnusedBits: public BitField<int, 15, 14> {}; |
| class DoNotInlineBit: public BitField<bool, 29, 1> {}; |
|
Hannes Payer (out of office)
2013/11/21 20:52:24
Can we have newlines between the methods?
mvstanton
2013/11/22 11:18:51
Done.
|
| + inline void IncrementMementoFoundCount(); |
| + inline void IncrementMementoCreateCount(); |
| + PretenureFlag GetPretenureMode() { |
| + int mode = pretenure_decision()->value(); |
| + // Zombie objects "decide" to be untenured. |
| + return (mode == kTenure) ? TENURED : NOT_TENURED; |
| + } |
| + bool IsZombie() { |
| + return pretenure_decision()->value() == kZombie; |
| + } |
| + inline void MarkZombie(); |
| + bool DecisionMade() { |
| + return pretenure_decision()->value() != kUndecided; |
| + } |
| + void Decide() { |
| + ASSERT(!DecisionMade()); |
| + if (ShouldPretenure()) { |
| + set_pretenure_decision(Smi::FromInt(kTenure)); |
| + } else { |
| + set_pretenure_decision(Smi::FromInt(kDontTenure)); |
| + } |
| + } |
| + void Clear() { |
| + set_memento_found_count(Smi::FromInt(0)); |
| + set_memento_create_count(Smi::FromInt(0)); |
| + } |
| + |
| ElementsKind GetElementsKind() { |
| ASSERT(!SitePointsToLiteral()); |
| int value = Smi::cast(transition_info())->value(); |
| @@ -8202,6 +8229,8 @@ class AllocationSite: public Struct { |
| private: |
| inline DependentCode::DependencyGroup ToDependencyGroup(Reason reason); |
| + inline bool ShouldPretenure(); |
| + |
| DISALLOW_IMPLICIT_CONSTRUCTORS(AllocationSite); |
| }; |
| @@ -8213,7 +8242,10 @@ class AllocationMemento: public Struct { |
| DECL_ACCESSORS(allocation_site, Object) |
| - bool IsValid() { return allocation_site()->IsAllocationSite(); } |
| + bool IsValid() { |
| + return allocation_site()->IsAllocationSite() && |
| + !AllocationSite::cast(allocation_site())->IsZombie(); |
| + } |
| AllocationSite* GetAllocationSite() { |
| ASSERT(IsValid()); |
| return AllocationSite::cast(allocation_site()); |