Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Unify parsing part of BigInteger with CoreLib #85978

Merged
merged 20 commits into from
Nov 29, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
378 changes: 378 additions & 0 deletions src/libraries/Common/src/System/Number.Parsing.Common.cs

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -580,7 +580,6 @@
<Compile Include="$(MSBuildThisFileDirectory)System\Number.Dragon4.cs" />
<Compile Include="$(MSBuildThisFileDirectory)System\Number.Formatting.cs" />
<Compile Include="$(MSBuildThisFileDirectory)System\Number.Grisu3.cs" />
<Compile Include="$(MSBuildThisFileDirectory)System\Number.NumberBuffer.cs" />
<Compile Include="$(MSBuildThisFileDirectory)System\Number.NumberToFloatingPointBits.cs" />
<Compile Include="$(MSBuildThisFileDirectory)System\Number.Parsing.cs" />
<Compile Include="$(MSBuildThisFileDirectory)System\Numerics\BitOperations.cs" />
Expand Down Expand Up @@ -1420,6 +1419,12 @@
<Compile Include="$(CommonPath)System\NotImplemented.cs">
<Link>Common\System\NotImplemented.cs</Link>
</Compile>
<Compile Include="$(CommonPath)System\Number.NumberBuffer.cs">
<Link>System\Number.NumberBuffer.cs</Link>
</Compile>
<Compile Include="$(CommonPath)System\Number.Parsing.Common.cs">
<Link>System\Number.Parsing.Common.cs</Link>
adamsitnik marked this conversation as resolved.
Show resolved Hide resolved
</Compile>
<Compile Include="$(CommonPath)System\Numerics\Crc32ReflectedTable.cs">
<Link>Common\System\Numerics\Crc32ReflectedTable.cs</Link>
</Compile>
Expand Down
11 changes: 0 additions & 11 deletions src/libraries/System.Private.CoreLib/src/System/Number.Parsing.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1361,17 +1361,6 @@ private static bool TrailingZeros<TChar>(ReadOnlySpan<TChar> value, int index)
return null;
}

private static bool IsWhite(uint ch) => (ch == 0x20) || ((ch - 0x09) <= (0x0D - 0x09));

private static bool IsDigit(uint ch) => (ch - '0') <= 9;

internal enum ParsingStatus
{
OK,
Failed,
Overflow
}

[DoesNotReturn]
internal static void ThrowOverflowOrFormatException<TChar, TInteger>(ParsingStatus status, ReadOnlySpan<TChar> value)
where TChar : unmanaged, IUtfChar<TChar>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,21 +17,24 @@
<Compile Include="System\Numerics\BigIntegerCalculator.SquMul.cs" />
<Compile Include="System\Numerics\BigIntegerCalculator.Utils.cs" />
<Compile Include="System\Numerics\BigInteger.cs" />
<Compile Include="System\Numerics\BigNumber.cs" />
<Compile Include="System\Number.BigInteger.cs" />
<Compile Include="System\Numerics\NumericsHelpers.cs" />
<Compile Include="System\Numerics\Complex.cs" />
<Compile Include="System\Globalization\FormatProvider.BigInteger.cs" />
<Compile Include="System\Globalization\FormatProvider.Number.cs" />
<Compile Include="System\Globalization\FormatProvider.NumberBuffer.cs" />
<Compile Include="Properties\InternalsVisibleTo.cs" />
</ItemGroup>

<ItemGroup>
<Compile Include="$(CommonPath)System\Globalization\FormatProvider.Number.cs"
Link="System\Globalization\FormatProvider.Number.cs" />
<Compile Include="$(CommonPath)System\Text\ValueStringBuilder.cs"
Link="CoreLib\System\Text\ValueStringBuilder.cs" />
<Compile Include="$(CommonPath)System\HexConverter.cs"
Link="Common\System\HexConverter.cs" />
<Compile Include="$(CommonPath)System\Number.NumberBuffer.cs"
Link="Common\System\Number.NumberBuffer.cs" />
<Compile Include="$(CommonPath)System\Number.Parsing.Common.cs"
Link="Common\System\Number.Parsing.Common.cs" />
</ItemGroup>

<ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.Security;
using System.Text;

namespace System.Globalization
Expand Down Expand Up @@ -32,43 +31,5 @@ internal static void FormatBigInteger(ref ValueStringBuilder sb, int precision,
}
}
}

internal static bool TryStringToBigInteger(
ReadOnlySpan<char> s,
NumberStyles styles,
NumberFormatInfo numberFormatInfo,
StringBuilder receiver, // Receives the decimal digits
out int precision,
out int scale,
out bool sign
)
{
FormatProvider.Number.NumberBuffer numberBuffer = default;

unsafe
{
// Note: because we passed a non-null StringBuilder (receiver) to TryStringToNumber, it streams the digits into
// that instead of numberBuffer.digits. This is quite important since numberBuffer.digits is a fixed-buffer size
// and BigNumbers can have an arbitrary number of digits.
//
// Just in case a bug is ever introduced into TryStringToNumber that violates this, set the pointer that numberBuffer.digits returns
// to something that will AV.
numberBuffer.overrideDigits = (char*)0x1;
}
if (!Number.TryStringToNumber(s, styles, ref numberBuffer, receiver, numberFormatInfo, parseDecimal: false))
{
precision = default(int);
scale = default(int);
sign = default(bool);
return false;
}
else
{
precision = numberBuffer.precision;
scale = numberBuffer.scale;
sign = numberBuffer.sign;
return true;
}
}
}
}
Loading
Loading