From aa16bb14b2a6cd053e5f89dbb33b5a3514269cce Mon Sep 17 00:00:00 2001 From: Stephen Toub Date: Wed, 18 Nov 2020 21:07:02 -0500 Subject: [PATCH] Use TryParseUInt32HexNumberStyle directly from Guid.TryParse Skips public entry points of uint.TryParse, including argument validation, branches for style, but most impactfully fetching the current number culture when it won't actually be needed. --- .../System.Private.CoreLib/src/System/Guid.cs | 12 ++++++------ .../src/System/Number.Parsing.cs | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/libraries/System.Private.CoreLib/src/System/Guid.cs b/src/libraries/System.Private.CoreLib/src/System/Guid.cs index b66d936a5e4528..81a9910ee3370d 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Guid.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Guid.cs @@ -362,7 +362,7 @@ private static bool TryParseGuid(ReadOnlySpan guidString, ref GuidResult r } // Two helpers used for parsing components: - // - uint.TryParse(..., NumberStyles.AllowHexSpecifier, ...) + // - Number.TryParseUInt32HexNumberStyle(..., NumberStyles.AllowHexSpecifier, ...) // Used when we expect the entire provided span to be filled with and only with hex digits and no overflow is possible // - TryParseHex // Used when the component may have an optional '+' and "0x" prefix, when it may overflow, etc. @@ -421,7 +421,7 @@ private static bool TryParseExactD(ReadOnlySpan guidString, ref GuidResult // _f, _g must be stored as a big-endian ushort result._fg = BitConverter.IsLittleEndian ? BinaryPrimitives.ReverseEndianness((ushort)uintTmp) : (ushort)uintTmp; - if (uint.TryParse(guidString.Slice(28, 8), NumberStyles.AllowHexSpecifier, null, out uintTmp)) // _h, _i, _j, _k + if (Number.TryParseUInt32HexNumberStyle(guidString.Slice(28, 8), NumberStyles.AllowHexSpecifier, out uintTmp) == Number.ParsingStatus.OK) // _h, _i, _j, _k { // _h, _i, _j, _k must be stored as a big-endian uint result._hijk = BitConverter.IsLittleEndian ? BinaryPrimitives.ReverseEndianness(uintTmp) : uintTmp; @@ -447,20 +447,20 @@ private static bool TryParseExactN(ReadOnlySpan guidString, ref GuidResult return false; } - if (uint.TryParse(guidString.Slice(0, 8), NumberStyles.AllowHexSpecifier, null, out result._a) && // _a - uint.TryParse(guidString.Slice(8, 8), NumberStyles.AllowHexSpecifier, null, out uint uintTmp)) // _b, _c + if (Number.TryParseUInt32HexNumberStyle(guidString.Slice(0, 8), NumberStyles.AllowHexSpecifier, out result._a) == Number.ParsingStatus.OK && // _a + Number.TryParseUInt32HexNumberStyle(guidString.Slice(8, 8), NumberStyles.AllowHexSpecifier, out uint uintTmp) == Number.ParsingStatus.OK) // _b, _c { // _b, _c are independently in machine-endian order if (BitConverter.IsLittleEndian) { uintTmp = BitOperations.RotateRight(uintTmp, 16); } result._bc = uintTmp; - if (uint.TryParse(guidString.Slice(16, 8), NumberStyles.AllowHexSpecifier, null, out uintTmp)) // _d, _e, _f, _g + if (Number.TryParseUInt32HexNumberStyle(guidString.Slice(16, 8), NumberStyles.AllowHexSpecifier, out uintTmp) == Number.ParsingStatus.OK) // _d, _e, _f, _g { // _d, _e, _f, _g must be stored as a big-endian uint if (BitConverter.IsLittleEndian) { uintTmp = BinaryPrimitives.ReverseEndianness(uintTmp); } result._defg = uintTmp; - if (uint.TryParse(guidString.Slice(24, 8), NumberStyles.AllowHexSpecifier, null, out uintTmp)) // _h, _i, _j, _k + if (Number.TryParseUInt32HexNumberStyle(guidString.Slice(24, 8), NumberStyles.AllowHexSpecifier, out uintTmp) == Number.ParsingStatus.OK) // _h, _i, _j, _k { // _h, _i, _j, _k must be stored as big-endian uint if (BitConverter.IsLittleEndian) { uintTmp = BinaryPrimitives.ReverseEndianness(uintTmp); } diff --git a/src/libraries/System.Private.CoreLib/src/System/Number.Parsing.cs b/src/libraries/System.Private.CoreLib/src/System/Number.Parsing.cs index 0d7133bc027e6c..3abb9dfd871578 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Number.Parsing.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Number.Parsing.cs @@ -1096,7 +1096,7 @@ internal static ParsingStatus TryParseUInt32IntegerStyle(ReadOnlySpan valu } /// Parses uint limited to styles that make up NumberStyles.HexNumber. - private static ParsingStatus TryParseUInt32HexNumberStyle(ReadOnlySpan value, NumberStyles styles, out uint result) + internal static ParsingStatus TryParseUInt32HexNumberStyle(ReadOnlySpan value, NumberStyles styles, out uint result) { Debug.Assert((styles & ~NumberStyles.HexNumber) == 0, "Only handles subsets of HexNumber format");