]> granicus.if.org Git - clang/commitdiff
Fix leaking of LexedMethod objects created for caching objc method definitions tokens
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Tue, 29 Nov 2011 08:14:54 +0000 (08:14 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Tue, 29 Nov 2011 08:14:54 +0000 (08:14 +0000)
for late parsing.

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

include/clang/Parse/Parser.h
lib/Parse/ParseObjc.cpp
lib/Parse/Parser.cpp

index a1b346ee306cca6dbed7668b206ca581407e3021..2c8f7ef9868953666d0f284a077d23a825cec471 100644 (file)
@@ -402,6 +402,9 @@ private:
     Tok.setKind(tok::eof);
   }
 
+  /// \brief Clear and free the cached objc methods.
+  void clearLateParsedObjCMethods();
+
   /// \brief Handle the annotation token produced for #pragma unused(...)
   void HandlePragmaUnused();
 
index 3cb2aaaec3822ad73a9290aa242f3ea65e2b861e..10c74ffdfdbed1d84e102d0cc3d4039cfa00bd19 100644 (file)
@@ -1500,7 +1500,7 @@ Parser::ParseObjCAtEndDeclaration(SourceRange atEnd) {
     // missing @implementation
     Diag(atEnd.getBegin(), diag::err_expected_implementation);
     
-  LateParsedObjCMethods.clear();
+  clearLateParsedObjCMethods();
   ObjCImpDecl = 0;
   return Actions.BuildDeclaratorGroup(
            DeclsInGroup.data(), DeclsInGroup.size(), false);
@@ -1515,6 +1515,14 @@ Parser::DeclGroupPtrTy Parser::FinishPendingObjCActions() {
   return Actions.ConvertDeclToDeclGroup(ImpDecl);
 }
 
+void Parser::clearLateParsedObjCMethods() {
+  for (LateParsedObjCMethodContainer::iterator
+         I = LateParsedObjCMethods.begin(),
+         E = LateParsedObjCMethods.end(); I != E; ++I)
+    delete *I;
+  LateParsedObjCMethods.clear();
+}
+
 ///   compatibility-alias-decl:
 ///     @compatibility_alias alias-name  class-name ';'
 ///
index b4d41ef48233ee44d0d8d46aced897e6195e231a..834e741e3035ded16403fd7b0d807714605378db 100644 (file)
@@ -370,6 +370,8 @@ Parser::~Parser() {
       it != LateParsedTemplateMap.end(); ++it)
     delete it->second;
 
+  clearLateParsedObjCMethods();
+
   // Remove the pragma handlers we installed.
   PP.RemovePragmaHandler(AlignHandler.get());
   AlignHandler.reset();