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

3
src/CppParser/Parser.h

@ -145,6 +145,9 @@ private:
clang::ASTContext* AST; clang::ASTContext* AST;
clang::TargetCXXABI::Kind TargetABI; clang::TargetCXXABI::Kind TargetABI;
clang::CodeGen::CodeGenTypes* CodeGenTypes; 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, ParserResultKind ReadSymbols(llvm::StringRef File,
llvm::object::basic_symbol_iterator Begin, llvm::object::basic_symbol_iterator Begin,

Loading…
Cancel
Save