Bladeren bron

*Fixed memory leak if an error occurs during argument parsing

git-svn-id: trunk@21828 -
michael 13 jaren geleden
bovenliggende
commit
add4de3089
1 gewijzigde bestanden met toevoegingen van 63 en 59 verwijderingen
  1. 63 59
      packages/fcl-passrc/src/pparser.pp

+ 63 - 59
packages/fcl-passrc/src/pparser.pp

@@ -2329,73 +2329,77 @@ var
   Access: TArgumentAccess;
   Access: TArgumentAccess;
   ArgType: TPasType;
   ArgType: TPasType;
 begin
 begin
-  while True do
-  begin
-    ArgNames := TStringList.Create;
-    Access := argDefault;
-    IsUntyped := False;
-    ArgType := nil;
+  ArgNames := TStringList.Create;
+  try
     while True do
     while True do
     begin
     begin
-      NextToken;
-      if CurToken = tkConst then
-      begin
-        Access := argConst;
-        Name := ExpectIdentifier;
-      end else if CurToken = tkVar then
-      begin
-        Access := ArgVar;
-        Name := ExpectIdentifier;
-      end else if (CurToken = tkIdentifier) and (UpperCase(CurTokenString) = 'OUT') then
+      ArgNames.Clear;
+      Access := argDefault;
+      IsUntyped := False;
+      ArgType := nil;
+      while True do
       begin
       begin
-        Access := ArgOut;
-        Name := ExpectIdentifier;
-      end else if CurToken = tkIdentifier then
-        Name := CurTokenString
-      else
-        ParseExc(SParserExpectedConstVarID);
-      ArgNames.Add(Name);
-      NextToken;
-      if CurToken = tkColon then
-        break
-      else if ((CurToken = tkSemicolon) or (CurToken = tkBraceClose)) and
-        (Access <> argDefault) then
+        NextToken;
+        if CurToken = tkConst then
+        begin
+          Access := argConst;
+          Name := ExpectIdentifier;
+        end else if CurToken = tkVar then
+        begin
+          Access := ArgVar;
+          Name := ExpectIdentifier;
+        end else if (CurToken = tkIdentifier) and (UpperCase(CurTokenString) = 'OUT') then
+        begin
+          Access := ArgOut;
+          Name := ExpectIdentifier;
+        end else if CurToken = tkIdentifier then
+          Name := CurTokenString
+        else
+          ParseExc(SParserExpectedConstVarID);
+        ArgNames.Add(Name);
+        NextToken;
+        if CurToken = tkColon then
+          break
+        else if ((CurToken = tkSemicolon) or (CurToken = tkBraceClose)) and
+          (Access <> argDefault) then
+        begin
+          // found an untyped const or var argument
+          UngetToken;
+          IsUntyped := True;
+          break
+        end
+        else if CurToken <> tkComma then
+          ParseExc(SParserExpectedCommaColon);
+      end;
+      SetLength(Value, 0);
+      if not IsUntyped then
       begin
       begin
-        // found an untyped const or var argument
-        UngetToken;
-        IsUntyped := True;
-        break
-      end
-      else if CurToken <> tkComma then
-        ParseExc(SParserExpectedCommaColon);
-    end;
-    SetLength(Value, 0);
-    if not IsUntyped then
-    begin
-      ArgType := ParseType(nil);
-      NextToken;
-      if CurToken = tkEqual then
+        ArgType := ParseType(nil);
+        NextToken;
+        if CurToken = tkEqual then
+        begin
+          Value := ParseExpression(Parent);
+        end else
+          UngetToken;
+      end;
+
+      for i := 0 to ArgNames.Count - 1 do
       begin
       begin
-        Value := ParseExpression(Parent);
-      end else
-        UngetToken;
-    end;
+        Arg := TPasArgument(CreateElement(TPasArgument, ArgNames[i], Parent));
+        Arg.Access := Access;
+        Arg.ArgType := ArgType;
+        if (i > 0) and Assigned(ArgType) then
+          ArgType.AddRef;
+        Arg.Value := Value;
+        Args.Add(Arg);
+      end;
 
 
-    for i := 0 to ArgNames.Count - 1 do
-    begin
-      Arg := TPasArgument(CreateElement(TPasArgument, ArgNames[i], Parent));
-      Arg.Access := Access;
-      Arg.ArgType := ArgType;
-      if (i > 0) and Assigned(ArgType) then
-        ArgType.AddRef;
-      Arg.Value := Value;
-      Args.Add(Arg);
+      NextToken;
+      if CurToken = EndToken then
+        break;
     end;
     end;
-
+  finally
     ArgNames.Free;
     ArgNames.Free;
-    NextToken;
-    if CurToken = EndToken then
-      break;
   end;
   end;
 end;
 end;