From c04c5c61e2ad29b513478932795167d73a541b36 Mon Sep 17 00:00:00 2001 From: skalogryz Date: Thu, 19 Aug 2010 14:01:26 +0000 Subject: [PATCH] chelper: fix mem leaks in cconverter git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@1296 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- components/chelper/cconvert.lpi | 8 +- components/chelper/cparsertypes.pas | 117 ++++++++++++++---------- components/chelper/ctopasconvert.pas | 16 +++- components/chelper/objcparsing.pas | 1 - components/chelper/textparsingutils.pas | 4 +- 5 files changed, 89 insertions(+), 57 deletions(-) diff --git a/components/chelper/cconvert.lpi b/components/chelper/cconvert.lpi index 3c7362ecc..4b4db133d 100644 --- a/components/chelper/cconvert.lpi +++ b/components/chelper/cconvert.lpi @@ -10,7 +10,6 @@ - @@ -65,19 +64,18 @@ + + - - - - + diff --git a/components/chelper/cparsertypes.pas b/components/chelper/cparsertypes.pas index cd3eac6e9..34f5c6b74 100755 --- a/components/chelper/cparsertypes.pas +++ b/components/chelper/cparsertypes.pas @@ -100,8 +100,6 @@ type function IsMultiLine: Boolean; procedure SkipSingleEoLnChars; - - function AddChildToStackEntity(ent: TObject): Boolean; public Buf : AnsiString; @@ -149,18 +147,13 @@ type TEntity = class(TObject) protected function DoParse(AParser: TTextParser): Boolean; virtual; - public Offset : Integer; - Items : TList; - - TagComment : AnsiString; Specifiers : TStringList; constructor Create(AOffset: Integer=-1); virtual; destructor Destroy; override; function Parse(AParser: TTextParser): Boolean; virtual; - procedure Assign(AEntity: TEntity); virtual; end; TEntityClass = class of TEntity; @@ -178,11 +171,15 @@ type destructor Destroy; override; end; + { TCPrepInclude } + TCPrepInclude = class(TCPrepocessor) protected + function DoParse(AParser: TTextParser): Boolean; override; + public Params : TStringList; Included : AnsiString; - function DoParse(AParser: TTextParser): Boolean; override; + destructor Destroy; override; end; TCPrepElse = class(TCPrepocessor) @@ -244,7 +241,6 @@ type end; TExpression = class(TEntity) - function DoParse(AParser: TTextParser): Boolean; override; public Tokens : array of TExpPart; Count : Integer; @@ -272,8 +268,8 @@ type TNamePart = class(TObject) private - fChild : TNamePart; - fOwner : TNamePart; + fChild : TNamePart; + fOwner : TNamePart; public Kind : TNameKind; RefCount : Integer; @@ -281,6 +277,7 @@ type arrayexp : array of TExpression; params : array of TFuncParam; constructor Create(AKind: TNameKind); + destructor Destroy; override; procedure AddParam(prmtype: TEntity; prmname: TNamePart); procedure AddArrayExpr(expr: TExpression); property child: TNamePart read fchild write fChild; // int (*p)[10]; "[10]" is child of (*p) @@ -331,8 +328,6 @@ type { TVarFuncEntity } TVarFuncEntity = class(TEntity) - protected - function DoParse(AParser:TTextParser): Boolean; override; public RetType : TEntity; Names : TList; @@ -354,6 +349,7 @@ type public Name : AnsiString; fields : array oF TStructTypeField; + destructor Destroy; override; function AddField(ev: TVarFuncEntity): Integer; end; @@ -363,6 +359,7 @@ type public Name : AnsiString; fields : array oF TStructTypeField; + destructor Destroy; override; function AddField(ev: TVarFuncEntity): Integer; end; @@ -686,7 +683,12 @@ begin end; destructor TTextParser.Destroy; +var + i : Integer; begin + TokenTable.Free; + for i:=0 to Comments.Count-1 do + TObject(Comments[i]).Free; Comments.Free; //IgnoreTokens.Free; Errors.Free; @@ -735,9 +737,8 @@ begin if Result then begin Index:=i; Result := df.Parse(Self); - if UsePrecompileEntities then AddChildToStackEntity(df); - if Assigned(OnPrecompile) then - OnPrecompile(Self, df); + Comments.Add(df); + if Assigned(OnPrecompile) then OnPrecompile(Self, df); end; if not Result then begin @@ -954,18 +955,6 @@ begin Result := Cmd; end; -function TTextParser.AddChildToStackEntity(ent: TObject): Boolean; -var - parent : TEntity; -begin - Result := Assigned(stack) and (stack.Count>0); - if not Result then Exit; - - parent := stack[stack.Count-1]; - if Assigned(parent) and (parent is TEntity) then - (parent as TEntity).Items.Add(ent); -end; - function TTextParser.IsMultiLine: Boolean; begin Result := TokenTable.MultiLine <> #0; @@ -1029,11 +1018,6 @@ end; { TEntity } -procedure TEntity.Assign(AEntity: TEntity); -begin - TagComment := AEntity.TagComment; -end; - function TEntity.DoParse(AParser:TTextParser):Boolean; begin Result:=False; @@ -1043,14 +1027,12 @@ constructor TEntity.Create(AOffset: Integer); begin inherited Create; Offset := AOffset; - Items := TList.Create; Specifiers := TStringList.create; end; destructor TEntity.Destroy; begin Specifiers.Free; - Items.Free; inherited Destroy; end; @@ -1208,6 +1190,12 @@ begin end; end; +destructor TCPrepInclude.Destroy; +begin + Params.Free; + inherited Destroy; +end; + { TCPrepElse } function TCPrepElse.DoParse(AParser: TTextParser): Boolean; @@ -1561,7 +1549,6 @@ begin nm:=''; simple:=TSimpleType.Create(Parser.TokenPos); - //simple.Name:=Parser.Token; issig:=(Parser.Token='unsigned') or (simple.Name='signed'); if issig then begin @@ -1643,11 +1630,6 @@ end; { TExpression } -function TExpression.DoParse(AParser: TTextParser): Boolean; -begin - Result:=False; -end; - procedure TExpression.PushToken(const AToken:AnsiString; ATokenType: TTokenType); begin if Count=length(Tokens) then begin @@ -1826,6 +1808,23 @@ begin Kind:=AKind; end; +destructor TNamePart.Destroy; +var + i : Integer; +begin + if Assigned(fChild) then begin + fChild.owner:=nil; + fChild.Free; + end; + if Assigned(fOwner) then fOwner.fChild:=nil; + for i:=0 to length(arrayexp)-1 do arrayexp[i].Free; + for i:=0 to length(params)-1 do begin + params[i].prmtype.Free; + params[i].name.Free; + end; + inherited Destroy; +end; + procedure TNamePart.AddParam(prmtype:TEntity;prmname:TNamePart); var i : Integer; @@ -1847,11 +1846,6 @@ end; { TVarFuncEntity } -function TVarFuncEntity.DoParse(AParser:TTextParser):Boolean; -begin - Result:=False; -end; - constructor TVarFuncEntity.Create(AOffset: Integer); begin inherited Create(AOffset); @@ -1859,7 +1853,12 @@ begin end; destructor TVarFuncEntity.Destroy; +var + i : Integer; begin + RetType.Free; + for i:=0 to Names.Count-1 do TObject(Names[i]).Free; + Names.Free; inherited Destroy; end; @@ -1870,6 +1869,17 @@ end; { TStructType } +destructor TStructType.Destroy; +var + i : Integer; +begin + for i:=0 to length(fields)-1 do begin + fields[i].v.Free; + fields[i].bits.Free; + end; + inherited Destroy; +end; + function TStructType.AddField(ev:TVarFuncEntity):Integer; var i : Integer; @@ -2045,6 +2055,17 @@ begin Result:=i; end; +destructor TUnionType.Destroy; +var + i : Integer; +begin + for i:=0 to length(fields)-1 do begin + fields[i].v.Free; + fields[i].bits.Free; + end; + inherited Destroy; +end; + { TEnumType } function TEnumType.AddItem(const name:AnsiString;x:TExpression; Offset: Integer): Integer; @@ -2068,7 +2089,11 @@ begin end; destructor TTypeDef.Destroy; +var + i : Integer; begin + origintype.Free; + for i:=0 to names.Count-1 do TObject(names[i]).Free; names.Free; inherited Destroy; end; diff --git a/components/chelper/ctopasconvert.pas b/components/chelper/ctopasconvert.pas index 533dba441..90f1216f3 100644 --- a/components/chelper/ctopasconvert.pas +++ b/components/chelper/ctopasconvert.pas @@ -325,6 +325,8 @@ begin end; Result:=ent; AParser.Index:=entidx; + end else begin + ent.Free; end; end; @@ -450,6 +452,8 @@ var cmt : TStopComment; i : Integer; succidx : Integer; + cmtlist : TList; + begin FillChar(ParseError, sizeof(ParseError), 0); Result:=''; @@ -468,7 +472,7 @@ begin p.UseCommentEntities := True; p.OnComment:=@cmt.OnComment; p.OnPrecompile:=@cmt.OnPrecompiler; - + cmtlist:=TList.Create; try repeat try @@ -499,7 +503,10 @@ begin end; end; - cnv.WriteCtoPas(ent, p.Comments, p.Buf); + cmtlist.Clear; + for i:=0 to p.Comments.Count-1 do + if TObject(p.Comments[i]) is TComment then cmtlist.Add(TObject(p.Comments[i])); + cnv.WriteCtoPas(ent, cmtlist, p.Buf); lastsec:=cnv.wr.Section; except @@ -509,6 +516,7 @@ begin cnv.Free; end; + if Assigned(ent) and (p.Comments.IndexOf(ent)<0) then ent.Free; for i:=0 to p.Comments.Count-1 do TComment(p.Comments[i]).Free; p.Comments.Clear; cmt.Clear; @@ -524,6 +532,7 @@ begin p.Free; macros.Free; cmt.Free; + cmtlist.Free; end; except on e: Exception do Result:=Result+LineEnding+' internal error: '+ e.Message; @@ -734,7 +743,8 @@ begin for i:=0 to cent.Protocols.Count-2 do wr.W(cent.Protocols[i]+'Protocol, '); wr.W(cent.Protocols[cent.Protocols.Count-1]+'Protocol'); end; - if (cent.SuperClass<>'') or (cent.Protocols.Count>0) then wr.Wln(')'); + if (cent.SuperClass<>'') or (cent.Protocols.Count>0) then wr.Wln(')') + else wr.Wln; sect:=''; sc:=os_Public; diff --git a/components/chelper/objcparsing.pas b/components/chelper/objcparsing.pas index 25dfbac51..79c8470d0 100644 --- a/components/chelper/objcparsing.pas +++ b/components/chelper/objcparsing.pas @@ -473,7 +473,6 @@ constructor TObjCMethod.Create(AOffset:Integer); begin inherited Create(AOffset); Name := TStringList.Create; - RetType := TVarFuncEntity.Create; end; destructor TObjCMethod.Destroy; diff --git a/components/chelper/textparsingutils.pas b/components/chelper/textparsingutils.pas index 9dd595511..c285ad322 100644 --- a/components/chelper/textparsingutils.pas +++ b/components/chelper/textparsingutils.pas @@ -53,7 +53,7 @@ function SkipCommentBlock(const s: AnsiString; var index: Integer; const closecm function SkipLine(const s: AnsiString; var index: Integer): AnsiString; -function OffsetToLinePos(const t: AnsiString; Offset: Integer; var P: TPoint): AnsiString; +procedure OffsetToLinePos(const t: AnsiString; Offset: Integer; var P: TPoint); implementation @@ -152,7 +152,7 @@ begin inc(index); end; -function OffsetToLinePos(const t: AnsiString; Offset: Integer; var P: TPoint): AnsiString; +procedure OffsetToLinePos(const t: AnsiString; Offset: Integer; var P: TPoint); var i, le : Integer; begin