| 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. |
| (...skipping 13 matching lines...) Expand all Loading... |
| 24 const char kFinalizeName[] = "finalizeGarbageCollectedObject"; | 24 const char kFinalizeName[] = "finalizeGarbageCollectedObject"; |
| 25 const char kTraceAfterDispatchName[] = "traceAfterDispatch"; | 25 const char kTraceAfterDispatchName[] = "traceAfterDispatch"; |
| 26 const char kTraceAfterDispatchImplName[] = "traceAfterDispatchImpl"; | 26 const char kTraceAfterDispatchImplName[] = "traceAfterDispatchImpl"; |
| 27 const char kRegisterWeakMembersName[] = "registerWeakMembers"; | 27 const char kRegisterWeakMembersName[] = "registerWeakMembers"; |
| 28 const char kHeapAllocatorName[] = "HeapAllocator"; | 28 const char kHeapAllocatorName[] = "HeapAllocator"; |
| 29 const char kTraceIfNeededName[] = "TraceIfNeeded"; | 29 const char kTraceIfNeededName[] = "TraceIfNeeded"; |
| 30 const char kVisitorDispatcherName[] = "VisitorDispatcher"; | 30 const char kVisitorDispatcherName[] = "VisitorDispatcher"; |
| 31 const char kVisitorVarName[] = "visitor"; | 31 const char kVisitorVarName[] = "visitor"; |
| 32 const char kAdjustAndMarkName[] = "adjustAndMark"; | 32 const char kAdjustAndMarkName[] = "adjustAndMark"; |
| 33 const char kIsHeapObjectAliveName[] = "isHeapObjectAlive"; | 33 const char kIsHeapObjectAliveName[] = "isHeapObjectAlive"; |
| 34 const char kIsEagerlyFinalizedName[] = "IsEagerlyFinalizedMarker"; |
| 34 | 35 |
| 35 class Config { | 36 class Config { |
| 36 public: | 37 public: |
| 37 static bool IsMember(const std::string& name) { | 38 static bool IsMember(const std::string& name) { |
| 38 return name == "Member"; | 39 return name == "Member"; |
| 39 } | 40 } |
| 40 | 41 |
| 41 static bool IsWeakMember(const std::string& name) { | 42 static bool IsWeakMember(const std::string& name) { |
| 42 return name == "WeakMember"; | 43 return name == "WeakMember"; |
| 43 } | 44 } |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 207 } | 208 } |
| 208 | 209 |
| 209 enum TraceMethodType { | 210 enum TraceMethodType { |
| 210 NOT_TRACE_METHOD, | 211 NOT_TRACE_METHOD, |
| 211 TRACE_METHOD, | 212 TRACE_METHOD, |
| 212 TRACE_AFTER_DISPATCH_METHOD, | 213 TRACE_AFTER_DISPATCH_METHOD, |
| 213 TRACE_IMPL_METHOD, | 214 TRACE_IMPL_METHOD, |
| 214 TRACE_AFTER_DISPATCH_IMPL_METHOD | 215 TRACE_AFTER_DISPATCH_IMPL_METHOD |
| 215 }; | 216 }; |
| 216 | 217 |
| 217 static TraceMethodType GetTraceMethodType(clang::FunctionDecl* method) { | 218 static TraceMethodType GetTraceMethodType(const clang::FunctionDecl* method) { |
| 218 if (method->getNumParams() != 1) | 219 if (method->getNumParams() != 1) |
| 219 return NOT_TRACE_METHOD; | 220 return NOT_TRACE_METHOD; |
| 220 | 221 |
| 221 const std::string& name = method->getNameAsString(); | 222 const std::string& name = method->getNameAsString(); |
| 222 if (name != kTraceName && name != kTraceAfterDispatchName && | 223 if (name != kTraceName && name != kTraceAfterDispatchName && |
| 223 name != kTraceImplName && name != kTraceAfterDispatchImplName) | 224 name != kTraceImplName && name != kTraceAfterDispatchImplName) |
| 224 return NOT_TRACE_METHOD; | 225 return NOT_TRACE_METHOD; |
| 225 | 226 |
| 226 const clang::QualType& formal_type = method->getParamDecl(0)->getType(); | 227 const clang::QualType& formal_type = method->getParamDecl(0)->getType(); |
| 227 if (name == kTraceImplName || name == kTraceAfterDispatchImplName) { | 228 if (name == kTraceImplName || name == kTraceAfterDispatchImplName) { |
| 228 if (!IsVisitorDispatcherType(formal_type)) | 229 if (!IsVisitorDispatcherType(formal_type)) |
| 229 return NOT_TRACE_METHOD; | 230 return NOT_TRACE_METHOD; |
| 230 } else if (!IsVisitorPtrType(formal_type)) { | 231 } else if (!IsVisitorPtrType(formal_type)) { |
| 231 return NOT_TRACE_METHOD; | 232 return NOT_TRACE_METHOD; |
| 232 } | 233 } |
| 233 | 234 |
| 234 if (name == kTraceName) | 235 if (name == kTraceName) |
| 235 return TRACE_METHOD; | 236 return TRACE_METHOD; |
| 236 if (name == kTraceAfterDispatchName) | 237 if (name == kTraceAfterDispatchName) |
| 237 return TRACE_AFTER_DISPATCH_METHOD; | 238 return TRACE_AFTER_DISPATCH_METHOD; |
| 238 if (name == kTraceImplName) | 239 if (name == kTraceImplName) |
| 239 return TRACE_IMPL_METHOD; | 240 return TRACE_IMPL_METHOD; |
| 240 if (name == kTraceAfterDispatchImplName) | 241 if (name == kTraceAfterDispatchImplName) |
| 241 return TRACE_AFTER_DISPATCH_IMPL_METHOD; | 242 return TRACE_AFTER_DISPATCH_IMPL_METHOD; |
| 242 | 243 |
| 243 assert(false && "Should not reach here"); | 244 assert(false && "Should not reach here"); |
| 244 return NOT_TRACE_METHOD; | 245 return NOT_TRACE_METHOD; |
| 245 } | 246 } |
| 246 | 247 |
| 247 static bool IsTraceMethod(clang::FunctionDecl* method) { | 248 static bool IsTraceMethod(const clang::FunctionDecl* method) { |
| 248 return GetTraceMethodType(method) != NOT_TRACE_METHOD; | 249 return GetTraceMethodType(method) != NOT_TRACE_METHOD; |
| 249 } | 250 } |
| 250 | 251 |
| 251 static bool IsTraceImplName(const std::string& name) { | 252 static bool IsTraceImplName(const std::string& name) { |
| 252 return name == kTraceImplName || name == kTraceAfterDispatchImplName; | 253 return name == kTraceImplName || name == kTraceAfterDispatchImplName; |
| 253 } | 254 } |
| 254 | 255 |
| 255 static bool StartsWith(const std::string& str, const std::string& prefix) { | 256 static bool StartsWith(const std::string& str, const std::string& prefix) { |
| 256 if (prefix.size() > str.size()) | 257 if (prefix.size() > str.size()) |
| 257 return false; | 258 return false; |
| 258 return str.compare(0, prefix.size(), prefix) == 0; | 259 return str.compare(0, prefix.size(), prefix) == 0; |
| 259 } | 260 } |
| 260 | 261 |
| 261 static bool EndsWith(const std::string& str, const std::string& suffix) { | 262 static bool EndsWith(const std::string& str, const std::string& suffix) { |
| 262 if (suffix.size() > str.size()) | 263 if (suffix.size() > str.size()) |
| 263 return false; | 264 return false; |
| 264 return str.compare(str.size() - suffix.size(), suffix.size(), suffix) == 0; | 265 return str.compare(str.size() - suffix.size(), suffix.size(), suffix) == 0; |
| 265 } | 266 } |
| 267 |
| 268 // Test if a template specialization is an instantiation. |
| 269 static bool IsTemplateInstantiation(clang::CXXRecordDecl* record); |
| 266 }; | 270 }; |
| 267 | 271 |
| 268 #endif // TOOLS_BLINK_GC_PLUGIN_CONFIG_H_ | 272 #endif // TOOLS_BLINK_GC_PLUGIN_CONFIG_H_ |
| OLD | NEW |