Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / tools / clang / blink_gc_plugin / BlinkGCPlugin.cpp
index 4830a45..d24d67a 100644 (file)
@@ -572,6 +572,7 @@ class CheckTraceVisitor : public RecursiveASTVisitor<CheckTraceVisitor> {
 class CheckGCRootsVisitor : public RecursiveEdgeVisitor {
  public:
   typedef std::vector<FieldPoint*> RootPath;
+  typedef std::set<RecordInfo*> VisitingSet;
   typedef std::vector<RootPath> Errors;
 
   CheckGCRootsVisitor() {}
@@ -594,6 +595,11 @@ class CheckGCRootsVisitor : public RecursiveEdgeVisitor {
     if (edge->value()->record()->isUnion())
       return;
 
+    // Prevent infinite regress for cyclic part objects.
+    if (visiting_set_.find(edge->value()) != visiting_set_.end())
+      return;
+
+    visiting_set_.insert(edge->value());
     // If the value is a part object, then continue checking for roots.
     for (Context::iterator it = context().begin();
          it != context().end();
@@ -602,6 +608,7 @@ class CheckGCRootsVisitor : public RecursiveEdgeVisitor {
         return;
     }
     ContainsGCRoots(edge->value());
+    visiting_set_.erase(edge->value());
   }
 
   void VisitPersistent(Persistent* edge) override {
@@ -615,6 +622,7 @@ class CheckGCRootsVisitor : public RecursiveEdgeVisitor {
 
  protected:
   RootPath current_;
+  VisitingSet visiting_set_;
   Errors gc_roots_;
 };
 
@@ -861,6 +869,10 @@ class BlinkGCPluginConsumer : public ASTConsumer {
   }
 
   void HandleTranslationUnit(ASTContext& context) override {
+    // Don't run the plugin if the compilation unit is already invalid.
+    if (diagnostic_.hasErrorOccurred())
+      return;
+
     CollectVisitor visitor;
     visitor.TraverseDecl(context.getTranslationUnitDecl());
 
@@ -957,6 +969,7 @@ class BlinkGCPluginConsumer : public ASTConsumer {
 
     // Check polymorphic classes that are GC-derived or have a trace method.
     if (info->record()->hasDefinition() && info->record()->isPolymorphic()) {
+      // TODO: Check classes that inherit a trace method.
       CXXMethodDecl* trace = info->GetTraceMethod();
       if (trace || info->IsGCDerived())
         CheckPolymorphicClass(info, trace);