aboutsummaryrefslogtreecommitdiff
path: root/tools/clang/blink_gc_plugin/tests/trace_after_dispatch_impl.cpp
blob: 53a68553200345ea29d87536c3dadf22dddb93db (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "trace_after_dispatch_impl.h"

namespace blink {

template <typename VisitorDispatcher>
inline void TraceAfterDispatchInlinedBase::traceImpl(
    VisitorDispatcher visitor) {
  // Implement a simple form of manual dispatching, because BlinkGCPlugin
  // checks if the tracing is dispatched to all derived classes.
  //
  // This function has to be implemented out-of-line, since we need to know the
  // definition of derived classes here.
  if (tag_ == DERIVED) {
    static_cast<TraceAfterDispatchInlinedDerived*>(this)->traceAfterDispatch(
        visitor);
  } else {
    traceAfterDispatch(visitor);
  }
}

void TraceAfterDispatchExternBase::trace(Visitor* visitor) {
  traceImpl(visitor);
}

void TraceAfterDispatchExternBase::trace(InlinedGlobalMarkingVisitor visitor) {
  traceImpl(visitor);
}

template <typename VisitorDispatcher>
inline void TraceAfterDispatchExternBase::traceImpl(VisitorDispatcher visitor) {
  if (tag_ == DERIVED) {
    static_cast<TraceAfterDispatchExternDerived*>(this)->traceAfterDispatch(
        visitor);
  } else {
    traceAfterDispatch(visitor);
  }
}

void TraceAfterDispatchExternBase::traceAfterDispatch(Visitor* visitor) {
  traceAfterDispatchImpl(visitor);
}

void TraceAfterDispatchExternBase::traceAfterDispatch(
    InlinedGlobalMarkingVisitor visitor) {
  traceAfterDispatchImpl(visitor);
}

template <typename VisitorDispatcher>
inline void TraceAfterDispatchExternBase::traceAfterDispatchImpl(
    VisitorDispatcher visitor) {
  visitor->trace(x_base_);
}

void TraceAfterDispatchExternDerived::traceAfterDispatch(Visitor* visitor) {
  traceAfterDispatchImpl(visitor);
}

void TraceAfterDispatchExternDerived::traceAfterDispatch(
    InlinedGlobalMarkingVisitor visitor) {
  traceAfterDispatchImpl(visitor);
}

template <typename VisitorDispatcher>
inline void TraceAfterDispatchExternDerived::traceAfterDispatchImpl(
    VisitorDispatcher visitor) {
  visitor->trace(x_derived_);
  TraceAfterDispatchExternBase::traceAfterDispatch(visitor);
}

}