Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "Config.h" | 5 #include "Config.h" |
| 6 #include "RecordInfo.h" | 6 #include "RecordInfo.h" |
| 7 | 7 |
| 8 #include "clang/AST/Attr.h" | 8 #include "clang/AST/Attr.h" |
| 9 | 9 |
| 10 using namespace clang; | 10 using namespace clang; |
| 11 using std::string; | 11 using std::string; |
| 12 | 12 |
| 13 RecordInfo::RecordInfo(CXXRecordDecl* record, RecordCache* cache) | 13 RecordInfo::RecordInfo(CXXRecordDecl* record, RecordCache* cache) |
| 14 : cache_(cache), | 14 : cache_(cache), |
| 15 record_(record), | 15 record_(record), |
| 16 name_(record->getName()), | 16 name_(record->getName()), |
| 17 fields_need_tracing_(TracingStatus::Unknown()), | 17 fields_need_tracing_(TracingStatus::Unknown()), |
| 18 bases_(0), | 18 bases_(0), |
| 19 fields_(0), | 19 fields_(0), |
| 20 is_stack_allocated_(kMaybe), | |
|
Mads Ager (chromium)
2014/03/20 10:32:29
Wasn't it called kNone in the enum? This is really
zerny-chromium
2014/03/20 15:14:20
Done.
| |
| 20 determined_trace_methods_(false), | 21 determined_trace_methods_(false), |
| 21 trace_method_(0), | 22 trace_method_(0), |
| 22 trace_dispatch_method_(0), | 23 trace_dispatch_method_(0), |
| 23 is_gc_derived_(false), | 24 is_gc_derived_(false), |
| 24 base_paths_(0) {} | 25 base_paths_(0) {} |
| 25 | 26 |
| 26 RecordInfo::~RecordInfo() { | 27 RecordInfo::~RecordInfo() { |
| 27 delete fields_; | 28 delete fields_; |
| 28 delete bases_; | 29 delete bases_; |
| 29 delete base_paths_; | 30 delete base_paths_; |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 144 if (!record || IsAnnotated(record, "blink_gc_plugin_ignore")) | 145 if (!record || IsAnnotated(record, "blink_gc_plugin_ignore")) |
| 145 return 0; | 146 return 0; |
| 146 Cache::iterator it = cache_.find(record); | 147 Cache::iterator it = cache_.find(record); |
| 147 if (it != cache_.end()) | 148 if (it != cache_.end()) |
| 148 return &it->second; | 149 return &it->second; |
| 149 return &cache_.insert(std::make_pair(record, RecordInfo(record, this))) | 150 return &cache_.insert(std::make_pair(record, RecordInfo(record, this))) |
| 150 .first->second; | 151 .first->second; |
| 151 } | 152 } |
| 152 | 153 |
| 153 bool RecordInfo::IsStackAllocated() { | 154 bool RecordInfo::IsStackAllocated() { |
| 154 for (CXXRecordDecl::method_iterator it = record_->method_begin(); | 155 if (is_stack_allocated_ == kNone) { |
| 155 it != record_->method_end(); | 156 is_stack_allocated_ = kFalse; |
| 156 ++it) { | 157 for (CXXRecordDecl::method_iterator it = record_->method_begin(); |
| 157 if (it->getNameAsString() == kNewOperatorName) | 158 it != record_->method_end(); |
| 158 return it->isDeleted() && IsAnnotated(*it, "blink_stack_allocated"); | 159 ++it) { |
| 160 if (it->getNameAsString() == kNewOperatorName) { | |
| 161 if (it->isDeleted() && IsAnnotated(*it, "blink_stack_allocated")) { | |
| 162 is_stack_allocated_ = kTrue; | |
| 163 break; | |
| 164 } | |
| 165 } | |
| 166 } | |
| 159 } | 167 } |
| 160 return false; | 168 return is_stack_allocated_; |
| 161 } | 169 } |
| 162 | 170 |
| 163 // An object requires a tracing method if it has any fields that need tracing. | 171 // An object requires a tracing method if it has any fields that need tracing. |
| 164 bool RecordInfo::RequiresTraceMethod() { | 172 bool RecordInfo::RequiresTraceMethod() { |
| 173 if (IsStackAllocated()) | |
| 174 return false; | |
| 165 GetFields(); | 175 GetFields(); |
| 166 return fields_need_tracing_.IsNeeded(); | 176 return fields_need_tracing_.IsNeeded(); |
| 167 } | 177 } |
| 168 | 178 |
| 169 // Get the actual tracing method (ie, can be traceAfterDispatch if there is a | 179 // Get the actual tracing method (ie, can be traceAfterDispatch if there is a |
| 170 // dispatch method). | 180 // dispatch method). |
| 171 CXXMethodDecl* RecordInfo::GetTraceMethod() { | 181 CXXMethodDecl* RecordInfo::GetTraceMethod() { |
| 172 DetermineTracingMethods(); | 182 DetermineTracingMethods(); |
| 173 return trace_method_; | 183 return trace_method_; |
| 174 } | 184 } |
| (...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 418 // We failed to create an edge so abort the entire edge construction. | 428 // We failed to create an edge so abort the entire edge construction. |
| 419 delete edge; // Will delete the already allocated members. | 429 delete edge; // Will delete the already allocated members. |
| 420 return 0; | 430 return 0; |
| 421 } | 431 } |
| 422 } | 432 } |
| 423 return edge; | 433 return edge; |
| 424 } | 434 } |
| 425 | 435 |
| 426 return new Value(info); | 436 return new Value(info); |
| 427 } | 437 } |
| OLD | NEW |