]> granicus.if.org Git - clang/commitdiff
Don't store pointers into a std::vector (RawCommentList::Comments). Although
authorDmitri Gribenko <gribozavr@gmail.com>
Fri, 6 Jul 2012 18:19:34 +0000 (18:19 +0000)
committerDmitri Gribenko <gribozavr@gmail.com>
Fri, 6 Jul 2012 18:19:34 +0000 (18:19 +0000)
currently we take address of std::vector's contents only after we finished
adding all comments (so no reallocation can happen), this will change in
future.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@159845 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/ASTContext.h
include/clang/AST/RawCommentList.h
lib/AST/ASTContext.cpp
lib/AST/RawCommentList.cpp
lib/Serialization/ASTReader.cpp
lib/Serialization/ASTWriter.cpp

index b19d7ad42c929b9724baa57772bbfa7da34ffbd2..4dc0a447bdf723a29ea143cfee43ba0c8598489e 100644 (file)
@@ -440,7 +440,7 @@ public:
 
 public:
   void addComment(const RawComment &RC) {
-    Comments.addComment(RC);
+    Comments.addComment(RC, BumpAlloc);
   }
 
   /// \brief Return the documentation comment attached to a given declaration.
index 299502acb6bebea8f92b9984279e2ee9c7ef9b12..6ef213bdcb43f7745d287933b03ba407f8c0894c 100644 (file)
@@ -146,6 +146,10 @@ public:
     return SM.isBeforeInTranslationUnit(LHS.getSourceRange().getBegin(),
                                         RHS.getSourceRange().getBegin());
   }
+
+  bool operator()(const RawComment *LHS, const RawComment *RHS) {
+    return operator()(*LHS, *RHS);
+  }
 };
 
 /// \brief This class represents all comments included in the translation unit,
@@ -155,19 +159,19 @@ public:
   RawCommentList(SourceManager &SourceMgr) :
     SourceMgr(SourceMgr), OnlyWhitespaceSeen(true) { }
 
-  void addComment(const RawComment &RC);
+  void addComment(const RawComment &RC, llvm::BumpPtrAllocator &Allocator);
 
