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
3// found in the LICENSE file.
4
5#include "trace_after_dispatch.h"
6
7namespace blink {
8
9static B* toB(A* a) { return static_cast<B*>(a); }
10
11void A::trace(Visitor* visitor)
12{
13    switch (m_type) {
14    case TB:
15        toB(this)->traceAfterDispatch(visitor);
16        break;
17    case TC:
18        static_cast<C*>(this)->traceAfterDispatch(visitor);
19        break;
20    case TD:
21        // Missing static_cast<D*>(this)->traceAfterDispatch(visitor);
22        break;
23    }
24}
25
26void A::traceAfterDispatch(Visitor* visitor)
27{
28}
29
30void B::traceAfterDispatch(Visitor* visitor)
31{
32    visitor->trace(m_a);
33    // Missing A::traceAfterDispatch(visitor);
34    // Also check that calling trace does not count.
35    A::trace(visitor);
36}
37
38void C::traceAfterDispatch(Visitor* visitor)
39{
40    // Missing visitor->trace(m_a);
41    A::traceAfterDispatch(visitor);
42}
43
44void D::traceAfterDispatch(Visitor* visitor)
45{
46    visitor->trace(m_a);
47    Abstract::traceAfterDispatch(visitor);
48}
49
50}
51