OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium 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 "CheckFinalizerVisitor.h" | 5 #include "CheckFinalizerVisitor.h" |
6 | 6 |
7 using namespace clang; | 7 using namespace clang; |
8 | 8 |
9 namespace { | 9 namespace { |
10 | 10 |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
100 | 100 |
101 bool CheckFinalizerVisitor::VisitMemberExpr(MemberExpr* member) { | 101 bool CheckFinalizerVisitor::VisitMemberExpr(MemberExpr* member) { |
102 FieldDecl* field = dyn_cast<FieldDecl>(member->getMemberDecl()); | 102 FieldDecl* field = dyn_cast<FieldDecl>(member->getMemberDecl()); |
103 if (!field) | 103 if (!field) |
104 return true; | 104 return true; |
105 | 105 |
106 RecordInfo* info = cache_->Lookup(field->getParent()); | 106 RecordInfo* info = cache_->Lookup(field->getParent()); |
107 if (!info) | 107 if (!info) |
108 return true; | 108 return true; |
109 | 109 |
110 RecordInfo::Fields::iterator it = info->GetFields().find(field); | 110 if (!info->HasField(field)) |
111 if (it == info->GetFields().end()) | |
112 return true; | 111 return true; |
113 | 112 |
114 if (seen_members_.find(member) != seen_members_.end()) | 113 if (seen_members_.find(member) != seen_members_.end()) |
115 return true; | 114 return true; |
116 | 115 |
117 bool as_eagerly_finalized = false; | 116 bool as_eagerly_finalized = false; |
118 if (blacklist_context_ && | 117 if (blacklist_context_ && |
119 MightBeCollected(&it->second, &as_eagerly_finalized)) { | 118 MightBeCollected(&info->GetField(field).second, &as_eagerly_finalized)) { |
120 finalized_fields_.push_back( | 119 finalized_fields_.push_back( |
121 Error(member, as_eagerly_finalized, &it->second)); | 120 Error(member, as_eagerly_finalized, &info->GetField(field).second)); |
122 seen_members_.insert(member); | 121 seen_members_.insert(member); |
123 } | 122 } |
124 return true; | 123 return true; |
125 } | 124 } |
126 | 125 |
127 bool CheckFinalizerVisitor::MightBeCollected(FieldPoint* point, | 126 bool CheckFinalizerVisitor::MightBeCollected(FieldPoint* point, |
128 bool* as_eagerly_finalized) { | 127 bool* as_eagerly_finalized) { |
129 MightBeCollectedVisitor visitor(is_eagerly_finalized_); | 128 MightBeCollectedVisitor visitor(is_eagerly_finalized_); |
130 point->edge()->Accept(&visitor); | 129 point->edge()->Accept(&visitor); |
131 *as_eagerly_finalized = visitor.as_eagerly_finalized(); | 130 *as_eagerly_finalized = visitor.as_eagerly_finalized(); |
132 return visitor.might_be_collected(); | 131 return visitor.might_be_collected(); |
133 } | 132 } |
OLD | NEW |