]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
ada: Refactor GNAT.Directory_Operations.Read to minimise runtime checks
authorPiotr Trojanek <trojanek@adacore.com>
Tue, 14 Jun 2022 11:08:38 +0000 (13:08 +0200)
committerMarc Poulhiès <poulhies@adacore.com>
Mon, 13 May 2024 08:03:27 +0000 (10:03 +0200)
Array assignments are likely more efficient than element-by-element
copying; in particular, they avoid constraints checks in every iteration
of a loop (when the runtime is compiled with checks enabled).

A cleanup and improvement opportunity spotted while working on improved
detection of uninitialised local scalar objects.

gcc/ada/

* libgnat/g-dirope.adb (Read): Use null-excluding,
access-to-constant type; replace element-by-element copy with
array assignments.

gcc/ada/libgnat/g-dirope.adb

index c23aa68b700fca52e1da5e4c543cca688e1b2d69..428d27d9e8deed253b511a0e46b4de878fdf9cee 100644 (file)
@@ -676,13 +676,9 @@ package body GNAT.Directory_Operations is
          return;
       end if;
 
-      Last :=
-        (if Str'Length > Filename_Len then Str'First + Filename_Len - 1
-         else Str'Last);
-
       declare
          subtype Path_String is String (1 .. Filename_Len);
-         type    Path_String_Access is access Path_String;
+         type    Path_String_Access is not null access constant Path_String;
 
          function Address_To_Access is new
            Ada.Unchecked_Conversion
@@ -693,9 +689,13 @@ package body GNAT.Directory_Operations is
                          Address_To_Access (Filename_Addr);
 
       begin
-         for J in Str'First .. Last loop
-            Str (J) := Path_Access (J - Str'First + 1);
-         end loop;
+         if Str'Length > Filename_Len then
+            Last := Str'First + Filename_Len - 1;
+            Str (Str'First .. Last) := Path_Access.all;
+         else
+            Last := Str'Last;
+            Str := Path_Access (1 .. Str'Length);
+         end if;
       end;
    end Read;