Home | History | Annotate | Download | only in blink_gc_plugin
      1 // Copyright 2015 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef TOOLS_BLINK_GC_PLUGIN_CHECK_FIELDS_VISITOR_H_
      6 #define TOOLS_BLINK_GC_PLUGIN_CHECK_FIELDS_VISITOR_H_
      7 
      8 #include <vector>
      9 
     10 #include "Edge.h"
     11 
     12 struct BlinkGCPluginOptions;
     13 class FieldPoint;
     14 
     15 // This visitor checks that the fields of a class are "well formed".
     16 // - OwnPtr and RefPtr must not point to a GC derived type.
     17 // - Part objects must not be a GC derived type.
     18 // - An on-heap class must never contain GC roots.
     19 // - Only stack-allocated types may point to stack-allocated types.
     20 
     21 class CheckFieldsVisitor : public RecursiveEdgeVisitor {
     22  public:
     23   enum Error {
     24     kRawPtrToGCManaged,
     25     kRefPtrToGCManaged,
     26     kReferencePtrToGCManaged,
     27     kOwnPtrToGCManaged,
     28     kUniquePtrToGCManaged,
     29     kMemberToGCUnmanaged,
     30     kMemberInUnmanaged,
     31     kPtrFromHeapToStack,
     32     kGCDerivedPartObject
     33   };
     34 
     35   using Errors = std::vector<std::pair<FieldPoint*, Error>>;
     36 
     37   CheckFieldsVisitor();
     38 
     39   Errors& invalid_fields();
     40 
     41   bool ContainsInvalidFields(RecordInfo* info);
     42 
     43   void AtMember(Member* edge) override;
     44   void AtValue(Value* edge) override;
     45   void AtCollection(Collection* edge) override;
     46 
     47  private:
     48   Error InvalidSmartPtr(Edge* ptr);
     49 
     50   FieldPoint* current_;
     51   bool stack_allocated_host_;
     52   bool managed_host_;
     53   Errors invalid_fields_;
     54 };
     55 
     56 #endif  // TOOLS_BLINK_GC_PLUGIN_CHECK_FIELDS_VISITOR_H_
     57