| 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/scopeinfo.h" | 9 #include "src/ast/scopeinfo.h" |
| 10 #include "src/base/bits.h" | 10 #include "src/base/bits.h" |
| (...skipping 3142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3153 const int element_size = object->IsFixedArray() ? kPointerSize : kDoubleSize; | 3153 const int element_size = object->IsFixedArray() ? kPointerSize : kDoubleSize; |
| 3154 const int bytes_to_trim = elements_to_trim * element_size; | 3154 const int bytes_to_trim = elements_to_trim * element_size; |
| 3155 Map* map = object->map(); | 3155 Map* map = object->map(); |
| 3156 | 3156 |
| 3157 // For now this trick is only applied to objects in new and paged space. | 3157 // For now this trick is only applied to objects in new and paged space. |
| 3158 // In large object space the object's start must coincide with chunk | 3158 // In large object space the object's start must coincide with chunk |
| 3159 // and thus the trick is just not applicable. | 3159 // and thus the trick is just not applicable. |
| 3160 DCHECK(!lo_space()->Contains(object)); | 3160 DCHECK(!lo_space()->Contains(object)); |
| 3161 DCHECK(object->map() != fixed_cow_array_map()); | 3161 DCHECK(object->map() != fixed_cow_array_map()); |
| 3162 | 3162 |
| 3163 // Ensure that the no handle-scope has more than one pointer to the same | |
| 3164 // backing-store. | |
| 3165 SLOW_DCHECK(CountHandlesForObject(object) <= 1); | |
| 3166 | |
| 3167 STATIC_ASSERT(FixedArrayBase::kMapOffset == 0); | 3163 STATIC_ASSERT(FixedArrayBase::kMapOffset == 0); |
| 3168 STATIC_ASSERT(FixedArrayBase::kLengthOffset == kPointerSize); | 3164 STATIC_ASSERT(FixedArrayBase::kLengthOffset == kPointerSize); |
| 3169 STATIC_ASSERT(FixedArrayBase::kHeaderSize == 2 * kPointerSize); | 3165 STATIC_ASSERT(FixedArrayBase::kHeaderSize == 2 * kPointerSize); |
| 3170 | 3166 |
| 3171 const int len = object->length(); | 3167 const int len = object->length(); |
| 3172 DCHECK(elements_to_trim <= len); | 3168 DCHECK(elements_to_trim <= len); |
| 3173 | 3169 |
| 3174 // Calculate location of new array start. | 3170 // Calculate location of new array start. |
| 3175 Address new_start = object->address() + bytes_to_trim; | 3171 Address new_start = object->address() + bytes_to_trim; |
| 3176 | 3172 |
| (...skipping 2539 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5716 | 5712 |
| 5717 | 5713 |
| 5718 void Heap::PrintHandles() { | 5714 void Heap::PrintHandles() { |
| 5719 PrintF("Handles:\n"); | 5715 PrintF("Handles:\n"); |
| 5720 PrintHandleVisitor v; | 5716 PrintHandleVisitor v; |
| 5721 isolate_->handle_scope_implementer()->Iterate(&v); | 5717 isolate_->handle_scope_implementer()->Iterate(&v); |
| 5722 } | 5718 } |
| 5723 | 5719 |
| 5724 #endif | 5720 #endif |
| 5725 | 5721 |
| 5726 #ifdef ENABLE_SLOW_DCHECKS | |
| 5727 | |
| 5728 class CountHandleVisitor : public ObjectVisitor { | |
| 5729 public: | |
| 5730 explicit CountHandleVisitor(Object* object) : object_(object) {} | |
| 5731 | |
| 5732 void VisitPointers(Object** start, Object** end) override { | |
| 5733 for (Object** p = start; p < end; p++) { | |
| 5734 if (object_ == reinterpret_cast<Object*>(*p)) count_++; | |
| 5735 } | |
| 5736 } | |
| 5737 | |
| 5738 int count() { return count_; } | |
| 5739 | |
| 5740 private: | |
| 5741 Object* object_; | |
| 5742 int count_ = 0; | |
| 5743 }; | |
| 5744 | |
| 5745 int Heap::CountHandlesForObject(Object* object) { | |
| 5746 CountHandleVisitor v(object); | |
| 5747 isolate_->handle_scope_implementer()->Iterate(&v); | |
| 5748 return v.count(); | |
| 5749 } | |
| 5750 #endif | |
| 5751 | |
| 5752 class CheckHandleCountVisitor : public ObjectVisitor { | 5722 class CheckHandleCountVisitor : public ObjectVisitor { |
| 5753 public: | 5723 public: |
| 5754 CheckHandleCountVisitor() : handle_count_(0) {} | 5724 CheckHandleCountVisitor() : handle_count_(0) {} |
| 5755 ~CheckHandleCountVisitor() override { | 5725 ~CheckHandleCountVisitor() override { |
| 5756 CHECK(handle_count_ < HandleScope::kCheckHandleThreshold); | 5726 CHECK(handle_count_ < HandleScope::kCheckHandleThreshold); |
| 5757 } | 5727 } |
| 5758 void VisitPointers(Object** start, Object** end) override { | 5728 void VisitPointers(Object** start, Object** end) override { |
| 5759 handle_count_ += end - start; | 5729 handle_count_ += end - start; |
| 5760 } | 5730 } |
| 5761 | 5731 |
| (...skipping 690 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6452 } | 6422 } |
| 6453 | 6423 |
| 6454 | 6424 |
| 6455 // static | 6425 // static |
| 6456 int Heap::GetStaticVisitorIdForMap(Map* map) { | 6426 int Heap::GetStaticVisitorIdForMap(Map* map) { |
| 6457 return StaticVisitorBase::GetVisitorId(map); | 6427 return StaticVisitorBase::GetVisitorId(map); |
| 6458 } | 6428 } |
| 6459 | 6429 |
| 6460 } // namespace internal | 6430 } // namespace internal |
| 6461 } // namespace v8 | 6431 } // namespace v8 |
| OLD | NEW |