Browse Source

Fix #2424: Suppress the string==null special-case within the string class itself.

pull/2426/head
Daniel Grunwald 4 years ago
parent
commit
bbaddf84cc
  1. 14
      ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs
  2. 2
      ICSharpCode.Decompiler/CSharp/Resolver/CSharpResolver.cs

14
ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs

@ -930,16 +930,7 @@ namespace ICSharpCode.Decompiler.CSharp @@ -930,16 +930,7 @@ namespace ICSharpCode.Decompiler.CSharp
.WithILInstruction(inst);
}
OperatorResolveResult rr;
if (left.Type.IsKnownType(KnownTypeCode.String) && right.Type.IsKnownType(KnownTypeCode.String))
{
rr = null; // it's a string comparison by-value, which is not a reference comparison
}
else
{
rr = resolver.ResolveBinaryOperator(inst.Kind.ToBinaryOperatorType(), left.ResolveResult, right.ResolveResult)
as OperatorResolveResult;
}
OperatorResolveResult rr = resolver.ResolveBinaryOperator(inst.Kind.ToBinaryOperatorType(), left.ResolveResult, right.ResolveResult) as OperatorResolveResult;
if (rr == null || rr.IsError || rr.UserDefinedOperatorMethod != null
|| NullableType.GetUnderlyingType(rr.Operands[0].Type).GetStackType() != inst.InputType
|| !rr.Type.IsKnownType(KnownTypeCode.Boolean))
@ -1021,7 +1012,8 @@ namespace ICSharpCode.Decompiler.CSharp @@ -1021,7 +1012,8 @@ namespace ICSharpCode.Decompiler.CSharp
if (lhs.Type.Kind == TypeKind.Null)
ExtensionMethods.Swap(ref lhs, ref rhs);
return rhs.Type.Kind == TypeKind.Null
&& (lhs.Type.Kind == TypeKind.Delegate || lhs.Type.IsKnownType(KnownTypeCode.String));
&& (lhs.Type.Kind == TypeKind.Delegate || lhs.Type.IsKnownType(KnownTypeCode.String))
&& lhs.Type.GetDefinition() != decompilationContext.CurrentTypeDefinition;
}
ExpressionWithResolveResult CreateBuiltinBinaryOperator(

2
ICSharpCode.Decompiler/CSharp/Resolver/CSharpResolver.cs

@ -1310,7 +1310,7 @@ namespace ICSharpCode.Decompiler.CSharp.Resolver @@ -1310,7 +1310,7 @@ namespace ICSharpCode.Decompiler.CSharp.Resolver
if (operatorName == null)
return EmptyList<IMethod>.Instance;
TypeCode c = ReflectionHelper.GetTypeCode(type);
if (TypeCode.Boolean <= c && c <= TypeCode.Decimal || c == TypeCode.String)
if (TypeCode.Boolean <= c && c <= TypeCode.Decimal)
{
// The .NET framework contains some of C#'s built-in operators as user-defined operators.
// However, we must not use those as user-defined operators (we would skip numeric promotion).

Loading…
Cancel
Save