OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
62 // with the Windows compiler which instantiates even unused variables. This caus
es problems | 62 // with the Windows compiler which instantiates even unused variables. This caus
es problems |
63 // in header files where we have only forward declarations of classes. | 63 // in header files where we have only forward declarations of classes. |
64 template<typename T, void (T::*method)(Visitor*)> | 64 template<typename T, void (T::*method)(Visitor*)> |
65 struct TraceMethodDelegate { | 65 struct TraceMethodDelegate { |
66 static void trampoline(Visitor* visitor, void* self) | 66 static void trampoline(Visitor* visitor, void* self) |
67 { | 67 { |
68 (reinterpret_cast<T*>(self)->*method)(visitor); | 68 (reinterpret_cast<T*>(self)->*method)(visitor); |
69 } | 69 } |
70 }; | 70 }; |
71 | 71 |
72 // HasInlinedTraceMethod<T>::value is true for T supporting | |
73 // T::trace(InlinedGlobalMarkingVisitor). | |
74 // The template works by checking if T::HasInlinedTraceMethodMarker type is | |
75 // available using SFINAE. The HasInlinedTraceMethodMarker type is defined | |
76 // by DECLARE_TRACE and DEFINE_INLINE_TRACE helper macros, which are used to | |
77 // define trace methods supporting both inlined/uninlined tracing. | |
78 template <typename T> | |
79 struct HasInlinedTraceMethod { | |
80 private: | |
81 typedef char YesType; | |
82 struct NoType { | |
83 char padding[8]; | |
84 }; | |
85 | |
86 template <typename U> static YesType checkMarker(typename U::HasInlinedTrace
MethodMarker*); | |
87 template <typename U> static NoType checkMarker(...); | |
88 public: | |
89 static const bool value = sizeof(checkMarker<T>(nullptr)) == sizeof(YesType)
; | |
90 }; | |
91 | |
92 #define DECLARE_TRACE_IMPL(maybevirtual) \ | 72 #define DECLARE_TRACE_IMPL(maybevirtual) \ |
93 public: \ | 73 public: \ |
94 typedef int HasInlinedTraceMethodMarker; \ | |
95 maybevirtual void trace(Visitor*); \ | 74 maybevirtual void trace(Visitor*); \ |
96 maybevirtual void trace(InlinedGlobalMarkingVisitor); \ | 75 maybevirtual void trace(InlinedGlobalMarkingVisitor); \ |
97 \ | 76 \ |
98 private: \ | 77 private: \ |
99 template <typename VisitorDispatcher> void traceImpl(VisitorDispatcher); \ | 78 template <typename VisitorDispatcher> void traceImpl(VisitorDispatcher); \ |
100 \ | 79 \ |
101 public: | 80 public: |
102 #define DEFINE_TRACE(T) \ | 81 #define DEFINE_TRACE(T) \ |
103 void T::trace(Visitor* visitor) { traceImpl(visitor); } \ | 82 void T::trace(Visitor* visitor) { traceImpl(visitor); } \ |
104 void T::trace(InlinedGlobalMarkingVisitor visitor) { traceImpl(visitor); } \ | 83 void T::trace(InlinedGlobalMarkingVisitor visitor) { traceImpl(visitor); } \ |
105 template <typename VisitorDispatcher> \ | 84 template <typename VisitorDispatcher> \ |
106 ALWAYS_INLINE void T::traceImpl(VisitorDispatcher visitor) | 85 ALWAYS_INLINE void T::traceImpl(VisitorDispatcher visitor) |
107 | 86 |
108 #define DEFINE_INLINE_TRACE_IMPL(maybevirtual)
\ | 87 #define DEFINE_INLINE_TRACE_IMPL(maybevirtual)
\ |
109 typedef int HasInlinedTraceMethodMarker;
\ | |
110 maybevirtual void trace(Visitor* visitor) { traceImpl(visitor); }
\ | 88 maybevirtual void trace(Visitor* visitor) { traceImpl(visitor); }
\ |
111 maybevirtual void trace(InlinedGlobalMarkingVisitor visitor) { traceImpl(vis
itor); } \ | 89 maybevirtual void trace(InlinedGlobalMarkingVisitor visitor) { traceImpl(vis
itor); } \ |
112 template <typename VisitorDispatcher>
\ | 90 template <typename VisitorDispatcher>
\ |
113 inline void traceImpl(VisitorDispatcher visitor) | 91 inline void traceImpl(VisitorDispatcher visitor) |
114 | 92 |
115 #define DECLARE_TRACE_AFTER_DISPATCH()
\ | 93 #define DECLARE_TRACE_AFTER_DISPATCH()
\ |
116 public:
\ | 94 public:
\ |
117 typedef int HasInlinedTraceAfterDispatchMethodMarker;
\ | |
118 void traceAfterDispatch(Visitor*);
\ | 95 void traceAfterDispatch(Visitor*);
\ |
119 void traceAfterDispatch(InlinedGlobalMarkingVisitor);
\ | 96 void traceAfterDispatch(InlinedGlobalMarkingVisitor);
\ |
120 private:
\ | 97 private:
\ |
121 template <typename VisitorDispatcher> void traceAfterDispatchImpl(VisitorDis
patcher); \ | 98 template <typename VisitorDispatcher> void traceAfterDispatchImpl(VisitorDis
patcher); \ |
122 public: | 99 public: |
123 | 100 |
124 #define DEFINE_TRACE_AFTER_DISPATCH(T)
\ | 101 #define DEFINE_TRACE_AFTER_DISPATCH(T)
\ |
125 void T::traceAfterDispatch(Visitor* visitor) { traceAfterDispatchImpl(visito
r); } \ | 102 void T::traceAfterDispatch(Visitor* visitor) { traceAfterDispatchImpl(visito
r); } \ |
126 void T::traceAfterDispatch(InlinedGlobalMarkingVisitor visitor) { traceAfter
DispatchImpl(visitor); } \ | 103 void T::traceAfterDispatch(InlinedGlobalMarkingVisitor visitor) { traceAfter
DispatchImpl(visitor); } \ |
127 template <typename VisitorDispatcher>
\ | 104 template <typename VisitorDispatcher>
\ |
128 ALWAYS_INLINE void T::traceAfterDispatchImpl(VisitorDispatcher visitor) | 105 ALWAYS_INLINE void T::traceAfterDispatchImpl(VisitorDispatcher visitor) |
129 | 106 |
130 #define DEFINE_INLINE_TRACE_AFTER_DISPATCH()
\ | 107 #define DEFINE_INLINE_TRACE_AFTER_DISPATCH()
\ |
131 typedef int HasInlinedTraceAfterDispatchMethodMarker;
\ | |
132 void traceAfterDispatch(Visitor* visitor) { traceAfterDispatchImpl(visitor);
} \ | 108 void traceAfterDispatch(Visitor* visitor) { traceAfterDispatchImpl(visitor);
} \ |
133 void traceAfterDispatch(InlinedGlobalMarkingVisitor visitor) { traceAfterDis
patchImpl(visitor); } \ | 109 void traceAfterDispatch(InlinedGlobalMarkingVisitor visitor) { traceAfterDis
patchImpl(visitor); } \ |
134 template <typename VisitorDispatcher>
\ | 110 template <typename VisitorDispatcher>
\ |
135 inline void traceAfterDispatchImpl(VisitorDispatcher visitor) | 111 inline void traceAfterDispatchImpl(VisitorDispatcher visitor) |
136 | 112 |
137 #define EMPTY_MACRO_ARGUMENT | 113 #define EMPTY_MACRO_ARGUMENT |
138 | 114 |
139 #define DECLARE_TRACE() DECLARE_TRACE_IMPL(EMPTY_MACRO_ARGUMENT) | 115 #define DECLARE_TRACE() DECLARE_TRACE_IMPL(EMPTY_MACRO_ARGUMENT) |
140 #define DECLARE_VIRTUAL_TRACE() DECLARE_TRACE_IMPL(virtual) | 116 #define DECLARE_VIRTUAL_TRACE() DECLARE_TRACE_IMPL(virtual) |
141 #define DEFINE_INLINE_TRACE() DEFINE_INLINE_TRACE_IMPL(EMPTY_MACRO_ARGUMENT) | 117 #define DEFINE_INLINE_TRACE() DEFINE_INLINE_TRACE_IMPL(EMPTY_MACRO_ARGUMENT) |
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
417 { | 393 { |
418 DEFINE_STATIC_LOCAL(String, typenameString, (WTF::extractTypeNameFromFun
ctionName(WTF::extractNameFunction<T>()))); | 394 DEFINE_STATIC_LOCAL(String, typenameString, (WTF::extractTypeNameFromFun
ctionName(WTF::extractNameFunction<T>()))); |
419 return typenameString; | 395 return typenameString; |
420 } | 396 } |
421 }; | 397 }; |
422 #endif | 398 #endif |
423 | 399 |
424 } // namespace blink | 400 } // namespace blink |
425 | 401 |
426 #endif // Visitor_h | 402 #endif // Visitor_h |
OLD | NEW |