chelper: fix mem leaks in cconverter

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@1296 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
skalogryz
2010-08-19 14:01:26 +00:00
parent 0c1371c95f
commit c04c5c61e2
5 changed files with 89 additions and 57 deletions

View File

@@ -10,7 +10,6 @@
<SessionStorage Value="InProjectDir"/> <SessionStorage Value="InProjectDir"/>
<MainUnit Value="0"/> <MainUnit Value="0"/>
<UseAppBundle Value="False"/> <UseAppBundle Value="False"/>
<ResourceType Value="res"/>
</General> </General>
<i18n> <i18n>
<EnableI18N LFM="False"/> <EnableI18N LFM="False"/>
@@ -65,19 +64,18 @@
<Linking> <Linking>
<Debugging> <Debugging>
<GenerateDebugInfo Value="True"/> <GenerateDebugInfo Value="True"/>
<UseLineInfoUnit Value="False"/>
</Debugging> </Debugging>
<LinkSmart Value="True"/>
<Options> <Options>
<LinkerOptions Value="-macosx_version_min 10.4 "/> <LinkerOptions Value="-macosx_version_min 10.4 "/>
<Win32>
<GraphicApplication Value="True"/>
</Win32>
</Options> </Options>
</Linking> </Linking>
<Other> <Other>
<CompilerMessages> <CompilerMessages>
<IgnoredMessages idx3018="True" idx3031="True" idx3189="True" idx4035="True" idx4036="True" idx4055="True" idx4079="True" idx4080="True" idx4081="True" idx5024="True" idx5057="True" idx5058="True" idx5060="True"/> <IgnoredMessages idx3018="True" idx3031="True" idx3189="True" idx4035="True" idx4036="True" idx4055="True" idx4079="True" idx4080="True" idx4081="True" idx5024="True" idx5057="True" idx5058="True" idx5060="True"/>
<UseMsgFile Value="True"/> <UseMsgFile Value="True"/>
<MsgFileName Value="/Users/dmitry/FPC_Laz/fpc/compiler/msg/errore.msg"/> <MsgFileName Value="/Users/igorkokarev/Fpc_Laz/fpc/compiler/msg/errore.msg"/>
</CompilerMessages> </CompilerMessages>
<CompilerPath Value="$(CompPath)"/> <CompilerPath Value="$(CompPath)"/>
</Other> </Other>

View File

