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 |