1f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Copyright 2014 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 TOOLS_BLINK_GC_PLUGIN_TRACING_STATUS_H_ 6f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#define TOOLS_BLINK_GC_PLUGIN_TRACING_STATUS_H_ 7f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 8f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// TracingStatus is a four-point value ordered by 9f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// illegal < unneeded < unknown < needed 10f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// 11f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// It is used to categorize tracing of fields: 12f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// 13f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// * illegal field is invalid/illegal to trace. 14f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// * unneeded field has type with no traceable fields of its own; 15f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// it may have an empty trace() method. Not harmful 16f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// to trace, but not needed. 17f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// * unknown initial TracingStatus value. 18f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// * needed field is a heap reference or an object containing 19f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// traceable fields. 20f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// 21f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Tracing status |illegal| is considered an error; treating |unneeded| also 22f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// as an error would detect and report unnecessary tracing of objects that 23f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// probably don't need to be on the Blink GC heap. However, template use 24f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// and instantiation can leave us with classes that do have empty trace 25f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// methods and no traceable fields -- reporting these as errors/warnings 26f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// wouldn't work. Hence, only consider |illegal| as an error TracingStatus 27f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// state. 28f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass TracingStatus { 29f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public: 30f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static TracingStatus Illegal() { return kIllegal; } 31f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static TracingStatus Unneeded() { return kUnneeded; } 32f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static TracingStatus Unknown() { return kUnknown; } 33f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static TracingStatus Needed() { return kNeeded; } 34f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool IsIllegal() const { return status_ == kIllegal; } 35f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool IsUnneeded() const { return status_ == kUnneeded; } 36f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool IsUnknown() const { return status_ == kUnknown; } 37f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool IsNeeded() const { return status_ == kNeeded; } 38f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch TracingStatus LUB(const TracingStatus& other) const { 39f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return status_ > other.status_ ? status_ : other.status_; 40f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 41f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool operator==(const TracingStatus& other) const { 42f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return status_ == other.status_; 43f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 44f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch private: 45f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch enum Status { kIllegal, kUnneeded, kUnknown, kNeeded }; 46f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch TracingStatus(Status status) : status_(status) {} 47f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Status status_; 48f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 49f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 50f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#endif // TOOLS_BLINK_GC_PLUGIN_TRACING_STATUS_H_ 51