mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-13 15:39:29 +02:00
* Fix memory leaks
git-svn-id: trunk@31365 -
This commit is contained in:
parent
f671c270b1
commit
5e7f08a69c
@ -631,6 +631,7 @@ begin
|
||||
FreeAndNil(DescrDocNames);
|
||||
FreeAndNil(DescrDocs);
|
||||
FreeAndNil(FAlwaysVisible);
|
||||
FreeAndNil(FPackages);
|
||||
inherited Destroy;
|
||||
end;
|
||||
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user