Index: tools/clang/blink_gc_plugin/TracingStatus.h |
diff --git a/tools/clang/blink_gc_plugin/TracingStatus.h b/tools/clang/blink_gc_plugin/TracingStatus.h |
index 9eb1080de85d13845a910530b559d739883ebe6b..46e96547a9d4fa79c27ec4f11b77749a6c6d2931 100644 |
--- a/tools/clang/blink_gc_plugin/TracingStatus.h |
+++ b/tools/clang/blink_gc_plugin/TracingStatus.h |
@@ -5,12 +5,33 @@ |
#ifndef TOOLS_BLINK_GC_PLUGIN_TRACING_STATUS_H_ |
#define TOOLS_BLINK_GC_PLUGIN_TRACING_STATUS_H_ |
-// TracingStatus is a three-point value ordered by unneeded < unknown < needed. |
+// TracingStatus is a four-point value ordered by |
+// illegal < unneeded < unknown < needed |
+// |
+// It is used to categorize tracing of fields: |
+// |
+// * illegal field is invalid/illegal to trace. |
+// * unneeded field has type with no traceable fields of its own; |
+// it may have an empty trace() method. Not harmful |
+// to trace, but not needed. |
+// * unknown initial TracingStatus value. |
+// * needed field is a heap reference or an object containing |
+// traceable fields. |
+// |
+// Tracing status |illegal| is considered an error; treating |unneeded| also |
+// as an error would detect and report unnecessary tracing of objects that |
+// probably don't need to be on the Blink GC heap. However, template use |
+// and instantiation can leave us with classes that do have empty trace |
+// methods and no traceable fields -- reporting these as errors/warnings |
+// wouldn't work. Hence, only consider |illegal| as an error TracingStatus |
+// state. |
class TracingStatus { |
public: |
+ static TracingStatus Illegal() { return kIllegal; } |
static TracingStatus Unneeded() { return kUnneeded; } |
static TracingStatus Unknown() { return kUnknown; } |
static TracingStatus Needed() { return kNeeded; } |
+ bool IsIllegal() const { return status_ == kIllegal; } |
bool IsUnneeded() const { return status_ == kUnneeded; } |
bool IsUnknown() const { return status_ == kUnknown; } |
bool IsNeeded() const { return status_ == kNeeded; } |
@@ -21,7 +42,7 @@ class TracingStatus { |
return status_ == other.status_; |
} |
private: |
- enum Status { kUnneeded, kUnknown, kNeeded }; |
+ enum Status { kIllegal, kUnneeded, kUnknown, kNeeded }; |
TracingStatus(Status status) : status_(status) {} |
Status status_; |
}; |