Skip to content

Improvement of TBinaryObjectWriter.WriteIdent

from 'lagprogramming'. rtl/objpas/classes/writer.inc has procedure TBinaryObjectWriter.WriteIdent(const Ident: string);

    procedure TBinaryObjectWriter.WriteIdent(const Ident: string);
    begin
      { Check if Ident is a special identifier before trying to just write
        Ident directly }
      if UpperCase(Ident) = 'NIL' then
        WriteValue(vaNil)
      else if UpperCase(Ident) = 'FALSE' then
        WriteValue(vaFalse)
      else if UpperCase(Ident) = 'TRUE' then
        WriteValue(vaTrue)
      else if UpperCase(Ident) = 'NULL' then
        WriteValue(vaNull) else
      begin
        WriteValue(vaIdent);
        WriteStr(Ident);
      end;
    end;

The original code may compute multiple times UpperCase(Ident), even though Ident remains unchanged. The patch replaces the series of ifs with a "Case UpperCase(Ident) of".

diff --git a/rtl/objpas/classes/writer.inc b/rtl/objpas/classes/writer.inc
index 93e2d23734..64536cb29f 100644
--- a/rtl/objpas/classes/writer.inc
+++ b/rtl/objpas/classes/writer.inc
@@ -214,17 +214,12 @@ procedure TBinaryObjectWriter.WriteDate(const Value: TDateTime);
 
 procedure TBinaryObjectWriter.WriteIdent(const Ident: string);
 begin
-  { Check if Ident is a special identifier before trying to just write
-    Ident directly }
-  if UpperCase(Ident) = 'NIL' then
-    WriteValue(vaNil)
-  else if UpperCase(Ident) = 'FALSE' then
-    WriteValue(vaFalse)
-  else if UpperCase(Ident) = 'TRUE' then
-    WriteValue(vaTrue)
-  else if UpperCase(Ident) = 'NULL' then
-    WriteValue(vaNull) else
-  begin
+  Case UpperCase(Ident) of
+    'NIL'   : WriteValue(vaNil);
+    'FALSE' : WriteValue(vaFalse);
+    'TRUE'  : WriteValue(vaTrue);
+    'NULL'  : WriteValue(vaNull);
+    else
     WriteValue(vaIdent);
     WriteStr(Ident);
   end;
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information