Index: src/heap/heap.cc |
diff --git a/src/heap/heap.cc b/src/heap/heap.cc |
index 5af21e18c0df762e7efb97e2778e6e708ad8f066..6d78b03a96e3379981ad6f57246dfafa3b8cd790 100644 |
--- a/src/heap/heap.cc |
+++ b/src/heap/heap.cc |
@@ -618,6 +618,7 @@ void Heap::GarbageCollectionEpilogue() { |
if (FLAG_gc_verbose) Print(); |
if (FLAG_code_stats) ReportCodeStatistics("After GC"); |
#endif |
+ if (FLAG_check_handle_count) CheckHandleCount(); |
if (FLAG_deopt_every_n_garbage_collections > 0) { |
// TODO(jkummerow/ulan/jarin): This is not safe! We can't assume that |
// the topmost optimized frame can be deoptimized safely, because it |
@@ -5649,6 +5650,24 @@ void Heap::PrintHandles() { |
#endif |
+class CheckHandleCountVisitor : public ObjectVisitor { |
+ public: |
+ CheckHandleCountVisitor() : handle_count_(0) {} |
+ ~CheckHandleCountVisitor() { CHECK(handle_count_ < 1000); } |
+ void VisitPointers(Object** start, Object** end) { |
+ handle_count_ += end - start; |
+ } |
+ |
+ private: |
+ ptrdiff_t handle_count_; |
+}; |
+ |
+ |
+void Heap::CheckHandleCount() { |
+ CheckHandleCountVisitor v; |
+ isolate_->handle_scope_implementer()->Iterate(&v); |
+} |
+ |
Space* AllSpaces::next() { |
switch (counter_++) { |