From 7f36725b6f4845f8b80d666f370abe61ab1d2706 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sat, 15 Nov 2014 20:38:44 +0100 Subject: [PATCH] implement StObj instruction --- .../CSharp/ConvertedExpression.cs | 2 +- .../CSharp/ExpressionBuilder.cs | 21 ++++++++++++++++++- .../Tests/TestCases/ControlFlow.cs | 10 ++++----- 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/ICSharpCode.Decompiler/CSharp/ConvertedExpression.cs b/ICSharpCode.Decompiler/CSharp/ConvertedExpression.cs index 3c7bfbe0e..7cc751b67 100644 --- a/ICSharpCode.Decompiler/CSharp/ConvertedExpression.cs +++ b/ICSharpCode.Decompiler/CSharp/ConvertedExpression.cs @@ -148,7 +148,7 @@ namespace ICSharpCode.Decompiler.CSharp foreach (var inst in parent.Annotations.OfType()) descendant.AddAnnotation(inst); if (parent == Expression) - return new ConvertedExpression(descendant); + return new ConvertedExpression(descendant.Detach()); } throw new ArgumentException("descendant must be a descendant of the current node"); } diff --git a/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs b/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs index 4f2198e78..55f85c269 100644 --- a/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs +++ b/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs @@ -450,7 +450,26 @@ namespace ICSharpCode.Decompiler.CSharp .WithRR(new ResolveResult(type)); } } - + + protected internal override ConvertedExpression VisitStObj(StObj inst) + { + var target = Convert(inst.Target); + var value = Convert(inst.Value); + var type = cecilMapper.GetType(inst.Type); + ConvertedExpression result; + if (target.Type.Equals(new ByReferenceType(type)) && target.Expression is DirectionExpression) { + // we can deference the managed reference by stripping away the 'ref' + result = target.UnwrapChild(((DirectionExpression)target.Expression).Expression); + } else { + // Cast pointer type if necessary: + target = target.ConvertTo(new PointerType(type), this); + result = new UnaryOperatorExpression(UnaryOperatorType.Dereference, target.Expression) + .WithoutILInstruction() + .WithRR(new ResolveResult(type)); + } + return Assignment(result, value).WithILInstruction(inst); + } + protected internal override ConvertedExpression VisitUnboxAny(UnboxAny inst) { var arg = Convert(inst.Argument); diff --git a/ICSharpCode.Decompiler/Tests/TestCases/ControlFlow.cs b/ICSharpCode.Decompiler/Tests/TestCases/ControlFlow.cs index b36d334f0..c30260a50 100644 --- a/ICSharpCode.Decompiler/Tests/TestCases/ControlFlow.cs +++ b/ICSharpCode.Decompiler/Tests/TestCases/ControlFlow.cs @@ -41,7 +41,7 @@ class ControlFlow { if (input.Contains("test")) { } - result++; + result = result + 1; Console.WriteLine("EmptyIf"); } @@ -52,7 +52,7 @@ class ControlFlow } else { Console.WriteLine("else"); } - result++; + result = result + 1; Console.WriteLine("end"); } @@ -61,7 +61,7 @@ class ControlFlow if (input.Contains("test")) { Console.WriteLine("result"); } - result++; + result = result + 1; Console.WriteLine("end"); } @@ -72,14 +72,14 @@ class ControlFlow } else { Console.WriteLine("else"); } - result++; + result = result + 1; } static void Test(string input, ref int result) { foreach (char c in input) { Console.Write(c); - result++; + result = result + 1; } if (input.Contains("test")) { Console.WriteLine("result");