Browse Source

Fix #2094: ByteOffset() arguments passed in wrong order

pull/2113/head
Daniel Grunwald 5 years ago
parent
commit
c6b10d3ec3
  1. 2
      ICSharpCode.Decompiler.Tests/TestCases/ILPretty/Unsafe.cs
  2. 6
      ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs

2
ICSharpCode.Decompiler.Tests/TestCases/ILPretty/Unsafe.cs

@ -228,7 +228,7 @@ namespace System.Runtime.CompilerServices @@ -228,7 +228,7 @@ namespace System.Runtime.CompilerServices
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static IntPtr ByteOffset<T>(ref T origin, ref T target)
{
return Unsafe.ByteOffset(ref target, ref origin);
return Unsafe.ByteOffset(target: ref target, origin: ref origin);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]

6
ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs

@ -1076,7 +1076,11 @@ namespace ICSharpCode.Decompiler.CSharp @@ -1076,7 +1076,11 @@ namespace ICSharpCode.Decompiler.CSharp
return null;
if (inst.Operator == BinaryNumericOperator.Sub && inst.LeftInputType == StackType.Ref && inst.RightInputType == StackType.Ref) {
// ref - ref => i
return CallUnsafeIntrinsic("ByteOffset", new[] { left.Expression, right.Expression }, compilation.FindType(KnownTypeCode.IntPtr), inst);
return CallUnsafeIntrinsic("ByteOffset", new[] {
// ByteOffset() expects the parameters the wrong way around, so order using named arguments
new NamedArgumentExpression("target", left.Expression),
new NamedArgumentExpression("origin", right.Expression)
}, compilation.FindType(KnownTypeCode.IntPtr), inst);
}
if (inst.LeftInputType == StackType.Ref && inst.RightInputType.IsIntegerType()
&& left.Type is ByReferenceType brt) {

Loading…
Cancel
Save