| 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 // This file defines the names used by GC infrastructure. | 5 // This file defines the names used by GC infrastructure. |
| 6 | 6 |
| 7 // TODO: Restructure the name determination to use fully qualified names (ala, | 7 // TODO: Restructure the name determination to use fully qualified names (ala, |
| 8 // blink::Foo) so that the plugin can be enabled for all of chromium. Doing so | 8 // blink::Foo) so that the plugin can be enabled for all of chromium. Doing so |
| 9 // would allow us to catch errors with structures outside of blink that might | 9 // would allow us to catch errors with structures outside of blink that might |
| 10 // have unsafe pointers to GC allocated blink structures. | 10 // have unsafe pointers to GC allocated blink structures. |
| 11 | 11 |
| 12 #ifndef TOOLS_BLINK_GC_PLUGIN_CONFIG_H_ | 12 #ifndef TOOLS_BLINK_GC_PLUGIN_CONFIG_H_ |
| 13 #define TOOLS_BLINK_GC_PLUGIN_CONFIG_H_ | 13 #define TOOLS_BLINK_GC_PLUGIN_CONFIG_H_ |
| 14 | 14 |
| 15 #include <cassert> | 15 #include <cassert> |
| 16 | 16 |
| 17 #include "clang/AST/AST.h" | 17 #include "clang/AST/AST.h" |
| 18 #include "clang/AST/Attr.h" | 18 #include "clang/AST/Attr.h" |
| 19 | 19 |
| 20 extern const char kNewOperatorName[]; | 20 extern const char kNewOperatorName[]; |
| 21 extern const char* kCreateName; | 21 extern const char* kCreateName; |
| 22 extern const char* kTraceName; | 22 extern const char* kTraceName; |
| 23 extern const char* kTraceImplName; | |
| 24 extern const char* kFinalizeName; | 23 extern const char* kFinalizeName; |
| 25 extern const char* kTraceAfterDispatchName; | 24 extern const char* kTraceAfterDispatchName; |
| 26 extern const char* kTraceAfterDispatchImplName; | |
| 27 extern const char* kRegisterWeakMembersName; | 25 extern const char* kRegisterWeakMembersName; |
| 28 extern const char kHeapAllocatorName[]; | 26 extern const char kHeapAllocatorName[]; |
| 29 extern const char kTraceIfNeededName[]; | 27 extern const char kTraceIfNeededName[]; |
| 30 extern const char kVisitorDispatcherName[]; | 28 extern const char kVisitorDispatcherName[]; |
| 31 extern const char kVisitorVarName[]; | 29 extern const char kVisitorVarName[]; |
| 32 extern const char* kAdjustAndMarkName; | 30 extern const char* kAdjustAndMarkName; |
| 33 extern const char* kIsHeapObjectAliveName; | 31 extern const char* kIsHeapObjectAliveName; |
| 34 extern const char kIsEagerlyFinalizedName[]; | 32 extern const char kIsEagerlyFinalizedName[]; |
| 35 extern const char kConstIteratorName[]; | 33 extern const char kConstIteratorName[]; |
| 36 extern const char kIteratorName[]; | 34 extern const char kIteratorName[]; |
| (...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 212 } | 210 } |
| 213 } | 211 } |
| 214 | 212 |
| 215 return IsVisitorPtrType(formal_type); | 213 return IsVisitorPtrType(formal_type); |
| 216 } | 214 } |
| 217 | 215 |
| 218 enum TraceMethodType { | 216 enum TraceMethodType { |
| 219 NOT_TRACE_METHOD, | 217 NOT_TRACE_METHOD, |
| 220 TRACE_METHOD, | 218 TRACE_METHOD, |
| 221 TRACE_AFTER_DISPATCH_METHOD, | 219 TRACE_AFTER_DISPATCH_METHOD, |
| 222 TRACE_IMPL_METHOD, | |
| 223 TRACE_AFTER_DISPATCH_IMPL_METHOD | |
| 224 }; | 220 }; |
| 225 | 221 |
| 226 static TraceMethodType GetTraceMethodType(const clang::FunctionDecl* method) { | 222 static TraceMethodType GetTraceMethodType(const clang::FunctionDecl* method) { |
| 227 if (method->getNumParams() != 1) | 223 if (method->getNumParams() != 1) |
| 228 return NOT_TRACE_METHOD; | 224 return NOT_TRACE_METHOD; |
| 229 | 225 |
| 230 const std::string& name = method->getNameAsString(); | 226 const std::string& name = method->getNameAsString(); |
| 231 if (name != kTraceName && name != kTraceAfterDispatchName && | 227 if (name != kTraceName && name != kTraceAfterDispatchName) |
| 232 name != kTraceImplName && name != kTraceAfterDispatchImplName) | |
| 233 return NOT_TRACE_METHOD; | 228 return NOT_TRACE_METHOD; |
| 234 | 229 |
| 235 const clang::QualType& formal_type = method->getParamDecl(0)->getType(); | 230 const clang::QualType& formal_type = method->getParamDecl(0)->getType(); |
| 236 if (name == kTraceImplName || name == kTraceAfterDispatchImplName) { | 231 if (!IsVisitorPtrType(formal_type)) { |
| 237 if (!IsVisitorDispatcherType(formal_type)) | |
| 238 return NOT_TRACE_METHOD; | |
| 239 } else if (!IsVisitorPtrType(formal_type)) { | |
| 240 return NOT_TRACE_METHOD; | 232 return NOT_TRACE_METHOD; |
| 241 } | 233 } |
| 242 | 234 |
| 243 if (name == kTraceName) | 235 if (name == kTraceName) |
| 244 return TRACE_METHOD; | 236 return TRACE_METHOD; |
| 245 if (name == kTraceAfterDispatchName) | 237 if (name == kTraceAfterDispatchName) |
| 246 return TRACE_AFTER_DISPATCH_METHOD; | 238 return TRACE_AFTER_DISPATCH_METHOD; |
| 247 if (name == kTraceImplName) | |
| 248 return TRACE_IMPL_METHOD; | |
| 249 if (name == kTraceAfterDispatchImplName) | |
| 250 return TRACE_AFTER_DISPATCH_IMPL_METHOD; | |
| 251 | 239 |
| 252 assert(false && "Should not reach here"); | 240 assert(false && "Should not reach here"); |
| 253 return NOT_TRACE_METHOD; | 241 return NOT_TRACE_METHOD; |
| 254 } | 242 } |
| 255 | 243 |
| 256 static bool IsTraceMethod(const clang::FunctionDecl* method) { | 244 static bool IsTraceMethod(const clang::FunctionDecl* method) { |
| 257 return GetTraceMethodType(method) != NOT_TRACE_METHOD; | 245 return GetTraceMethodType(method) != NOT_TRACE_METHOD; |
| 258 } | 246 } |
| 259 | 247 |
| 260 static bool IsTraceImplName(const std::string& name) { | |
| 261 return name == kTraceImplName || name == kTraceAfterDispatchImplName; | |
| 262 } | |
| 263 | |
| 264 static bool StartsWith(const std::string& str, const std::string& prefix) { | 248 static bool StartsWith(const std::string& str, const std::string& prefix) { |
| 265 if (prefix.size() > str.size()) | 249 if (prefix.size() > str.size()) |
| 266 return false; | 250 return false; |
| 267 return str.compare(0, prefix.size(), prefix) == 0; | 251 return str.compare(0, prefix.size(), prefix) == 0; |
| 268 } | 252 } |
| 269 | 253 |
| 270 static bool EndsWith(const std::string& str, const std::string& suffix) { | 254 static bool EndsWith(const std::string& str, const std::string& suffix) { |
| 271 if (suffix.size() > str.size()) | 255 if (suffix.size() > str.size()) |
| 272 return false; | 256 return false; |
| 273 return str.compare(str.size() - suffix.size(), suffix.size(), suffix) == 0; | 257 return str.compare(str.size() - suffix.size(), suffix.size(), suffix) == 0; |
| 274 } | 258 } |
| 275 | 259 |
| 276 // Test if a template specialization is an instantiation. | 260 // Test if a template specialization is an instantiation. |
| 277 static bool IsTemplateInstantiation(clang::CXXRecordDecl* record); | 261 static bool IsTemplateInstantiation(clang::CXXRecordDecl* record); |
| 278 }; | 262 }; |
| 279 | 263 |
| 280 #endif // TOOLS_BLINK_GC_PLUGIN_CONFIG_H_ | 264 #endif // TOOLS_BLINK_GC_PLUGIN_CONFIG_H_ |
| OLD | NEW |