packages/fcl-image/src/fpimage.inc has the following function:
class function TFPCustomImage.FindHandlerFromExtension(extension: String
): TIHData;
var s : string;
r : integer;
begin
if extension='' then
Exit(nil);
extension := lowercase (extension);
if (extension <> '') and (extension[1] = '.') then
delete (extension,1,1);
with ImageHandlers do
begin
r := count-1;
s := dumchar + extension + dumchar;
while (r >= 0) do
begin
Result := GetData(r);
if (pos(s, dumchar+Result.Fextension+dumchar) <> 0) then
Exit;
dec (r);
end;
end;
Result := nil;
end;
The patch at the end of the message changes the above code to
class function TFPCustomImage.FindHandlerFromExtension(extension: String
): TIHData;
var s : string;
r : integer;
begin
if extension <> '' then
begin
extension := lowercase (extension);
if extension[1] = '.' then
delete (extension,1,1);
with ImageHandlers do
begin
r := count-1;
s := dumchar + extension + dumchar;
while (r >= 0) do
begin
Result := GetData(r);
if (pos(s, dumchar+Result.Fextension+dumchar) <> 0) then
Exit;
dec (r);
end;
end;
end;
Result := nil;
end;
begin
if extension='' then
Exit(nil);
//CODE
Result := nil;
end;
is changed to
begin
if extension<>'' then
begin
//CODE
end;
Result := nil;
end;
and after that
if (extension <> '') and (extension[1] = '.') then
is replaced with
if extension[1] = '.' then
The modified pascal code avoids duplicate nil assignments to function's result and also avoids the duplicate check for a nil(empty) extension variable. Obviously, the compiler produces better code for the modified pascal sources than for the original.
I've tried to keep the original code formatting style, here is the patch.
diff --git a/packages/fcl-image/src/fpimage.inc b/packages/fcl-image/src/fpimage.inc
index 531c4ec219..b4fb9dac24 100644
--- a/packages/fcl-image/src/fpimage.inc
+++ b/packages/fcl-image/src/fpimage.inc
@@ -274,22 +274,23 @@ class function TFPCustomImage.FindHandlerFromExtension(extension: String
var s : string;
r : integer;
begin
- if extension='' then
- Exit(nil);
- extension := lowercase (extension);
- if (extension <> '') and (extension[1] = '.') then
- delete (extension,1,1);
- with ImageHandlers do
+ if extension <> '' then
begin
- r := count-1;
- s := dumchar + extension + dumchar;
- while (r >= 0) do
- begin
- Result := GetData(r);
- if (pos(s, dumchar+Result.Fextension+dumchar) <> 0) then
- Exit;
- dec (r);
- end;
+ extension := lowercase (extension);
+ if extension[1] = '.' then
+ delete (extension,1,1);
+ with ImageHandlers do
+ begin
+ r := count-1;
+ s := dumchar + extension + dumchar;
+ while (r >= 0) do
+ begin
+ Result := GetData(r);
+ if (pos(s, dumchar+Result.Fextension+dumchar) <> 0) then
+ Exit;
+ dec (r);
+ end;
+ end;
end;
Result := nil;
end;