Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(35)

Unified Diff: tools/clang/blink_gc_plugin/RecordInfo.cpp

Issue 1645763004: blink_gc_plugin: Make RecordInfo::Get{Fields,Bases} return deterministic order (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: tools/clang/blink_gc_plugin/RecordInfo.cpp
diff --git a/tools/clang/blink_gc_plugin/RecordInfo.cpp b/tools/clang/blink_gc_plugin/RecordInfo.cpp
index 3c166dd4c431374f32ff2851d01654c82d7a805a..5d3aa4776abf2d73bd1c71defe6b39499d50e961 100644
--- a/tools/clang/blink_gc_plugin/RecordInfo.cpp
+++ b/tools/clang/blink_gc_plugin/RecordInfo.cpp
@@ -15,6 +15,7 @@ RecordInfo::RecordInfo(CXXRecordDecl* record, RecordCache* cache)
fields_need_tracing_(TracingStatus::Unknown()),
bases_(0),
fields_(0),
+ field_map_(0),
is_stack_allocated_(kNotComputed),
is_non_newable_(kNotComputed),
is_only_placement_newable_(kNotComputed),
@@ -30,6 +31,7 @@ RecordInfo::RecordInfo(CXXRecordDecl* record, RecordCache* cache)
RecordInfo::~RecordInfo() {
delete fields_;
+ delete field_map_;
delete bases_;
}
@@ -319,7 +321,7 @@ CXXMethodDecl* RecordInfo::GetFinalizeDispatchMethod() {
RecordInfo::Bases& RecordInfo::GetBases() {
if (!bases_)
- bases_ = CollectBases();
+ CollectBases();
return *bases_;
}
@@ -383,11 +385,12 @@ bool RecordInfo::IsConsideredAbstract() {
return true;
}
-RecordInfo::Bases* RecordInfo::CollectBases() {
+void RecordInfo::CollectBases() {
// Compute the collection locally to avoid inconsistent states.
- Bases* bases = new Bases;
+ assert(!bases_);
+ bases_ = new Bases;
if (!record_->hasDefinition())
- return bases;
+ return;
for (CXXRecordDecl::base_class_iterator it = record_->bases_begin();
it != record_->bases_end();
++it) {
@@ -399,22 +402,38 @@ RecordInfo::Bases* RecordInfo::CollectBases() {
TracingStatus status = info->InheritsTrace()
? TracingStatus::Needed()
: TracingStatus::Unneeded();
- bases->insert(std::make_pair(base, BasePoint(spec, info, status)));
+ bases_->push_back(std::make_pair(base, BasePoint(spec, info, status)));
}
- return bases;
}
RecordInfo::Fields& RecordInfo::GetFields() {
- if (!fields_)
- fields_ = CollectFields();
+ if (!fields_) {
+ assert(!field_map_);
+ CollectFields();
+ }
return *fields_;
}
-RecordInfo::Fields* RecordInfo::CollectFields() {
+bool RecordInfo::HasField(clang::FieldDecl* field) {
+ GetFields();
+ assert(field_map_);
+ return field_map_->count(field);
+}
+
+RecordInfo::Field& RecordInfo::GetField(clang::FieldDecl* field) {
+ assert(HasField(field));
+ return fields_->at((*field_map_)[field]);
+}
+
+void RecordInfo::CollectFields() {
// Compute the collection locally to avoid inconsistent states.
- Fields* fields = new Fields;
+ assert(!fields_);
+ fields_ = new Fields;
+ field_map_ = new std::map<clang::FieldDecl*, size_t>;
+
if (!record_->hasDefinition())
- return fields;
+ return;
+
TracingStatus fields_status = TracingStatus::Unneeded();
for (RecordDecl::field_iterator it = record_->field_begin();
it != record_->field_end();
@@ -425,11 +444,11 @@ RecordInfo::Fields* RecordInfo::CollectFields() {
continue;
if (Edge* edge = CreateEdge(field->getType().getTypePtrOrNull())) {
fields_status = fields_status.LUB(edge->NeedsTracing(Edge::kRecursive));
- fields->insert(std::make_pair(field, FieldPoint(field, edge)));
+ (*field_map_)[field] = fields_->size();
+ fields_->push_back(std::make_pair(field, FieldPoint(field, edge)));
}
}
fields_need_tracing_ = fields_status;
- return fields;
}
void RecordInfo::DetermineTracingMethods() {
« tools/clang/blink_gc_plugin/RecordInfo.h ('K') | « tools/clang/blink_gc_plugin/RecordInfo.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698