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 #include "src/heap/heap.h" | 5 #include "src/heap/heap.h" |
6 | 6 |
7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
8 #include "src/api.h" | 8 #include "src/api.h" |
9 #include "src/ast/context-slot-cache.h" | 9 #include "src/ast/context-slot-cache.h" |
10 #include "src/base/bits.h" | 10 #include "src/base/bits.h" |
(...skipping 1854 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1865 DCHECK((*p)->IsExternalString()); | 1865 DCHECK((*p)->IsExternalString()); |
1866 visitor_->VisitExternalString( | 1866 visitor_->VisitExternalString( |
1867 Utils::ToLocal(Handle<String>(String::cast(*p)))); | 1867 Utils::ToLocal(Handle<String>(String::cast(*p)))); |
1868 } | 1868 } |
1869 } | 1869 } |
1870 | 1870 |
1871 private: | 1871 private: |
1872 v8::ExternalResourceVisitor* visitor_; | 1872 v8::ExternalResourceVisitor* visitor_; |
1873 } external_string_table_visitor(visitor); | 1873 } external_string_table_visitor(visitor); |
1874 | 1874 |
1875 external_string_table_.Iterate(&external_string_table_visitor); | 1875 external_string_table_.IterateAll(&external_string_table_visitor); |
1876 } | 1876 } |
1877 | 1877 |
1878 Address Heap::DoScavenge(ObjectVisitor* scavenge_visitor, | 1878 Address Heap::DoScavenge(ObjectVisitor* scavenge_visitor, |
1879 Address new_space_front) { | 1879 Address new_space_front) { |
1880 do { | 1880 do { |
1881 SemiSpace::AssertValidRange(new_space_front, new_space_->top()); | 1881 SemiSpace::AssertValidRange(new_space_front, new_space_->top()); |
1882 // The addresses new_space_front and new_space_.top() define a | 1882 // The addresses new_space_front and new_space_.top() define a |
1883 // queue of unprocessed copied objects. Process them until the | 1883 // queue of unprocessed copied objects. Process them until the |
1884 // queue is empty. | 1884 // queue is empty. |
1885 while (new_space_front != new_space_->top()) { | 1885 while (new_space_front != new_space_->top()) { |
(...skipping 2938 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4824 IterateStrongRoots(v, mode); | 4824 IterateStrongRoots(v, mode); |
4825 IterateWeakRoots(v, mode); | 4825 IterateWeakRoots(v, mode); |
4826 } | 4826 } |
4827 | 4827 |
4828 | 4828 |
4829 void Heap::IterateWeakRoots(ObjectVisitor* v, VisitMode mode) { | 4829 void Heap::IterateWeakRoots(ObjectVisitor* v, VisitMode mode) { |
4830 v->VisitPointer(reinterpret_cast<Object**>(&roots_[kStringTableRootIndex])); | 4830 v->VisitPointer(reinterpret_cast<Object**>(&roots_[kStringTableRootIndex])); |
4831 v->Synchronize(VisitorSynchronization::kStringTable); | 4831 v->Synchronize(VisitorSynchronization::kStringTable); |
4832 if (mode != VISIT_ALL_IN_SCAVENGE && mode != VISIT_ALL_IN_SWEEP_NEWSPACE) { | 4832 if (mode != VISIT_ALL_IN_SCAVENGE && mode != VISIT_ALL_IN_SWEEP_NEWSPACE) { |
4833 // Scavenge collections have special processing for this. | 4833 // Scavenge collections have special processing for this. |
4834 external_string_table_.Iterate(v); | 4834 external_string_table_.IterateAll(v); |
4835 } | 4835 } |
4836 v->Synchronize(VisitorSynchronization::kExternalStringsTable); | 4836 v->Synchronize(VisitorSynchronization::kExternalStringsTable); |
4837 } | 4837 } |
4838 | 4838 |
4839 | 4839 |
4840 void Heap::IterateSmiRoots(ObjectVisitor* v) { | 4840 void Heap::IterateSmiRoots(ObjectVisitor* v) { |
4841 // Acquire execution access since we are going to read stack limit values. | 4841 // Acquire execution access since we are going to read stack limit values. |
4842 ExecutionAccess access(isolate()); | 4842 ExecutionAccess access(isolate()); |
4843 v->VisitPointers(&roots_[kSmiRootsStart], &roots_[kRootListLength]); | 4843 v->VisitPointers(&roots_[kSmiRootsStart], &roots_[kRootListLength]); |
4844 v->Synchronize(VisitorSynchronization::kSmiRootList); | 4844 v->Synchronize(VisitorSynchronization::kSmiRootList); |
(...skipping 1470 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6315 IterateRoots(&tracer, VISIT_ONLY_STRONG); | 6315 IterateRoots(&tracer, VISIT_ONLY_STRONG); |
6316 } | 6316 } |
6317 #endif | 6317 #endif |
6318 | 6318 |
6319 void Heap::UpdateTotalGCTime(double duration) { | 6319 void Heap::UpdateTotalGCTime(double duration) { |
6320 if (FLAG_trace_gc_verbose) { | 6320 if (FLAG_trace_gc_verbose) { |
6321 total_gc_time_ms_ += duration; | 6321 total_gc_time_ms_ += duration; |
6322 } | 6322 } |
6323 } | 6323 } |
6324 | 6324 |
6325 void Heap::ExternalStringTable::CleanUp() { | 6325 void Heap::ExternalStringTable::CleanUpNewSpaceStrings() { |
6326 int last = 0; | 6326 int last = 0; |
6327 Isolate* isolate = heap_->isolate(); | 6327 Isolate* isolate = heap_->isolate(); |
6328 for (int i = 0; i < new_space_strings_.length(); ++i) { | 6328 for (int i = 0; i < new_space_strings_.length(); ++i) { |
6329 if (new_space_strings_[i]->IsTheHole(isolate)) { | 6329 if (new_space_strings_[i]->IsTheHole(isolate)) { |
6330 continue; | 6330 continue; |
6331 } | 6331 } |
6332 DCHECK(new_space_strings_[i]->IsExternalString()); | 6332 DCHECK(new_space_strings_[i]->IsExternalString()); |
6333 if (heap_->InNewSpace(new_space_strings_[i])) { | 6333 if (heap_->InNewSpace(new_space_strings_[i])) { |
6334 new_space_strings_[last++] = new_space_strings_[i]; | 6334 new_space_strings_[last++] = new_space_strings_[i]; |
6335 } else { | 6335 } else { |
6336 old_space_strings_.Add(new_space_strings_[i]); | 6336 old_space_strings_.Add(new_space_strings_[i]); |
6337 } | 6337 } |
6338 } | 6338 } |
6339 new_space_strings_.Rewind(last); | 6339 new_space_strings_.Rewind(last); |
6340 new_space_strings_.Trim(); | 6340 new_space_strings_.Trim(); |
| 6341 } |
6341 | 6342 |
6342 last = 0; | 6343 void Heap::ExternalStringTable::CleanUpAll() { |
| 6344 CleanUpNewSpaceStrings(); |
| 6345 int last = 0; |
| 6346 Isolate* isolate = heap_->isolate(); |
6343 for (int i = 0; i < old_space_strings_.length(); ++i) { | 6347 for (int i = 0; i < old_space_strings_.length(); ++i) { |
6344 if (old_space_strings_[i]->IsTheHole(isolate)) { | 6348 if (old_space_strings_[i]->IsTheHole(isolate)) { |
6345 continue; | 6349 continue; |
6346 } | 6350 } |
6347 DCHECK(old_space_strings_[i]->IsExternalString()); | 6351 DCHECK(old_space_strings_[i]->IsExternalString()); |
6348 DCHECK(!heap_->InNewSpace(old_space_strings_[i])); | 6352 DCHECK(!heap_->InNewSpace(old_space_strings_[i])); |
6349 old_space_strings_[last++] = old_space_strings_[i]; | 6353 old_space_strings_[last++] = old_space_strings_[i]; |
6350 } | 6354 } |
6351 old_space_strings_.Rewind(last); | 6355 old_space_strings_.Rewind(last); |
6352 old_space_strings_.Trim(); | 6356 old_space_strings_.Trim(); |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6471 } | 6475 } |
6472 | 6476 |
6473 | 6477 |
6474 // static | 6478 // static |
6475 int Heap::GetStaticVisitorIdForMap(Map* map) { | 6479 int Heap::GetStaticVisitorIdForMap(Map* map) { |
6476 return StaticVisitorBase::GetVisitorId(map); | 6480 return StaticVisitorBase::GetVisitorId(map); |
6477 } | 6481 } |
6478 | 6482 |
6479 } // namespace internal | 6483 } // namespace internal |
6480 } // namespace v8 | 6484 } // namespace v8 |
OLD | NEW |