diff options
author | Vasiliy Fofanov <fofanov@adacore.com> | 2023-11-27 12:19:48 +0100 |
---|---|---|
committer | Marc Poulhiès <poulhies@adacore.com> | 2023-12-19 15:27:49 +0100 |
commit | e691cda5198619359003d6d30b2e0e6fc1dae3e4 (patch) | |
tree | 6379ad023edd10f19a0d12cbcbdbcef696ca6809 | |
parent | 9bbd4af0536dd137da1420f6898736fa5a57fda0 (diff) | |
download | gcc-e691cda5198619359003d6d30b2e0e6fc1dae3e4.zip gcc-e691cda5198619359003d6d30b2e0e6fc1dae3e4.tar.gz gcc-e691cda5198619359003d6d30b2e0e6fc1dae3e4.tar.bz2 |
ada: Optimize performance and remove dynamic frame requirement.
gcc/ada/
* libgnat/i-cstrin.adb (Value): Optimize.
-rw-r--r-- | gcc/ada/libgnat/i-cstrin.adb | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/gcc/ada/libgnat/i-cstrin.adb b/gcc/ada/libgnat/i-cstrin.adb index 1eb2865..73a0bc8 100644 --- a/gcc/ada/libgnat/i-cstrin.adb +++ b/gcc/ada/libgnat/i-cstrin.adb @@ -346,11 +346,13 @@ is end Value; function Value (Item : chars_ptr; Length : size_t) return String is - Result : char_array (0 .. Length); + Result : String (1 .. Natural (Length)); + C : char; begin pragma Annotate (Gnatcheck, Exempt_On, "Improper_Returns", "early returns for performance"); + -- As per AI-00177, this is equivalent to: -- To_Ada (Value (Item, Length) & nul); @@ -359,16 +361,17 @@ is raise Dereference_Error; end if; - for J in 0 .. Length - 1 loop - Result (J) := Peek (Item + J); + for J in Result'Range loop + C := Peek (Item + size_t (J - 1)); - if Result (J) = nul then - return To_Ada (Result (0 .. J)); + if C = nul then + return Result (1 .. J - 1); + else + Result (J) := To_Ada (C); end if; end loop; - Result (Length) := nul; - return To_Ada (Result); + return Result; pragma Annotate (Gnatcheck, Exempt_Off, "Improper_Returns"); end Value; |