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 "CheckTraceVisitor.h" | 5 #include "CheckTraceVisitor.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "Config.h" | 9 #include "Config.h" |
10 | 10 |
(...skipping 342 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
353 } | 353 } |
354 } | 354 } |
355 } | 355 } |
356 return true; | 356 return true; |
357 } | 357 } |
358 | 358 |
359 bool CheckTraceVisitor::IsWeakCallback() const { | 359 bool CheckTraceVisitor::IsWeakCallback() const { |
360 return !trace_; | 360 return !trace_; |
361 } | 361 } |
362 | 362 |
363 void CheckTraceVisitor::MarkTraced(RecordInfo::Fields::iterator it) { | 363 void CheckTraceVisitor::MarkTraced(RecordInfo::Field& field) { |
364 // In a weak callback we can't mark strong fields as traced. | 364 // In a weak callback we can't mark strong fields as traced. |
365 if (IsWeakCallback() && !it->second.edge()->IsWeakMember()) | 365 if (IsWeakCallback() && !field.second.edge()->IsWeakMember()) |
366 return; | 366 return; |
367 it->second.MarkTraced(); | 367 field.second.MarkTraced(); |
368 } | 368 } |
369 | 369 |
370 void CheckTraceVisitor::FoundField(FieldDecl* field) { | 370 void CheckTraceVisitor::FoundField(FieldDecl* field) { |
371 if (Config::IsTemplateInstantiation(info_->record())) { | 371 if (Config::IsTemplateInstantiation(info_->record())) { |
372 // Pointer equality on fields does not work for template instantiations. | 372 // Pointer equality on fields does not work for template instantiations. |
373 // The trace method refers to fields of the template definition which | 373 // The trace method refers to fields of the template definition which |
374 // are different from the instantiated fields that need to be traced. | 374 // are different from the instantiated fields that need to be traced. |
375 const std::string& name = field->getNameAsString(); | 375 const std::string& name = field->getNameAsString(); |
376 for (RecordInfo::Fields::iterator it = info_->GetFields().begin(); | 376 for (RecordInfo::Fields::iterator it = info_->GetFields().begin(); |
377 it != info_->GetFields().end(); | 377 it != info_->GetFields().end(); |
378 ++it) { | 378 ++it) { |
379 if (it->first->getNameAsString() == name) { | 379 if (it->first->getNameAsString() == name) { |
380 MarkTraced(it); | 380 MarkTraced(*it); |
381 break; | 381 break; |
382 } | 382 } |
383 } | 383 } |
384 } else { | 384 } else { |
385 RecordInfo::Fields::iterator it = info_->GetFields().find(field); | 385 if (info_->HasField(field)) |
386 if (it != info_->GetFields().end()) | 386 MarkTraced(info_->GetField(field)); |
387 MarkTraced(it); | |
388 } | 387 } |
389 } | 388 } |
390 | 389 |
391 void CheckTraceVisitor::MarkAllWeakMembersTraced() { | 390 void CheckTraceVisitor::MarkAllWeakMembersTraced() { |
392 // If we find a call to registerWeakMembers which is unresolved we | 391 // If we find a call to registerWeakMembers which is unresolved we |
393 // unsoundly consider all weak members as traced. | 392 // unsoundly consider all weak members as traced. |
394 // TODO: Find out how to validate weak member tracing for unresolved call. | 393 // TODO: Find out how to validate weak member tracing for unresolved call. |
395 for (auto& field : info_->GetFields()) { | 394 for (auto& field : info_->GetFields()) { |
396 if (field.second.edge()->IsWeakMember()) | 395 if (field.second.edge()->IsWeakMember()) |
397 field.second.MarkTraced(); | 396 field.second.MarkTraced(); |
398 } | 397 } |
399 } | 398 } |
OLD | NEW |