Parcourir la source

* Fix memory leaks

git-svn-id: trunk@31365 -
michael il y a 10 ans
Parent
commit
5e7f08a69c
3 fichiers modifiés avec 32 ajouts et 17 suppressions
  1. 1 0
      utils/fpdoc/dglobals.pp
  2. 6 4
      utils/fpdoc/fpclasschart.pp
  3. 25 13
      utils/fpdoc/fpdocclasstree.pp

+ 1 - 0
utils/fpdoc/dglobals.pp

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

+ 6 - 4
utils/fpdoc/fpclasschart.pp

@@ -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

+ 25 - 13
utils/fpdoc/fpdocclasstree.pp

@@ -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;