| Index: tools/clang/blink_gc_plugin/tests/trace_after_dispatch_impl.cpp
 | 
| diff --git a/tools/clang/blink_gc_plugin/tests/trace_after_dispatch_impl.cpp b/tools/clang/blink_gc_plugin/tests/trace_after_dispatch_impl.cpp
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..53a68553200345ea29d87536c3dadf22dddb93db
 | 
| --- /dev/null
 | 
| +++ b/tools/clang/blink_gc_plugin/tests/trace_after_dispatch_impl.cpp
 | 
| @@ -0,0 +1,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);
 | 
| +}
 | 
| +
 | 
| +}
 | 
| 
 |