@@ -100,8 +100,6 @@ type
function IsMultiLine: Boolean; function IsMultiLine: Boolean;
procedure SkipSingleEoLnChars; procedure SkipSingleEoLnChars;
function AddChildToStackEntity(ent: TObject): Boolean;
public public
Buf : AnsiString; Buf : AnsiString;
@@ -149,18 +147,13 @@ type
TEntity = class(TObject) TEntity = class(TObject)
protected protected
function DoParse(AParser: TTextParser): Boolean; virtual; function DoParse(AParser: TTextParser): Boolean; virtual;
public public
Offset : Integer; Offset : Integer;
Items : TList;
TagComment : AnsiString;
Specifiers : TStringList; Specifiers : TStringList;
constructor Create(AOffset: Integer=-1); virtual; constructor Create(AOffset: Integer=-1); virtual;
destructor Destroy; override; destructor Destroy; override;
function Parse(AParser: TTextParser): Boolean; virtual; function Parse(AParser: TTextParser): Boolean; virtual;
procedure Assign(AEntity: TEntity); virtual;
end; end;
TEntityClass = class of TEntity; TEntityClass = class of TEntity;
@@ -178,11 +171,15 @@ type
destructor Destroy; override; destructor Destroy; override;
end; end;
{ TCPrepInclude }
TCPrepInclude = class(TCPrepocessor) TCPrepInclude = class(TCPrepocessor)
protected protected
function DoParse(AParser: TTextParser): Boolean; override;
public
Params : TStringList; Params : TStringList;
Included : AnsiString; Included : AnsiString;
function DoParse(AParser: TTextParser): Boolean; override; destructor Destroy; override;
end; end;
TCPrepElse = class(TCPrepocessor) TCPrepElse = class(TCPrepocessor)
@@ -244,7 +241,6 @@ type
end; end;
TExpression = class(TEntity) TExpression = class(TEntity)
function DoParse(AParser: TTextParser): Boolean; override;
public public
Tokens : array of TExpPart; Tokens : array of TExpPart;
Count : Integer; Count : Integer;
@@ -272,8 +268,8 @@ type
TNamePart = class(TObject) TNamePart = class(TObject)
private private
fChild : TNamePart; fChild : TNamePart;
fOwner : TNamePart; fOwner : TNamePart;
public public
Kind : TNameKind; Kind : TNameKind;
RefCount : Integer; RefCount : Integer;
@@ -281,6 +277,7 @@ type
arrayexp : array of TExpression; arrayexp : array of TExpression;
params : array of TFuncParam; params : array of TFuncParam;
constructor Create(AKind: TNameKind); constructor Create(AKind: TNameKind);
destructor Destroy; override;
procedure AddParam(prmtype: TEntity; prmname: TNamePart); procedure AddParam(prmtype: TEntity; prmname: TNamePart);
procedure AddArrayExpr(expr: TExpression); procedure AddArrayExpr(expr: TExpression);
property child: TNamePart read fchild write fChild; // int (*p)[10]; "[10]" is child of (*p) property child: TNamePart read fchild write fChild; // int (*p)[10]; "[10]" is child of (*p)
@@ -331,8 +328,6 @@ type
{ TVarFuncEntity } { TVarFuncEntity }
TVarFuncEntity = class(TEntity) TVarFuncEntity = class(TEntity)
protected
function DoParse(AParser:TTextParser): Boolean; override;
public public
RetType : TEntity; RetType : TEntity;
Names : TList; Names : TList;
@@ -354,6 +349,7 @@ type
public public
Name : AnsiString; Name : AnsiString;
fields : array oF TStructTypeField; fields : array oF TStructTypeField;
destructor Destroy; override;
function AddField(ev: TVarFuncEntity): Integer; function AddField(ev: TVarFuncEntity): Integer;
end; end;
@@ -363,6 +359,7 @@ type
public public
Name : AnsiString; Name : AnsiString;
fields : array oF TStructTypeField; fields : array oF TStructTypeField;
destructor Destroy; override;
function AddField(ev: TVarFuncEntity): Integer; function AddField(ev: TVarFuncEntity): Integer;
end; end;
@@ -686,7 +683,12 @@ begin
end; end;
destructor TTextParser.Destroy; destructor TTextParser.Destroy;
var
i : Integer;
begin begin
TokenTable.Free;
for i:=0 to Comments.Count-1 do
TObject(Comments[i]).Free;
Comments.Free; Comments.Free;
//IgnoreTokens.Free; //IgnoreTokens.Free;
Errors.Free; Errors.Free;
@@ -735,9 +737,8 @@ begin
if Result then begin if Result then begin
Index:=i; Index:=i;
Result := df.Parse(Self); Result := df.Parse(Self);
if UsePrecompileEntities then AddChildToStackEntity(df); Comments.Add(df);
if Assigned(OnPrecompile) then if Assigned(OnPrecompile) then OnPrecompile(Self, df);
OnPrecompile(Self, df);
end; end;
if not Result then begin if not Result then begin
@@ -954,18 +955,6 @@ begin
Result := Cmd; Result := Cmd;
end; 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; function TTextParser.IsMultiLine: Boolean;
begin begin
Result := TokenTable.MultiLine <> #0; Result := TokenTable.MultiLine <> #0;
@@ -1029,11 +1018,6 @@ end;
{ TEntity } { TEntity }
procedure TEntity.Assign(AEntity: TEntity);
begin
TagComment := AEntity.TagComment;
end;
function TEntity.DoParse(AParser:TTextParser):Boolean; function TEntity.DoParse(AParser:TTextParser):Boolean;
begin begin
Result:=False; Result:=False;
@@ -1043,14 +1027,12 @@ constructor TEntity.Create(AOffset: Integer);
begin begin
inherited Create; inherited Create;
Offset := AOffset; Offset := AOffset;
Items := TList.Create;
Specifiers := TStringList.create; Specifiers := TStringList.create;
end; end;
destructor TEntity.Destroy; destructor TEntity.Destroy;
begin begin
Specifiers.Free; Specifiers.Free;
Items.Free;
inherited Destroy; inherited Destroy;
end; end;
@@ -1208,6 +1190,12 @@ begin
end; end;
end; end;
destructor TCPrepInclude.Destroy;
begin
Params.Free;
inherited Destroy;
end;
{ TCPrepElse } { TCPrepElse }
function TCPrepElse.DoParse(AParser: TTextParser): Boolean; function TCPrepElse.DoParse(AParser: TTextParser): Boolean;
@@ -1561,7 +1549,6 @@ begin
nm:=''; nm:='';
simple:=TSimpleType.Create(Parser.TokenPos); simple:=TSimpleType.Create(Parser.TokenPos);
//simple.Name:=Parser.Token;
issig:=(Parser.Token='unsigned') or (simple.Name='signed'); issig:=(Parser.Token='unsigned') or (simple.Name='signed');
if issig then begin if issig then begin
@@ -1643,11 +1630,6 @@ end;
{ TExpression } { TExpression }
function TExpression.DoParse(AParser: TTextParser): Boolean;
begin
Result:=False;
end;
procedure TExpression.PushToken(const AToken:AnsiString; ATokenType: TTokenType); procedure TExpression.PushToken(const AToken:AnsiString; ATokenType: TTokenType);
begin begin
if Count=length(Tokens) then begin if Count=length(Tokens) then begin
@@ -1826,6 +1808,23 @@ begin
Kind:=AKind; Kind:=AKind;
end; 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); procedure TNamePart.AddParam(prmtype:TEntity;prmname:TNamePart);
var var
i : Integer; i : Integer;
@@ -1847,11 +1846,6 @@ end;
{ TVarFuncEntity } { TVarFuncEntity }
function TVarFuncEntity.DoParse(AParser:TTextParser):Boolean;
begin
Result:=False;
end;
constructor TVarFuncEntity.Create(AOffset: Integer); constructor TVarFuncEntity.Create(AOffset: Integer);
begin begin
inherited Create(AOffset); inherited Create(AOffset);
@@ -1859,7 +1853,12 @@ begin
end; end;
destructor TVarFuncEntity.Destroy; destructor TVarFuncEntity.Destroy;
var
i : Integer;
begin begin
RetType.Free;
for i:=0 to Names.Count-1 do TObject(Names[i]).Free;
Names.Free;
inherited Destroy; inherited Destroy;
end; end;
@@ -1870,6 +1869,17 @@ end;
{ TStructType } { 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; function TStructType.AddField(ev:TVarFuncEntity):Integer;
var var
i : Integer; i : Integer;
@@ -2045,6 +2055,17 @@ begin
Result:=i; Result:=i;
end; 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 } { TEnumType }
function TEnumType.AddItem(const name:AnsiString;x:TExpression; Offset: Integer): Integer; function TEnumType.AddItem(const name:AnsiString;x:TExpression; Offset: Integer): Integer;
@@ -2068,7 +2089,11 @@ begin
end; end;
destructor TTypeDef.Destroy; destructor TTypeDef.Destroy;
var
i : Integer;
begin begin
origintype.Free;
for i:=0 to names.Count-1 do TObject(names[i]).Free;
names.Free; names.Free;
inherited Destroy; inherited Destroy;
end; end;

