Chromium Code Reviews| Index: src/heap/scavenger.cc |
| diff --git a/src/heap/scavenger.cc b/src/heap/scavenger.cc |
| index aea41dd552ae06151a6c21ddc3e23cbed346f72c..1173bb60c6027dd59a25dd5efc13be71abf08eda 100644 |
| --- a/src/heap/scavenger.cc |
| +++ b/src/heap/scavenger.cc |
| @@ -30,6 +30,7 @@ class ScavengingVisitor : public StaticVisitorBase { |
| table_.Register(kVisitSeqOneByteString, &EvacuateSeqOneByteString); |
| table_.Register(kVisitSeqTwoByteString, &EvacuateSeqTwoByteString); |
| table_.Register(kVisitShortcutCandidate, &EvacuateShortcutCandidate); |
| + table_.Register(kVisitThinString, &EvacuateThinString); |
| table_.Register(kVisitByteArray, &EvacuateByteArray); |
| table_.Register(kVisitFixedArray, &EvacuateFixedArray); |
| table_.Register(kVisitFixedDoubleArray, &EvacuateFixedDoubleArray); |
| @@ -89,6 +90,12 @@ class ScavengingVisitor : public StaticVisitorBase { |
| return &table_; |
| } |
| + static void EvacuateThinStringNoShortcut(Map* map, HeapObject** slot, |
| + HeapObject* object) { |
| + EvacuateObject<POINTER_OBJECT, kWordAligned>(map, slot, object, |
| + ThinString::kSize); |
| + } |
| + |
| private: |
| enum ObjectContents { DATA_OBJECT, POINTER_OBJECT }; |
| @@ -335,6 +342,22 @@ class ScavengingVisitor : public StaticVisitorBase { |
| object_size); |
| } |
| + static inline void EvacuateThinString(Map* map, HeapObject** slot, |
| + HeapObject* object) { |
| + if (marks_handling == IGNORE_MARKS) { |
| + HeapObject* actual = ThinString::cast(object)->actual(); |
| + *slot = actual; |
| + // ThinStrings always refer to internalized strings, which are |
| + // always in old space. |
| + DCHECK(!map->GetHeap()->InNewSpace(actual)); |
| + object->set_map_word(MapWord::FromForwardingAddress(actual)); |
| + return; |
| + } |
| + |
| + EvacuateObject<POINTER_OBJECT, kWordAligned>(map, slot, object, |
| + ThinString::kSize); |
| + } |
| + |
| template <ObjectContents object_contents> |
| class ObjectEvacuationStrategy { |
| public: |
| @@ -419,6 +442,10 @@ void Scavenger::SelectScavengingVisitorsTable() { |
| StaticVisitorBase::kVisitShortcutCandidate, |
| scavenging_visitors_table_.GetVisitorById( |
| StaticVisitorBase::kVisitConsString)); |
| + scavenging_visitors_table_.Register( |
|
Hannes Payer (out of office)
2016/12/21 09:53:14
Instead of using a special visitor when compacting
Jakob Kummerow
2017/01/04 12:45:06
I don't understand what you mean here, can you ple
Jakob Kummerow
2017/01/09 17:42:31
As discussed offline, this appears to be much hard
|
| + StaticVisitorBase::kVisitThinString, |
| + &ScavengingVisitor<TRANSFER_MARKS, LOGGING_AND_PROFILING_DISABLED>:: |
| + EvacuateThinStringNoShortcut); |
| } |
| } |
| } |