1f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Copyright 2015 The Chromium Authors. All rights reserved. 2f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// found in the LICENSE file. 4f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 5f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#ifndef REGISTER_WEAK_MEMBERS_TEMPLATE_H_ 6f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#define REGISTER_WEAK_MEMBERS_TEMPLATE_H_ 7f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 8f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "heap/stubs.h" 9f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 10f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochnamespace blink { 11f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 12f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass X : public GarbageCollected<X> { 13f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public: 14f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch void trace(Visitor* visitor) { traceImpl(visitor); } 15f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch void trace(InlinedGlobalMarkingVisitor visitor) { traceImpl(visitor); } 16f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 17f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch private: 18f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch template <typename VisitorDispatcher> 19f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch void traceImpl(VisitorDispatcher visitor) {} 20f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 21f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 22f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass HasUntracedWeakMembers : public GarbageCollected<HasUntracedWeakMembers> { 23f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public: 24f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch void trace(Visitor* visitor) { traceImpl(visitor); } 25f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch void trace(InlinedGlobalMarkingVisitor visitor) { traceImpl(visitor); } 26f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 27f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Don't have to be defined for the purpose of this test. 28f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch void clearWeakMembers(Visitor* visitor); 29f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 30f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch private: 31f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch template <typename VisitorDispatcher> 32f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch void traceImpl(VisitorDispatcher visitor) { 33f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch visitor->template registerWeakMembers< 34f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch HasUntracedWeakMembers, 35f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch &HasUntracedWeakMembers::clearWeakMembers>(this); 36f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 37f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 38f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch WeakMember<X> x_; 39f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 40f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 41f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} 42f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 43f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#endif // REGISTER_WEAK_MEMBERS_TEMPLATE_H_ 44