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"/>
<MainUnit Value="0"/>
<UseAppBundle Value="False"/>
<ResourceType Value="res"/>
</General>
<i18n>
<EnableI18N LFM="False"/>
@@ -65,19 +64,18 @@
<Linking>
<Debugging>
<GenerateDebugInfo Value="True"/>
<UseLineInfoUnit Value="False"/>
</Debugging>
<LinkSmart Value="True"/>
<Options>
<LinkerOptions Value="-macosx_version_min 10.4 "/>
<Win32>
<GraphicApplication Value="True"/>
</Win32>
</Options>
</Linking>
<Other>
<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"/>
<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>
<CompilerPath Value="$(CompPath)"/>
</Other>

View File

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

View File

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

View File

@@ -473,7 +473,6 @@ constructor TObjCMethod.Create(AOffset:Integer);
begin
inherited Create(AOffset);
Name := TStringList.Create;
RetType := TVarFuncEntity.Create;
end;
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 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