Browse Source

Fix IntPtr <-> UIntPtr casts by introducing calls to ToPointer()

pull/728/head
Siegfried Pammer 9 years ago
parent
commit
573932aa40
  1. 10
      ICSharpCode.Decompiler/CSharp/Transforms/IntroduceUnsafeModifier.cs
  2. 7
      ICSharpCode.Decompiler/CSharp/TranslatedExpression.cs

10
ICSharpCode.Decompiler/CSharp/Transforms/IntroduceUnsafeModifier.cs

@ -18,6 +18,7 @@ @@ -18,6 +18,7 @@
using System;
using ICSharpCode.NRefactory.CSharp;
using ICSharpCode.NRefactory.TypeSystem;
namespace ICSharpCode.Decompiler.CSharp.Transforms
{
@ -106,5 +107,14 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms @@ -106,5 +107,14 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms
base.VisitStackAllocExpression(stackAllocExpression);
return true;
}
public override bool VisitInvocationExpression(InvocationExpression invocationExpression)
{
bool result = base.VisitInvocationExpression(invocationExpression);
var rr = invocationExpression.GetResolveResult();
if (rr != null && rr.Type is PointerType)
return true;
return result;
}
}
}

7
ICSharpCode.Decompiler/CSharp/TranslatedExpression.cs

@ -160,6 +160,13 @@ namespace ICSharpCode.Decompiler.CSharp @@ -160,6 +160,13 @@ namespace ICSharpCode.Decompiler.CSharp
return ConvertToBoolean(expressionBuilder);
if (type.Equals(targetType))
return this;
if ((type.IsKnownType(KnownTypeCode.IntPtr) && targetType.IsKnownType(KnownTypeCode.UIntPtr))
|| (type.IsKnownType(KnownTypeCode.UIntPtr) && targetType.IsKnownType(KnownTypeCode.IntPtr))) {
return Expression.Invoke("ToPointer")
.WithoutILInstruction()
.WithRR(new ResolveResult(new PointerType(expressionBuilder.compilation.FindType(KnownTypeCode.Void))))
.ConvertTo(targetType, expressionBuilder);
}
if (type.Kind == TypeKind.ByReference && targetType.Kind == TypeKind.Pointer && Expression is DirectionExpression) {
// convert from reference to pointer
Expression arg = ((DirectionExpression)Expression).Expression.Detach();

Loading…
Cancel
Save