Browse Source

Fixed memory leaks when reading template parameters.

pull/1133/head
Dimitar Dobrev 9 years ago
parent
commit
60f5da9ced
  1. 21
      src/CppParser/Parser.cpp
  2. 3
      src/CppParser/Parser.h

21
src/CppParser/Parser.cpp

@ -1202,7 +1202,11 @@ ClassTemplate* Parser::WalkClassTemplate(const clang::ClassTemplateDecl* TD) @@ -1202,7 +1202,11 @@ ClassTemplate* Parser::WalkClassTemplate(const clang::ClassTemplateDecl* TD)
TemplateTemplateParameter* Parser::WalkTemplateTemplateParameter(const clang::TemplateTemplateParmDecl* TTP)
{
auto TP = new TemplateTemplateParameter();
auto TP = WalkedTemplateTemplateParameters[TTP];
if (TP)
return TP;
TP = new TemplateTemplateParameter();
HandleDeclaration(TTP, TP);
TP->Parameters = WalkTemplateParameterList(TTP->getTemplateParameters());
TP->IsParameterPack = TTP->isParameterPack();
@ -1213,6 +1217,7 @@ TemplateTemplateParameter* Parser::WalkTemplateTemplateParameter(const clang::Te @@ -1213,6 +1217,7 @@ TemplateTemplateParameter* Parser::WalkTemplateTemplateParameter(const clang::Te
auto TD = WalkDeclaration(TTP->getTemplatedDecl(), /*IgnoreSystemDecls=*/false);
TP->TemplatedDecl = TD;
}
WalkedTemplateTemplateParameters[TTP] = TP;
return TP;
}
@ -1220,7 +1225,11 @@ TemplateTemplateParameter* Parser::WalkTemplateTemplateParameter(const clang::Te @@ -1220,7 +1225,11 @@ TemplateTemplateParameter* Parser::WalkTemplateTemplateParameter(const clang::Te
TypeTemplateParameter* Parser::WalkTypeTemplateParameter(const clang::TemplateTypeParmDecl* TTPD)
{
auto TP = new CppSharp::CppParser::TypeTemplateParameter();
auto TP = WalkedTypeTemplateParameters[TTPD];
if (TP)
return TP;
TP = new CppSharp::CppParser::TypeTemplateParameter();
TP->Name = GetDeclName(TTPD);
HandleDeclaration(TTPD, TP);
if (TTPD->hasDefaultArgument())
@ -1228,6 +1237,7 @@ TypeTemplateParameter* Parser::WalkTypeTemplateParameter(const clang::TemplateTy @@ -1228,6 +1237,7 @@ TypeTemplateParameter* Parser::WalkTypeTemplateParameter(const clang::TemplateTy
TP->Depth = TTPD->getDepth();
TP->Index = TTPD->getIndex();
TP->IsParameterPack = TTPD->isParameterPack();
WalkedTypeTemplateParameters[TTPD] = TP;
return TP;
}
@ -1235,7 +1245,11 @@ TypeTemplateParameter* Parser::WalkTypeTemplateParameter(const clang::TemplateTy @@ -1235,7 +1245,11 @@ TypeTemplateParameter* Parser::WalkTypeTemplateParameter(const clang::TemplateTy
NonTypeTemplateParameter* Parser::WalkNonTypeTemplateParameter(const clang::NonTypeTemplateParmDecl* NTTPD)
{
auto NTP = new CppSharp::CppParser::NonTypeTemplateParameter();
auto NTP = WalkedNonTypeTemplateParameters[NTTPD];
if (NTP)
return NTP;
NTP = new CppSharp::CppParser::NonTypeTemplateParameter();
NTP->Name = GetDeclName(NTTPD);
HandleDeclaration(NTTPD, NTP);
if (NTTPD->hasDefaultArgument())
@ -1243,6 +1257,7 @@ NonTypeTemplateParameter* Parser::WalkNonTypeTemplateParameter(const clang::NonT @@ -1243,6 +1257,7 @@ NonTypeTemplateParameter* Parser::WalkNonTypeTemplateParameter(const clang::NonT
NTP->Depth = NTTPD->getDepth();
NTP->Index = NTTPD->getIndex();
NTP->IsParameterPack = NTTPD->isParameterPack();
WalkedNonTypeTemplateParameters[NTTPD] = NTP;
return NTP;
}

3
src/CppParser/Parser.h

@ -145,6 +145,9 @@ private: @@ -145,6 +145,9 @@ private:
clang::ASTContext* AST;
clang::TargetCXXABI::Kind TargetABI;
clang::CodeGen::CodeGenTypes* CodeGenTypes;
std::unordered_map<const clang::TemplateTypeParmDecl*, TypeTemplateParameter*> WalkedTypeTemplateParameters;
std::unordered_map<const clang::TemplateTemplateParmDecl*, TemplateTemplateParameter*> WalkedTemplateTemplateParameters;
std::unordered_map<const clang::NonTypeTemplateParmDecl*, NonTypeTemplateParameter*> WalkedNonTypeTemplateParameters;
ParserResultKind ReadSymbols(llvm::StringRef File,
llvm::object::basic_symbol_iterator Begin,

Loading…
Cancel
Save