* Fix memory leaks

git-svn-id: trunk@31365 -
This commit is contained in:
michael 2015-08-22 13:11:38 +00:00
parent f671c270b1
commit 5e7f08a69c
3 changed files with 32 additions and 17 deletions

View File

@ -631,6 +631,7 @@ begin
FreeAndNil(DescrDocNames);
FreeAndNil(DescrDocs);
FreeAndNil(FAlwaysVisible);
FreeAndNil(FPackages);
inherited Destroy;
end;

View File

@ -91,9 +91,6 @@ type
{ TClassTreeBuilder }
{ TChartFormatter }
constructor TClassChartFormatter.Create(AXML: TXMLDocument);
@ -444,7 +441,10 @@ begin
if AClass.InheritsFrom(TPasModule) then
CurModule := TPasModule(Result);
If AClass.InheritsFrom(TPasClassType) then
begin
FObjects.AddObject(AName,Result);
// Writeln('Added : ',AName);
end;
end;
Constructor TClassTreeEngine.Create(AClassTree : TXMLDocument; AObjectKind : TPasObjKind);
@ -459,6 +459,8 @@ end;
destructor TClassTreeEngine.Destroy;
begin
FreeAndNil(FTree);
FreeAndNil(FPackage);
FreeAndNil(FObjects);
inherited Destroy;
end;
@ -545,7 +547,7 @@ begin
ParseSource(Engine,InputFiles[I],OSTarget,CPUTarget);
ACount:=ACount+Engine.Ftree.BuildTree(Engine.FObjects);
Finally
Engine.Free;
FreeAndNil(Engine);
end;
end;
Case OutputFormat of

View File

@ -18,7 +18,7 @@ Type
Protected
function LookForElement(PE: TDomElement; AElement: TPasElement; NoPath : Boolean): TDomNode;
function NodeMatch(N: TDomNode; AElement: TPasElement; NoPath : Boolean): Boolean;
Function AddToClassTree(AElement : TPasElement; ACount : Integer) : TDomElement;
Function AddToClassTree(AElement : TPasElement; Var ACount : Integer) : TDomElement;
Public
Constructor Create(APackage : TPasPackage; AObjectKind : TPasObjKind = okClass);
Destructor Destroy; override;
@ -49,6 +49,7 @@ end;
destructor TClassTreeBuilder.Destroy;
begin
FreeAndNil(FParentObject);
FreeAndNil(FClassTree);
Inherited;
end;
@ -63,11 +64,9 @@ begin
AObjects.Sorted:=True;
For I:=0 to AObjects.Count-1 do
begin
PC:=TPasClassType(AObjects.Objects[i]);
PC:=AObjects.Objects[i] as TPasClassType;
If (PC.ObjKind=FObjectKind) and Not PC.IsForward then
begin
AddToClassTree(PC as TPasElement,Result)
end;
AddToClassTree(PC,Result);
end;
end;
@ -92,7 +91,7 @@ begin
else
PN:=FPackage.Name;
S:=PN+'.'+TDomElement(N)['unit']+'.'+S;
Result:= (CompareText(S,AElement.PathName)=0);
Result:=(CompareText(S,AElement.PathName)=0);
end;
end;
end;
@ -103,6 +102,7 @@ Var
N : TDomNode;
begin
// Writeln('Enter TClassTreeBuilderLookForElement');
Result:=PE;
While (Result<>Nil) and Not NodeMatch(Result,AElement,NoPath) do
Result:=Result.NextSibling;
@ -119,9 +119,10 @@ begin
N:=N.NextSibling;
end;
end;
// Writeln('Exit TClassTreeBuilderLookForElement');
end;
Function TClassTreeBuilder.AddToClassTree(AElement : TPasElement; ACount : Integer) : TDomElement;
Function TClassTreeBuilder.AddToClassTree(AElement : TPasElement; Var ACount : Integer) : TDomElement;
// there are several codepaths that use uninitialized variables. (N,PE)
// I initialized them to nil to at least make failures deterministic.
Var
@ -129,10 +130,11 @@ Var
PE : TDomElement;
M : TPasModule;
N : TDomNode;
PF : String;
begin
PF:=StringOfChar(' ',ACount);
//Writeln('Enter TClassTreeBuilder.AddToClassTree');
//if Assigned(AElement) then
//Writeln('Addtoclasstree : ',aElement.Name);
Result:=Nil; N:=Nil;PE:=NIL;
If (AElement=Nil) then
begin
@ -154,14 +156,18 @@ begin
else
begin
PC:=AElement as TPasClassType;
PE:=AddToClassTree(PC.AncestorType,ACount+1);
PE:=AddToClassTree(PC.AncestorType,ACount);
if PE=Nil then
PE:=FTreeStart;
N:=LookForElement(PE,PC,False);
end
end;
If (N<>Nil) then
begin
// if Assigned(PC) then
// Writeln(PC.Name,' already in tree');
Result:=N as TDomElement
end
else
begin // N=NIL, PE might be nil.
Inc(ACount);
@ -172,9 +178,15 @@ begin
if Assigned(M) then
Result['unit']:=M.Name;
end;
if assigned(PE) then // if not assigned, probably needs to be
// assigned to something else.
PE.AppendChild(Result);
if PE=Nil then
begin
//Writeln('PE = nil detected for ',AElement.PathName);
PE:=FTreeStart
end;
//Writeln('Appending to ',PE.NodeName);
// if not assigned, probably needs to be assigned to something else.
if assigned(PE) then
PE.AppendChild(Result);
end;
end;