| // Copyright 2014 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include"Config.h" |
| #include"Edge.h" |
| #include"RecordInfo.h" |
| |
| TracingStatusValue::NeedsTracing(NeedsTracingOption option){ |
| return value_->NeedsTracing(option); |
| } |
| |
| boolValue::NeedsFinalization(){return value_->NeedsFinalization();} |
| |
| Collection::Collection(RecordInfo* info) |
| : info_(info), on_heap_(Config::IsGCCollection(info_->name())){} |
| boolCollection::NeedsFinalization(){return info_->NeedsFinalization();} |
| boolCollection::IsSTDCollection(){ |
| returnConfig::IsSTDCollection(info_->name()); |
| } |
| std::stringCollection::GetCollectionName()const{ |
| return info_->name(); |
| } |
| TracingStatusCollection::NeedsTracing(NeedsTracingOption){ |
| if(on_heap_){ |
| returnTracingStatus::Needed(); |
| } |
| |
| // This will be handled by matchers. |
| if(IsSTDCollection()){ |
| if((GetCollectionName()=="array")&&!members_.empty()){ |
| Edge* type= members_.at(0); |
| if(type->IsMember()|| type->IsWeakMember()|| |
| type->IsTraceWrapperV8Reference()){ |
| returnTracingStatus::Needed(); |
| } |
| } |
| returnTracingStatus::Unknown(); |
| } |
| |
| // For off-heap collections, determine tracing status of members. |
| TracingStatus status=TracingStatus::Unneeded(); |
| for(Members::iterator it= members_.begin(); it!= members_.end();++it){ |
| // Do a non-recursive test here since members could equal the holder. |
| status= status.LUB((*it)->NeedsTracing(kNonRecursive)); |
| } |
| return status; |
| } |
| |
| Iterator::Iterator(RecordInfo* info) |
| : info_(info), on_heap_(Config::IsGCCollection(info_->name())){} |
| |
| voidRecursiveEdgeVisitor::AtValue(Value*){} |
| voidRecursiveEdgeVisitor::AtRawPtr(RawPtr*){} |
| voidRecursiveEdgeVisitor::AtRefPtr(RefPtr*){} |
| voidRecursiveEdgeVisitor::AtUniquePtr(UniquePtr*){} |
| voidRecursiveEdgeVisitor::AtMember(Member*){} |
| voidRecursiveEdgeVisitor::AtWeakMember(WeakMember*){} |
| voidRecursiveEdgeVisitor::AtPersistent(Persistent*){} |
| voidRecursiveEdgeVisitor::AtCrossThreadPersistent(CrossThreadPersistent*){} |
| voidRecursiveEdgeVisitor::AtCollection(Collection*){} |
| voidRecursiveEdgeVisitor::AtIterator(Iterator*){} |
| voidRecursiveEdgeVisitor::AtTraceWrapperV8Reference(TraceWrapperV8Reference*){ |
| } |
| voidRecursiveEdgeVisitor::AtArrayEdge(ArrayEdge*){} |
| |
| voidRecursiveEdgeVisitor::VisitValue(Value* e){ |
| AtValue(e); |
| } |
| |
| voidRecursiveEdgeVisitor::VisitRawPtr(RawPtr* e){ |
| AtRawPtr(e); |
| Enter(e); |
| e->ptr()->Accept(this); |
| Leave(); |
| } |
| |
| voidRecursiveEdgeVisitor::VisitRefPtr(RefPtr* e){ |
| AtRefPtr(e); |
| Enter(e); |
| e->ptr()->Accept(this); |
| Leave(); |
| } |
| |
| voidRecursiveEdgeVisitor::VisitUniquePtr(UniquePtr* e){ |
| AtUniquePtr(e); |
| Enter(e); |
| e->ptr()->Accept(this); |
| Leave(); |
| } |
| |
| voidRecursiveEdgeVisitor::VisitMember(Member* e){ |
| AtMember(e); |
| Enter(e); |
| e->ptr()->Accept(this); |
| Leave(); |
| } |
| |
| voidRecursiveEdgeVisitor::VisitWeakMember(WeakMember* e){ |
| AtWeakMember(e); |
| Enter(e); |
| e->ptr()->Accept(this); |
| Leave(); |
| } |
| |
| voidRecursiveEdgeVisitor::VisitPersistent(Persistent* e){ |
| AtPersistent(e); |
| Enter(e); |
| e->ptr()->Accept(this); |
| Leave(); |
| } |
| |
| voidRecursiveEdgeVisitor::VisitCrossThreadPersistent( |
| CrossThreadPersistent* e){ |
| AtCrossThreadPersistent(e); |
| Enter(e); |
| e->ptr()->Accept(this); |
| Leave(); |
| } |
| |
| voidRecursiveEdgeVisitor::VisitCollection(Collection* e){ |
| AtCollection(e); |
| Enter(e); |
| e->AcceptMembers(this); |
| Leave(); |
| } |
| |
| voidRecursiveEdgeVisitor::VisitIterator(Iterator* e){ |
| AtIterator(e); |
| } |
| |
| voidRecursiveEdgeVisitor::VisitTraceWrapperV8Reference( |
| TraceWrapperV8Reference* e){ |
| AtTraceWrapperV8Reference(e); |
| Enter(e); |
| e->ptr()->Accept(this); |
| Leave(); |
| } |
| |
| voidRecursiveEdgeVisitor::VisitArrayEdge(ArrayEdge* e){ |
| AtArrayEdge(e); |
| } |