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 #ifndef V8_HEAP_HEAP_INL_H_ | 5 #ifndef V8_HEAP_HEAP_INL_H_ |
6 #define V8_HEAP_HEAP_INL_H_ | 6 #define V8_HEAP_HEAP_INL_H_ |
7 | 7 |
8 #include <cmath> | 8 #include <cmath> |
9 | 9 |
10 #include "src/base/platform/platform.h" | 10 #include "src/base/platform/platform.h" |
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
316 void Heap::UpdateAllocationsHash(uint32_t value) { | 316 void Heap::UpdateAllocationsHash(uint32_t value) { |
317 uint16_t c1 = static_cast<uint16_t>(value); | 317 uint16_t c1 = static_cast<uint16_t>(value); |
318 uint16_t c2 = static_cast<uint16_t>(value >> 16); | 318 uint16_t c2 = static_cast<uint16_t>(value >> 16); |
319 raw_allocations_hash_ = | 319 raw_allocations_hash_ = |
320 StringHasher::AddCharacterCore(raw_allocations_hash_, c1); | 320 StringHasher::AddCharacterCore(raw_allocations_hash_, c1); |
321 raw_allocations_hash_ = | 321 raw_allocations_hash_ = |
322 StringHasher::AddCharacterCore(raw_allocations_hash_, c2); | 322 StringHasher::AddCharacterCore(raw_allocations_hash_, c2); |
323 } | 323 } |
324 | 324 |
325 | 325 |
| 326 void Heap::RegisterExternalString(String* string) { |
| 327 external_string_table_.AddString(string); |
| 328 } |
| 329 |
| 330 |
326 void Heap::FinalizeExternalString(String* string) { | 331 void Heap::FinalizeExternalString(String* string) { |
327 DCHECK(string->IsExternalString()); | 332 DCHECK(string->IsExternalString()); |
328 v8::String::ExternalStringResourceBase** resource_addr = | 333 v8::String::ExternalStringResourceBase** resource_addr = |
329 reinterpret_cast<v8::String::ExternalStringResourceBase**>( | 334 reinterpret_cast<v8::String::ExternalStringResourceBase**>( |
330 reinterpret_cast<byte*>(string) + ExternalString::kResourceOffset - | 335 reinterpret_cast<byte*>(string) + ExternalString::kResourceOffset - |
331 kHeapObjectTag); | 336 kHeapObjectTag); |
332 | 337 |
333 // Dispose of the C++ object if it has not already been disposed. | 338 // Dispose of the C++ object if it has not already been disposed. |
334 if (*resource_addr != NULL) { | 339 if (*resource_addr != NULL) { |
335 (*resource_addr)->Dispose(); | 340 (*resource_addr)->Dispose(); |
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
601 #define CALL_HEAP_FUNCTION(ISOLATE, FUNCTION_CALL, TYPE) \ | 606 #define CALL_HEAP_FUNCTION(ISOLATE, FUNCTION_CALL, TYPE) \ |
602 CALL_AND_RETRY_OR_DIE(ISOLATE, FUNCTION_CALL, \ | 607 CALL_AND_RETRY_OR_DIE(ISOLATE, FUNCTION_CALL, \ |
603 return Handle<TYPE>(TYPE::cast(__object__), ISOLATE), \ | 608 return Handle<TYPE>(TYPE::cast(__object__), ISOLATE), \ |
604 return Handle<TYPE>()) | 609 return Handle<TYPE>()) |
605 | 610 |
606 | 611 |
607 #define CALL_HEAP_FUNCTION_VOID(ISOLATE, FUNCTION_CALL) \ | 612 #define CALL_HEAP_FUNCTION_VOID(ISOLATE, FUNCTION_CALL) \ |
608 CALL_AND_RETRY_OR_DIE(ISOLATE, FUNCTION_CALL, return, return) | 613 CALL_AND_RETRY_OR_DIE(ISOLATE, FUNCTION_CALL, return, return) |
609 | 614 |
610 | 615 |
611 void ExternalStringTable::AddString(String* string) { | 616 void Heap::ExternalStringTable::AddString(String* string) { |
612 DCHECK(string->IsExternalString()); | 617 DCHECK(string->IsExternalString()); |
613 if (heap_->InNewSpace(string)) { | 618 if (heap_->InNewSpace(string)) { |
614 new_space_strings_.Add(string); | 619 new_space_strings_.Add(string); |
615 } else { | 620 } else { |
616 old_space_strings_.Add(string); | 621 old_space_strings_.Add(string); |
617 } | 622 } |
618 } | 623 } |
619 | 624 |
620 | 625 |
621 void ExternalStringTable::Iterate(ObjectVisitor* v) { | 626 void Heap::ExternalStringTable::Iterate(ObjectVisitor* v) { |
622 if (!new_space_strings_.is_empty()) { | 627 if (!new_space_strings_.is_empty()) { |
623 Object** start = &new_space_strings_[0]; | 628 Object** start = &new_space_strings_[0]; |
624 v->VisitPointers(start, start + new_space_strings_.length()); | 629 v->VisitPointers(start, start + new_space_strings_.length()); |
625 } | 630 } |
626 if (!old_space_strings_.is_empty()) { | 631 if (!old_space_strings_.is_empty()) { |
627 Object** start = &old_space_strings_[0]; | 632 Object** start = &old_space_strings_[0]; |
628 v->VisitPointers(start, start + old_space_strings_.length()); | 633 v->VisitPointers(start, start + old_space_strings_.length()); |
629 } | 634 } |
630 } | 635 } |
631 | 636 |
632 | 637 |
633 // Verify() is inline to avoid ifdef-s around its calls in release | 638 // Verify() is inline to avoid ifdef-s around its calls in release |
634 // mode. | 639 // mode. |
635 void ExternalStringTable::Verify() { | 640 void Heap::ExternalStringTable::Verify() { |
636 #ifdef DEBUG | 641 #ifdef DEBUG |
637 for (int i = 0; i < new_space_strings_.length(); ++i) { | 642 for (int i = 0; i < new_space_strings_.length(); ++i) { |
638 Object* obj = Object::cast(new_space_strings_[i]); | 643 Object* obj = Object::cast(new_space_strings_[i]); |
639 DCHECK(heap_->InNewSpace(obj)); | 644 DCHECK(heap_->InNewSpace(obj)); |
640 DCHECK(obj != heap_->the_hole_value()); | 645 DCHECK(obj != heap_->the_hole_value()); |
641 } | 646 } |
642 for (int i = 0; i < old_space_strings_.length(); ++i) { | 647 for (int i = 0; i < old_space_strings_.length(); ++i) { |
643 Object* obj = Object::cast(old_space_strings_[i]); | 648 Object* obj = Object::cast(old_space_strings_[i]); |
644 DCHECK(!heap_->InNewSpace(obj)); | 649 DCHECK(!heap_->InNewSpace(obj)); |
645 DCHECK(obj != heap_->the_hole_value()); | 650 DCHECK(obj != heap_->the_hole_value()); |
646 } | 651 } |
647 #endif | 652 #endif |
648 } | 653 } |
649 | 654 |
650 | 655 |
651 void ExternalStringTable::AddOldString(String* string) { | 656 void Heap::ExternalStringTable::AddOldString(String* string) { |
652 DCHECK(string->IsExternalString()); | 657 DCHECK(string->IsExternalString()); |
653 DCHECK(!heap_->InNewSpace(string)); | 658 DCHECK(!heap_->InNewSpace(string)); |
654 old_space_strings_.Add(string); | 659 old_space_strings_.Add(string); |
655 } | 660 } |
656 | 661 |
657 | 662 |
658 void ExternalStringTable::ShrinkNewStrings(int position) { | 663 void Heap::ExternalStringTable::ShrinkNewStrings(int position) { |
659 new_space_strings_.Rewind(position); | 664 new_space_strings_.Rewind(position); |
660 #ifdef VERIFY_HEAP | 665 #ifdef VERIFY_HEAP |
661 if (FLAG_verify_heap) { | 666 if (FLAG_verify_heap) { |
662 Verify(); | 667 Verify(); |
663 } | 668 } |
664 #endif | 669 #endif |
665 } | 670 } |
666 | 671 |
667 | 672 |
668 int DescriptorLookupCache::Lookup(Map* source, Name* name) { | 673 int DescriptorLookupCache::Lookup(Map* source, Name* name) { |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
779 | 784 |
780 void VerifySmisVisitor::VisitPointers(Object** start, Object** end) { | 785 void VerifySmisVisitor::VisitPointers(Object** start, Object** end) { |
781 for (Object** current = start; current < end; current++) { | 786 for (Object** current = start; current < end; current++) { |
782 CHECK((*current)->IsSmi()); | 787 CHECK((*current)->IsSmi()); |
783 } | 788 } |
784 } | 789 } |
785 } | 790 } |
786 } // namespace v8::internal | 791 } // namespace v8::internal |
787 | 792 |
788 #endif // V8_HEAP_HEAP_INL_H_ | 793 #endif // V8_HEAP_HEAP_INL_H_ |
OLD | NEW |