-  ArrayRef<RawComment> getComments() const {
+  ArrayRef<RawComment *> getComments() const {
     return Comments;
   }
 
 private:
   SourceManager &SourceMgr;
-  std::vector<RawComment> Comments;
+  std::vector<RawComment *> Comments;
   RawComment LastComment;
   bool OnlyWhitespaceSeen;
 
-  void addCommentsToFront(const std::vector<RawComment> &C) {
+  void addCommentsToFront(const std::vector<RawComment *> &C) {
     size_t OldSize = Comments.size();
     Comments.resize(C.size() + OldSize);
     std::copy_backward(Comments.begin(), Comments.begin() + OldSize,
index 99c5ff6d5673a5bbcd4a68a6750d5c40728b28b9..12f1d4de039a258f0a0758663e80f7f6998bd514 100644 (file)
@@ -72,7 +72,7 @@ const RawComment *ASTContext::getRawCommentForDeclNoCache(const Decl *D) const {
   if (isa<ParmVarDecl>(D))
     return NULL;
 
-  ArrayRef<RawComment> RawComments = Comments.getComments();
+  ArrayRef<RawComment *> RawComments = Comments.getComments();
 
   // If there are no comments anywhere, we won't find anything.
   if (RawComments.empty())
@@ -85,10 +85,11 @@ const RawComment *ASTContext::getRawCommentForDeclNoCache(const Decl *D) const {
     return NULL;
 
   // Find the comment that occurs just after this declaration.
-  ArrayRef<RawComment>::iterator Comment
+  RawComment CommentAtDeclLoc(SourceMgr, SourceRange(DeclLoc));
+  ArrayRef<RawComment *>::iterator Comment
       = std::lower_bound(RawComments.begin(),
                          RawComments.end(),
-                         RawComment(SourceMgr, SourceRange(DeclLoc)),
+                         &CommentAtDeclLoc,
                          BeforeThanCompare<RawComment>(SourceMgr));
 
   // Decompose the location for the declaration and find the beginning of the
@@ -97,17 +98,17 @@ const RawComment *ASTContext::getRawCommentForDeclNoCache(const Decl *D) const {
 
   // First check whether we have a trailing comment.
   if (Comment != RawComments.end() &&
-      Comment->isDocumentation() && Comment->isTrailingComment() &&
+      (*Comment)->isDocumentation() && (*Comment)->isTrailingComment() &&
       !isa<TagDecl>(D) && !isa<NamespaceDecl>(D)) {
     std::pair<FileID, unsigned> CommentBeginDecomp
-      = SourceMgr.getDecomposedLoc(Comment->getSourceRange().getBegin());
+      = SourceMgr.getDecomposedLoc((*Comment)->getSourceRange().getBegin());
     // Check that Doxygen trailing comment comes after the declaration, starts
     // on the same line and in the same file as the declaration.
     if (DeclLocDecomp.first == CommentBeginDecomp.first &&
         SourceMgr.getLineNumber(DeclLocDecomp.first, DeclLocDecomp.second)
           == SourceMgr.getLineNumber(CommentBeginDecomp.first,
                                      CommentBeginDecomp.second)) {
-      return &*Comment;
+      return *Comment;
     }
   }
 
@@ -118,12 +119,12 @@ const RawComment *ASTContext::getRawCommentForDeclNoCache(const Decl *D) const {
   --Comment;
 
   // Check that we actually have a non-member Doxygen comment.
-  if (!Comment->isDocumentation() || Comment->isTrailingComment())
+  if (!(*Comment)->isDocumentation() || (*Comment)->isTrailingComment())
     return NULL;
 
   // Decompose the end of the comment.
   std::pair<FileID, unsigned> CommentEndDecomp
-    = SourceMgr.getDecomposedLoc(Comment->getSourceRange().getEnd());
+    = SourceMgr.getDecomposedLoc((*Comment)->getSourceRange().getEnd());
 
   // If the comment and the declaration aren't in the same file, then they
   // aren't related.
@@ -146,7 +147,7 @@ const RawComment *ASTContext::getRawCommentForDeclNoCache(const Decl *D) const {
   if (Text.find_first_of(",;{}#") != StringRef::npos)
     return NULL;
 
-  return &*Comment;
+  return *Comment;
 }
 
 const RawComment *ASTContext::getRawCommentForDecl(const Decl *D) const {
index 791215103f0a0d21c5a106db964cd6ce232f8260..d67eb0822f2b1797774c932f690f163ed2c66944 100644 (file)
@@ -176,14 +176,15 @@ bool onlyWhitespaceBetweenComments(SourceManager &SM,
 }
 } // unnamed namespace
 
-void RawCommentList::addComment(const RawComment &RC) {
+void RawCommentList::addComment(const RawComment &RC,
+                                llvm::BumpPtrAllocator &Allocator) {
   if (RC.isInvalid())
     return;
 
   // Check if the comments are not in source order.
   while (!Comments.empty() &&
          !SourceMgr.isBeforeInTranslationUnit(
-              Comments.back().getSourceRange().getBegin(),
+              Comments.back()->getSourceRange().getBegin(),
               RC.getSourceRange().getBegin())) {
     // If they are, just pop a few last comments that don't fit.
     // This happens if an \#include directive contains comments.
@@ -204,12 +205,12 @@ void RawCommentList::addComment(const RawComment &RC) {
   // If this is the first Doxygen comment, save it (because there isn't
   // anything to merge it with).
   if (Comments.empty()) {
-    Comments.push_back(RC);
+    Comments.push_back(new (Allocator) RawComment(RC));
     OnlyWhitespaceSeen = true;
     return;
   }
 
-  const RawComment &C1 = Comments.back();
+  const RawComment &C1 = *Comments.back();
   const RawComment &C2 = RC;
 
   // Merge comments only if there is only whitespace between them.
@@ -221,11 +222,9 @@ void RawCommentList::addComment(const RawComment &RC) {
        C1.getEndLine(SourceMgr) + 1 >= C2.getBeginLine(SourceMgr))) {
     SourceRange MergedRange(C1.getSourceRange().getBegin(),
                             C2.getSourceRange().getEnd());
-    RawComment Merged(SourceMgr, MergedRange, true);
-    Comments.pop_back();
-    Comments.push_back(Merged);
+    *Comments.back() = RawComment(SourceMgr, MergedRange, true);
   } else
-    Comments.push_back(RC);
+    Comments.push_back(new (Allocator) RawComment(RC));
 
   OnlyWhitespaceSeen = true;
 }
index 3d643f6b43969d3ed495c046ac37988d40859ef5..46bd55e83e3e98f4a43679608489e154534f49a3 100644 (file)
@@ -6284,7 +6284,7 @@ void ASTReader::ClearSwitchCaseIDs() {
 }
 
 void ASTReader::ReadComments() {
-  std::vector<RawComment> Comments;
+  std::vector<RawComment *> Comments;
   for (SmallVectorImpl<std::pair<llvm::BitstreamCursor,
                                  serialization::ModuleFile *> >::iterator
        I = CommentsCursors.begin(),
@@ -6325,8 +6325,9 @@ void ASTReader::ReadComments() {
             (RawComment::CommentKind) Record[Idx++];
         bool IsTrailingComment = Record[Idx++];
         bool IsAlmostTrailingComment = Record[Idx++];
-        Comments.push_back(RawComment(SR, Kind, IsTrailingComment,
-                                      IsAlmostTrailingComment));
+        Comments.push_back(new (Context) RawComment(SR, Kind,
+                                                    IsTrailingComment,
+                                                    IsAlmostTrailingComment));
         break;
       }
       }
index 8ab17374724c2b227daf29654e13aa324d421691..566c8b77f5e7ba425b98ffbea733613ee15d2eaf 100644 (file)
@@ -2245,16 +2245,16 @@ void ASTWriter::WriteFileDeclIDsMap() {
 
 void ASTWriter::WriteComments() {
   Stream.EnterSubblock(COMMENTS_BLOCK_ID, 3);
-  ArrayRef<RawComment> RawComments = Context->Comments.getComments();
+  ArrayRef<RawComment *> RawComments = Context->Comments.getComments();
   RecordData Record;
-  for (ArrayRef<RawComment>::iterator I = RawComments.begin(),
-                                      E = RawComments.end();
+  for (ArrayRef<RawComment *>::iterator I = RawComments.begin(),
+                                        E = RawComments.end();
        I != E; ++I) {
     Record.clear();
-    AddSourceRange(I->getSourceRange(), Record);
-    Record.push_back(I->getKind());
-    Record.push_back(I->isTrailingComment());
-    Record.push_back(I->isAlmostTrailingComment());
+    AddSourceRange((*I)->getSourceRange(), Record);
+    Record.push_back((*I)->getKind());
+    Record.push_back((*I)->isTrailingComment());
+    Record.push_back((*I)->isAlmostTrailingComment());
     Stream.EmitRecord(COMMENTS_RAW_COMMENT, Record);
   }
   Stream.ExitBlock();