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`.
This commit is contained in:
Jon Hanna
2017-01-09 01:18:02 +00:00
parent 218c25c859
commit f1aa441b62
2 changed files with 11 additions and 21 deletions
+9 -15
View File
@@ -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<string>.Default.Compare(uri1.ToString(), uri2.ToString());
case JTokenType.TimeSpan:
@@ -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;
}