From 267d5e861c022c338de5004bb6c85e26d6179039 Mon Sep 17 00:00:00 2001 From: lilinus Date: Sat, 27 Apr 2024 15:34:51 +0200 Subject: [PATCH] Revert changes to TimeSpanParse.Pow10 --- .../System/Globalization/DateTimeFormat.cs | 2 +- .../System/Globalization/TimeSpanFormat.cs | 4 +-- .../src/System/Globalization/TimeSpanParse.cs | 30 +++++++++---------- 3 files changed, 17 insertions(+), 19 deletions(-) diff --git a/src/libraries/System.Private.CoreLib/src/System/Globalization/DateTimeFormat.cs b/src/libraries/System.Private.CoreLib/src/System/Globalization/DateTimeFormat.cs index 3bc1298527f74e..02ee787c5f21c1 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Globalization/DateTimeFormat.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Globalization/DateTimeFormat.cs @@ -485,7 +485,7 @@ private static void FormatCustomized( if (tokenLen <= MaxSecondsFractionDigits) { int fraction = (int)(dateTime.Ticks % Calendar.TicksPerSecond); - fraction /= TimeSpanParse.Pow10(MaxSecondsFractionDigits - tokenLen); + fraction /= (int)TimeSpanParse.Pow10(MaxSecondsFractionDigits - tokenLen); if (ch == 'f') { FormatFraction(ref result, fraction, fixedNumberFormats[tokenLen - 1]); diff --git a/src/libraries/System.Private.CoreLib/src/System/Globalization/TimeSpanFormat.cs b/src/libraries/System.Private.CoreLib/src/System/Globalization/TimeSpanFormat.cs index e7f9f791694368..6f468ce5a92f4f 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Globalization/TimeSpanFormat.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Globalization/TimeSpanFormat.cs @@ -356,7 +356,7 @@ private static void FormatCustomized(TimeSpan value, scoped ReadOnlySpan< } tmp = fraction; - tmp /= TimeSpanParse.Pow10(DateTimeFormat.MaxSecondsFractionDigits - tokenLen); + tmp /= (int)TimeSpanParse.Pow10(DateTimeFormat.MaxSecondsFractionDigits - tokenLen); DateTimeFormat.FormatFraction(ref result, tmp, DateTimeFormat.fixedNumberFormats[tokenLen - 1]); break; case 'F': @@ -370,7 +370,7 @@ private static void FormatCustomized(TimeSpan value, scoped ReadOnlySpan< } tmp = fraction; - tmp /= TimeSpanParse.Pow10(DateTimeFormat.MaxSecondsFractionDigits - tokenLen); + tmp /= (int)TimeSpanParse.Pow10(DateTimeFormat.MaxSecondsFractionDigits - tokenLen); int effectiveDigits = tokenLen; while (effectiveDigits > 0) { diff --git a/src/libraries/System.Private.CoreLib/src/System/Globalization/TimeSpanParse.cs b/src/libraries/System.Private.CoreLib/src/System/Globalization/TimeSpanParse.cs index 2f20b14c4f1468..a48f423058fa4f 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Globalization/TimeSpanParse.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Globalization/TimeSpanParse.cs @@ -133,7 +133,7 @@ public bool NormalizeAndValidateFraction() // .000001 normalize to 10 ticks // .1 normalize to 1,000,000 ticks - _num *= Pow10(MaxFractionDigits - totalDigitsCount); + _num *= (int)Pow10(MaxFractionDigits - totalDigitsCount); return true; } @@ -564,22 +564,20 @@ internal bool SetBadFormatSpecifierFailure(char? formatSpecifierCharacter = null } } - internal static int Pow10(int pow) + internal static long Pow10(int pow) { - Debug.Assert(pow >= 0); - Debug.Assert(pow <= MaxFractionDigits); - ReadOnlySpan powersOfTen = [ - 1, - 10, - 100, - 1000, - 10000, - 100000, - 1000000, - 10000000, - ]; - Debug.Assert(powersOfTen.Length == MaxFractionDigits + 1); - return powersOfTen[pow]; + return pow switch + { + 0 => 1, + 1 => 10, + 2 => 100, + 3 => 1000, + 4 => 10000, + 5 => 100000, + 6 => 1000000, + 7 => 10000000, + _ => (long)Math.Pow(10, pow), + }; } private static bool TryTimeToTicks(bool positive, TimeSpanToken days, TimeSpanToken hours, TimeSpanToken minutes, TimeSpanToken seconds, TimeSpanToken fraction, out long result)