| Index: src/heap/heap.cc
|
| diff --git a/src/heap/heap.cc b/src/heap/heap.cc
|
| index 29d87033fd551bf46fefcc51a51a76efbce4b8f3..55d7da276856d7be923a4a8dd26eb83e40478e06 100644
|
| --- a/src/heap/heap.cc
|
| +++ b/src/heap/heap.cc
|
| @@ -3109,6 +3109,10 @@ FixedArrayBase* Heap::LeftTrimFixedArray(FixedArrayBase* object,
|
| DCHECK(!lo_space()->Contains(object));
|
| DCHECK(object->map() != fixed_cow_array_map());
|
|
|
| + // Ensure that the no handle-scope has more than one pointer to the same
|
| + // backing-store.
|
| + SLOW_DCHECK(CountHandlesForObject(object) <= 1);
|
| +
|
| STATIC_ASSERT(FixedArrayBase::kMapOffset == 0);
|
| STATIC_ASSERT(FixedArrayBase::kLengthOffset == kPointerSize);
|
| STATIC_ASSERT(FixedArrayBase::kHeaderSize == 2 * kPointerSize);
|
| @@ -5475,6 +5479,32 @@ void Heap::PrintHandles() {
|
|
|
| #endif
|
|
|
| +#ifdef ENABLE_SLOW_DCHECKS
|
| +
|
| +class CountHandleVisitor : public ObjectVisitor {
|
| + public:
|
| + explicit CountHandleVisitor(Object* object) : object_(object) {}
|
| +
|
| + void VisitPointers(Object** start, Object** end) override {
|
| + for (Object** p = start; p < end; p++) {
|
| + if (object_ == reinterpret_cast<Object*>(*p)) count_++;
|
| + }
|
| + }
|
| +
|
| + int count() { return count_; }
|
| +
|
| + private:
|
| + Object* object_;
|
| + int count_ = 0;
|
| +};
|
| +
|
| +int Heap::CountHandlesForObject(Object* object) {
|
| + CountHandleVisitor v(object);
|
| + isolate_->handle_scope_implementer()->Iterate(&v);
|
| + return v.count();
|
| +}
|
| +#endif
|
| +
|
| class CheckHandleCountVisitor : public ObjectVisitor {
|
| public:
|
| CheckHandleCountVisitor() : handle_count_(0) {}
|
|
|