View File

@@ -325,6 +325,8 @@ begin
end; end;
Result:=ent; Result:=ent;
AParser.Index:=entidx; AParser.Index:=entidx;
end else begin
ent.Free;
end; end;
end; end;
@@ -450,6 +452,8 @@ var
cmt : TStopComment; cmt : TStopComment;
i : Integer; i : Integer;
succidx : Integer; succidx : Integer;
cmtlist : TList;
begin begin
FillChar(ParseError, sizeof(ParseError), 0); FillChar(ParseError, sizeof(ParseError), 0);
Result:=''; Result:='';
@@ -468,7 +472,7 @@ begin
p.UseCommentEntities := True; p.UseCommentEntities := True;
p.OnComment:=@cmt.OnComment; p.OnComment:=@cmt.OnComment;
p.OnPrecompile:=@cmt.OnPrecompiler; p.OnPrecompile:=@cmt.OnPrecompiler;
cmtlist:=TList.Create;
try try
repeat repeat
try try
@@ -499,7 +503,10 @@ begin
end; end;
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; lastsec:=cnv.wr.Section;
except except
@@ -509,6 +516,7 @@ begin
cnv.Free; cnv.Free;
end; 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; for i:=0 to p.Comments.Count-1 do TComment(p.Comments[i]).Free;
p.Comments.Clear; p.Comments.Clear;
cmt.Clear; cmt.Clear;
@@ -524,6 +532,7 @@ begin
p.Free; p.Free;
macros.Free; macros.Free;
cmt.Free; cmt.Free;
cmtlist.Free;
end; end;
except except
on e: Exception do Result:=Result+LineEnding+' internal error: '+ e.Message; 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, '); for i:=0 to cent.Protocols.Count-2 do wr.W(cent.Protocols[i]+'Protocol, ');
wr.W(cent.Protocols[cent.Protocols.Count-1]+'Protocol'); wr.W(cent.Protocols[cent.Protocols.Count-1]+'Protocol');
end; 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:=''; sect:='';
sc:=os_Public; sc:=os_Public;

View File

@@ -473,7 +473,6 @@ constructor TObjCMethod.Create(AOffset:Integer);
begin begin
inherited Create(AOffset); inherited Create(AOffset);
Name := TStringList.Create; Name := TStringList.Create;
RetType := TVarFuncEntity.Create;
end; end;
destructor TObjCMethod.Destroy; destructor TObjCMethod.Destroy;

View File

@@ -53,7 +53,7 @@ function SkipCommentBlock(const s: AnsiString; var index: Integer; const closecm
function SkipLine(const s: AnsiString; var index: Integer): AnsiString; 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 implementation
@@ -152,7 +152,7 @@ begin
inc(index); inc(index);
end; end;
function OffsetToLinePos(const t: AnsiString; Offset: Integer; var P: TPoint): AnsiString; procedure OffsetToLinePos(const t: AnsiString; Offset: Integer; var P: TPoint);
var var
i, le : Integer; i, le : Integer;
begin begin