diff --git a/ICSharpCode.Decompiler/CSharp/Transforms/IntroduceUnsafeModifier.cs b/ICSharpCode.Decompiler/CSharp/Transforms/IntroduceUnsafeModifier.cs index fe71c23f2..0ccd6fdb9 100644 --- a/ICSharpCode.Decompiler/CSharp/Transforms/IntroduceUnsafeModifier.cs +++ b/ICSharpCode.Decompiler/CSharp/Transforms/IntroduceUnsafeModifier.cs @@ -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 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; + } } } diff --git a/ICSharpCode.Decompiler/CSharp/TranslatedExpression.cs b/ICSharpCode.Decompiler/CSharp/TranslatedExpression.cs index 18cdf574a..d925f13f1 100644 --- a/ICSharpCode.Decompiler/CSharp/TranslatedExpression.cs +++ b/ICSharpCode.Decompiler/CSharp/TranslatedExpression.cs @@ -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();