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