From f1aa441b62cadb731de3d6477399c1072a205ceb Mon Sep 17 00:00:00 2001 From: Jon Hanna Date: Sun, 8 Jan 2017 19:20:44 +0000 Subject: [PATCH] Short-circuit on reference equality in ValueEquals and JValue.Compare Covers the both-null case previously checked for, so no extra cost, and skips all further work. Also make two `is` checks a null-check after `as`. --- Src/Newtonsoft.Json/Linq/JValue.cs | 24 +++++++------------ .../Utilities/MiscellaneousUtils.cs | 8 ++----- 2 files changed, 11 insertions(+), 21 deletions(-) diff --git a/Src/Newtonsoft.Json/Linq/JValue.cs b/Src/Newtonsoft.Json/Linq/JValue.cs index 2af9d763..db793adc 100644 --- a/Src/Newtonsoft.Json/Linq/JValue.cs +++ b/Src/Newtonsoft.Json/Linq/JValue.cs @@ -25,6 +25,7 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using Newtonsoft.Json.Utilities; using System.Globalization; #if !(NET35 || NET20 || PORTABLE40) @@ -248,15 +249,15 @@ namespace Newtonsoft.Json.Linq internal static int Compare(JTokenType valueType, object objA, object objB) { - if (objA == null && objB == null) + if (objA == objB) { return 0; } - if (objA != null && objB == null) + if (objB == null) { return 1; } - if (objA == null && objB != null) + if (objA == null) { return -1; } @@ -350,21 +351,14 @@ namespace Newtonsoft.Json.Linq } #endif case JTokenType.Bytes: - if (!(objB is byte[])) + byte[] bytes2 = objB as byte[]; + if (bytes2 == null) { throw new ArgumentException("Object must be of type byte[]."); } byte[] bytes1 = objA as byte[]; - byte[] bytes2 = objB as byte[]; - if (bytes1 == null) - { - return -1; - } - if (bytes2 == null) - { - return 1; - } + Debug.Assert(bytes1 != null); return MiscellaneousUtils.ByteArrayCompare(bytes1, bytes2); case JTokenType.Guid: @@ -378,13 +372,13 @@ namespace Newtonsoft.Json.Linq return guid1.CompareTo(guid2); case JTokenType.Uri: - if (!(objB is Uri)) + Uri uri2 = objB as Uri; + if (uri2 == null) { throw new ArgumentException("Object must be of type Uri."); } Uri uri1 = (Uri)objA; - Uri uri2 = (Uri)objB; return Comparer.Default.Compare(uri1.ToString(), uri2.ToString()); case JTokenType.TimeSpan: diff --git a/Src/Newtonsoft.Json/Utilities/MiscellaneousUtils.cs b/Src/Newtonsoft.Json/Utilities/MiscellaneousUtils.cs index 85b8d38e..88196e5c 100644 --- a/Src/Newtonsoft.Json/Utilities/MiscellaneousUtils.cs +++ b/Src/Newtonsoft.Json/Utilities/MiscellaneousUtils.cs @@ -39,15 +39,11 @@ namespace Newtonsoft.Json.Utilities { public static bool ValueEquals(object objA, object objB) { - if (objA == null && objB == null) + if (objA == objB) { return true; } - if (objA != null && objB == null) - { - return false; - } - if (objA == null && objB != null) + if (objA == null || objB == null) { return false; }