From: Piotr Trojanek <[email protected]>
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.
Tested on x86_64-pc-linux-gnu, committed on master.
---
gcc/ada/libgnat/g-dirope.adb | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/gcc/ada/libgnat/g-dirope.adb b/gcc/ada/libgnat/g-dirope.adb
index c23aa68b700..428d27d9e8d 100644
--- a/gcc/ada/libgnat/g-dirope.adb
+++ b/gcc/ada/libgnat/g-dirope.adb
@@ -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;
--
2.43.2