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
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static IntPtr ByteOffset<T>(ref T origin, ref T target) 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)] [MethodImpl(MethodImplOptions.AggressiveInlining)]

6
ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs

@ -1076,7 +1076,11 @@ namespace ICSharpCode.Decompiler.CSharp
return null; return null;
if (inst.Operator == BinaryNumericOperator.Sub && inst.LeftInputType == StackType.Ref && inst.RightInputType == StackType.Ref) { if (inst.Operator == BinaryNumericOperator.Sub && inst.LeftInputType == StackType.Ref && inst.RightInputType == StackType.Ref) {
// ref - ref => i // 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() if (inst.LeftInputType == StackType.Ref && inst.RightInputType.IsIntegerType()
&& left.Type is ByReferenceType brt) { && left.Type is ByReferenceType brt) {

Loading…
Cancel
Save