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); |
} |
} |
} |