Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(43)

Side by Side Diff: src/heap/heap.cc

Issue 2549773002: Internalize strings in-place (Closed)
Patch Set: rebased Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/heap/heap.h ('k') | src/heap/heap-inl.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 1720 matching lines...) Expand 10 before | Expand all | Expand 10 after
1731 SetGCState(NOT_IN_GC); 1731 SetGCState(NOT_IN_GC);
1732 } 1732 }
1733 1733
1734 1734
1735 String* Heap::UpdateNewSpaceReferenceInExternalStringTableEntry(Heap* heap, 1735 String* Heap::UpdateNewSpaceReferenceInExternalStringTableEntry(Heap* heap,
1736 Object** p) { 1736 Object** p) {
1737 MapWord first_word = HeapObject::cast(*p)->map_word(); 1737 MapWord first_word = HeapObject::cast(*p)->map_word();
1738 1738
1739 if (!first_word.IsForwardingAddress()) { 1739 if (!first_word.IsForwardingAddress()) {
1740 // Unreachable external string can be finalized. 1740 // Unreachable external string can be finalized.
1741 heap->FinalizeExternalString(String::cast(*p)); 1741 String* string = String::cast(*p);
1742 if (!string->IsExternalString()) {
1743 // Original external string has been internalized.
1744 DCHECK(string->IsThinString());
1745 return NULL;
1746 }
1747 heap->FinalizeExternalString(string);
1742 return NULL; 1748 return NULL;
1743 } 1749 }
1744 1750
1745 // String is still reachable. 1751 // String is still reachable.
1746 return String::cast(first_word.ToForwardingAddress()); 1752 String* string = String::cast(first_word.ToForwardingAddress());
1753 if (string->IsThinString()) string = ThinString::cast(string)->actual();
1754 // Internalization can replace external strings with non-external strings.
1755 return string->IsExternalString() ? string : nullptr;
1747 } 1756 }
1748 1757
1749 1758
1750 void Heap::UpdateNewSpaceReferencesInExternalStringTable( 1759 void Heap::UpdateNewSpaceReferencesInExternalStringTable(
1751 ExternalStringTableUpdaterCallback updater_func) { 1760 ExternalStringTableUpdaterCallback updater_func) {
1752 if (external_string_table_.new_space_strings_.is_empty()) return; 1761 if (external_string_table_.new_space_strings_.is_empty()) return;
1753 1762
1754 Object** start = &external_string_table_.new_space_strings_[0]; 1763 Object** start = &external_string_table_.new_space_strings_[0];
1755 Object** end = start + external_string_table_.new_space_strings_.length(); 1764 Object** end = start + external_string_table_.new_space_strings_.length();
1756 Object** last = start; 1765 Object** last = start;
(...skipping 4673 matching lines...) Expand 10 before | Expand all | Expand 10 after
6430 void Heap::UpdateTotalGCTime(double duration) { 6439 void Heap::UpdateTotalGCTime(double duration) {
6431 if (FLAG_trace_gc_verbose) { 6440 if (FLAG_trace_gc_verbose) {
6432 total_gc_time_ms_ += duration; 6441 total_gc_time_ms_ += duration;
6433 } 6442 }
6434 } 6443 }
6435 6444
6436 void Heap::ExternalStringTable::CleanUpNewSpaceStrings() { 6445 void Heap::ExternalStringTable::CleanUpNewSpaceStrings() {
6437 int last = 0; 6446 int last = 0;
6438 Isolate* isolate = heap_->isolate(); 6447 Isolate* isolate = heap_->isolate();
6439 for (int i = 0; i < new_space_strings_.length(); ++i) { 6448 for (int i = 0; i < new_space_strings_.length(); ++i) {
6440 if (new_space_strings_[i]->IsTheHole(isolate)) { 6449 Object* o = new_space_strings_[i];
6450 if (o->IsTheHole(isolate)) {
6441 continue; 6451 continue;
6442 } 6452 }
6443 DCHECK(new_space_strings_[i]->IsExternalString()); 6453 if (o->IsThinString()) {
6444 if (heap_->InNewSpace(new_space_strings_[i])) { 6454 o = ThinString::cast(o)->actual();
6445 new_space_strings_[last++] = new_space_strings_[i]; 6455 if (!o->IsExternalString()) continue;
6456 }
6457 DCHECK(o->IsExternalString());
6458 if (heap_->InNewSpace(o)) {
6459 new_space_strings_[last++] = o;
6446 } else { 6460 } else {
6447 old_space_strings_.Add(new_space_strings_[i]); 6461 old_space_strings_.Add(o);
6448 } 6462 }
6449 } 6463 }
6450 new_space_strings_.Rewind(last); 6464 new_space_strings_.Rewind(last);
6451 new_space_strings_.Trim(); 6465 new_space_strings_.Trim();
6452 } 6466 }
6453 6467
6454 void Heap::ExternalStringTable::CleanUpAll() { 6468 void Heap::ExternalStringTable::CleanUpAll() {
6455 CleanUpNewSpaceStrings(); 6469 CleanUpNewSpaceStrings();
6456 int last = 0; 6470 int last = 0;
6457 Isolate* isolate = heap_->isolate(); 6471 Isolate* isolate = heap_->isolate();
6458 for (int i = 0; i < old_space_strings_.length(); ++i) { 6472 for (int i = 0; i < old_space_strings_.length(); ++i) {
6459 if (old_space_strings_[i]->IsTheHole(isolate)) { 6473 Object* o = old_space_strings_[i];
6474 if (o->IsTheHole(isolate)) {
6460 continue; 6475 continue;
6461 } 6476 }
6462 DCHECK(old_space_strings_[i]->IsExternalString()); 6477 if (o->IsThinString()) {
6463 DCHECK(!heap_->InNewSpace(old_space_strings_[i])); 6478 o = ThinString::cast(o)->actual();
6464 old_space_strings_[last++] = old_space_strings_[i]; 6479 if (!o->IsExternalString()) continue;
6480 }
6481 DCHECK(o->IsExternalString());
6482 DCHECK(!heap_->InNewSpace(o));
6483 old_space_strings_[last++] = o;
6465 } 6484 }
6466 old_space_strings_.Rewind(last); 6485 old_space_strings_.Rewind(last);
6467 old_space_strings_.Trim(); 6486 old_space_strings_.Trim();
6468 #ifdef VERIFY_HEAP 6487 #ifdef VERIFY_HEAP
6469 if (FLAG_verify_heap) { 6488 if (FLAG_verify_heap) {
6470 Verify(); 6489 Verify();
6471 } 6490 }
6472 #endif 6491 #endif
6473 } 6492 }
6474 6493
6475 void Heap::ExternalStringTable::TearDown() { 6494 void Heap::ExternalStringTable::TearDown() {
6476 for (int i = 0; i < new_space_strings_.length(); ++i) { 6495 for (int i = 0; i < new_space_strings_.length(); ++i) {
6477 heap_->FinalizeExternalString(ExternalString::cast(new_space_strings_[i])); 6496 Object* o = new_space_strings_[i];
6497 if (o->IsThinString()) {
6498 o = ThinString::cast(o)->actual();
6499 if (!o->IsExternalString()) continue;
6500 }
6501 heap_->FinalizeExternalString(ExternalString::cast(o));
6478 } 6502 }
6479 new_space_strings_.Free(); 6503 new_space_strings_.Free();
6480 for (int i = 0; i < old_space_strings_.length(); ++i) { 6504 for (int i = 0; i < old_space_strings_.length(); ++i) {
6481 heap_->FinalizeExternalString(ExternalString::cast(old_space_strings_[i])); 6505 Object* o = old_space_strings_[i];
6506 if (o->IsThinString()) {
6507 o = ThinString::cast(o)->actual();
6508 if (!o->IsExternalString()) continue;
6509 }
6510 heap_->FinalizeExternalString(ExternalString::cast(o));
6482 } 6511 }
6483 old_space_strings_.Free(); 6512 old_space_strings_.Free();
6484 } 6513 }
6485 6514
6486 6515
6487 void Heap::RememberUnmappedPage(Address page, bool compacted) { 6516 void Heap::RememberUnmappedPage(Address page, bool compacted) {
6488 uintptr_t p = reinterpret_cast<uintptr_t>(page); 6517 uintptr_t p = reinterpret_cast<uintptr_t>(page);
6489 // Tag the page pointer to make it findable in the dump file. 6518 // Tag the page pointer to make it findable in the dump file.
6490 if (compacted) { 6519 if (compacted) {
6491 p ^= 0xc1ead & (Page::kPageSize - 1); // Cleared. 6520 p ^= 0xc1ead & (Page::kPageSize - 1); // Cleared.
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
6586 } 6615 }
6587 6616
6588 6617
6589 // static 6618 // static
6590 int Heap::GetStaticVisitorIdForMap(Map* map) { 6619 int Heap::GetStaticVisitorIdForMap(Map* map) {
6591 return StaticVisitorBase::GetVisitorId(map); 6620 return StaticVisitorBase::GetVisitorId(map);
6592 } 6621 }
6593 6622
6594 } // namespace internal 6623 } // namespace internal
6595 } // namespace v8 6624 } // namespace v8
OLDNEW
« no previous file with comments | « src/heap/heap.h ('k') | src/heap/heap-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698