blob: fb60f06725f736e97598359cbdcb12655133d25b [file] [log] [blame]
// 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.
#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_IMPL_GARBAGE_COLLECTED_H_
#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_IMPL_GARBAGE_COLLECTED_H_
#include "base/macros.h"
#include "third_party/blink/renderer/platform/heap/thread_state.h"
#include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
#include "third_party/blink/renderer/platform/wtf/assertions.h"
#include "third_party/blink/renderer/platform/wtf/type_traits.h"
namespace blink {
template <typename T>
class GarbageCollected;
// GC_PLUGIN_IGNORE is used to make the plugin ignore a particular class or
// field when checking for proper usage. When using GC_PLUGIN_IGNORE
// a bug-number should be provided as an argument where the bug describes
// what needs to happen to remove the GC_PLUGIN_IGNORE again.
#if defined(__clang__)
#define GC_PLUGIN_IGNORE(bug) \
__attribute__((annotate("blink_gc_plugin_ignore")))
#else
#define GC_PLUGIN_IGNORE(bug)
#endif
// Template to determine if a class is a GarbageCollectedMixin by checking if it
// has IsGarbageCollectedMixinMarker
template <typename T>
struct IsGarbageCollectedMixin {
private:
typedef char YesType;
struct NoType {
char padding[8];
};
template <typename U>
static YesType CheckMarker(typename U::IsGarbageCollectedMixinMarker*);
template <typename U>
static NoType CheckMarker(...);
public:
static const bool value = sizeof(CheckMarker<T>(nullptr)) == sizeof(YesType);
};
// TraceDescriptor is used to describe how to trace an object.
struct TraceDescriptor {
STACK_ALLOCATED();
public:
// The adjusted base pointer of the object that should be traced.
const void* base_object_payload;
// A callback for tracing the object.
TraceCallback callback;
};
// The GarbageCollectedMixin interface can be used to automatically define
// TraceTrait/ObjectAliveTrait on non-leftmost deriving classes which need
// to be garbage collected.
class PLATFORM_EXPORT GarbageCollectedMixin {
public:
typedef int IsGarbageCollectedMixinMarker;
virtual void Trace(Visitor*) const {}
};
// Base class for objects allocated in the Blink garbage-collected heap.
//
// Instances of GarbageCollected will be finalized if they are non-trivially
// destructible.
template <typename T>
class GarbageCollected;
template <typename T,
bool = WTF::IsSubclassOfTemplate<typename std::remove_const<T>::type,
GarbageCollected>::value>
class NeedsAdjustPointer;
template <typename T>
class NeedsAdjustPointer<T, true> {
static_assert(sizeof(T), "T must be fully defined");
public:
static const bool value = false;
};
template <typename T>
class NeedsAdjustPointer<T, false> {
static_assert(sizeof(T), "T must be fully defined");
public:
static const bool value = true;
};
// TODO(sof): migrate to wtf/TypeTraits.h
template <typename T>
class IsFullyDefined {
using TrueType = char;
struct FalseType {
char dummy[2];
};
template <typename U, size_t sz = sizeof(U)>
static TrueType IsSizeofKnown(U*);
static FalseType IsSizeofKnown(...);
static T& t_;
public:
static const bool value = sizeof(TrueType) == sizeof(IsSizeofKnown(&t_));
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_IMPL_GARBAGE_COLLECTED_H_