aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVasiliy Fofanov <fofanov@adacore.com>2023-11-27 12:19:48 +0100
committerMarc Poulhiès <poulhies@adacore.com>2023-12-19 15:27:49 +0100
commite691cda5198619359003d6d30b2e0e6fc1dae3e4 (patch)
tree6379ad023edd10f19a0d12cbcbdbcef696ca6809
parent9bbd4af0536dd137da1420f6898736fa5a57fda0 (diff)
downloadgcc-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.adb17
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;