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