Browse Source

Fix #1499, fix #1502

pull/1505/head
Siegfried Pammer 6 years ago
parent
commit
09ea089d8a
  1. 6
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/UnsafeCode.cs
  2. 16
      ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs
  3. 26
      ICSharpCode.Decompiler/Output/TextTokenWriter.cs
  4. 15
      ILSpy/Languages/CSharpHighlightingTokenWriter.cs

6
ICSharpCode.Decompiler.Tests/TestCases/Pretty/UnsafeCode.cs

@ -439,5 +439,11 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty @@ -439,5 +439,11 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty
return CreateBuffer(array2.Length, ptr2);
}
}
private unsafe static void Issue1499(StructWithFixedSizeMembers value, int index)
{
int num = value.Integers[index];
num.ToString();
}
}
}

16
ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs

@ -1008,6 +1008,19 @@ namespace ICSharpCode.Decompiler.CSharp @@ -1008,6 +1008,19 @@ namespace ICSharpCode.Decompiler.CSharp
string name = (inst.Operator == BinaryNumericOperator.Sub ? "Subtract" : "Add");
ILInstruction offsetInst = PointerArithmeticOffset.Detect(inst.Right, brt.ElementType, inst.CheckForOverflow);
if (offsetInst != null) {
if (settings.FixedBuffers && inst.Operator == BinaryNumericOperator.Add && inst.Left is LdFlda ldFlda
&& ldFlda.Target is LdFlda nestedLdFlda && CSharpDecompiler.IsFixedField(nestedLdFlda.Field, out var elementType, out _)) {
Expression fieldAccess = ConvertField(nestedLdFlda.Field, nestedLdFlda.Target);
var mrr = (MemberResolveResult)fieldAccess.GetResolveResult();
fieldAccess.RemoveAnnotations<ResolveResult>();
var result = fieldAccess.WithRR(new MemberResolveResult(mrr.TargetResult, mrr.Member, new PointerType(elementType)))
.WithILInstruction(inst);
TranslatedExpression expr = new IndexerExpression(result.Expression, Translate(offsetInst).Expression)
.WithILInstruction(inst)
.WithRR(new ResolveResult(elementType));
return new DirectionExpression(FieldDirection.Ref, expr)
.WithoutILInstruction().WithRR(new ByReferenceResolveResult(expr.Type, isOut: false));
}
return CallUnsafeIntrinsic(name, new[] { left.Expression, Translate(offsetInst).Expression }, brt, inst);
} else {
return CallUnsafeIntrinsic(name + "ByteOffset", new[] { left.Expression, right.Expression }, brt, inst);
@ -1969,8 +1982,9 @@ namespace ICSharpCode.Decompiler.CSharp @@ -1969,8 +1982,9 @@ namespace ICSharpCode.Decompiler.CSharp
&& CSharpDecompiler.IsFixedField(nestedLdFlda.Field, out var elementType, out _))
{
Expression fieldAccess = ConvertField(nestedLdFlda.Field, nestedLdFlda.Target);
var mrr = (MemberResolveResult)fieldAccess.GetResolveResult();
fieldAccess.RemoveAnnotations<ResolveResult>();
var result = fieldAccess.WithRR(new ResolveResult(new PointerType(elementType)))
var result = fieldAccess.WithRR(new MemberResolveResult(mrr.TargetResult, mrr.Member, new PointerType(elementType)))
.WithILInstruction(inst);
if (inst.ResultType == StackType.Ref) {
// convert pointer back to ref

26
ICSharpCode.Decompiler/Output/TextTokenWriter.cs

@ -401,29 +401,9 @@ namespace ICSharpCode.Decompiler @@ -401,29 +401,9 @@ namespace ICSharpCode.Decompiler
{
if (nodeStack.Pop() != node)
throw new InvalidOperationException();
// var startLocation = startLocations.Pop();
//
// // code mappings
// var ranges = node.Annotation<List<ILRange>>();
// if (symbolsStack.Count > 0 && ranges != null && ranges.Count > 0) {
// // Ignore the newline which was printed at the end of the statement
// TextLocation endLocation = (node is Statement) ? (lastEndOfLine ?? output.Location) : output.Location;
// symbolsStack.Peek().SequencePoints.Add(
// new SequencePoint() {
// ILRanges = ILRange.OrderAndJoin(ranges).ToArray(),
// StartLocation = startLocation,
// EndLocation = endLocation
// });
// }
//
// if (node.Annotation<MethodDebugSymbols>() != null) {
// symbolsStack.Peek().EndLocation = output.Location;
// output.AddDebugSymbols(symbolsStack.Pop());
// }
}
static bool IsDefinition(ref AstNode node)
public static bool IsDefinition(ref AstNode node)
{
if (node is EntityDeclaration)
return true;
@ -431,8 +411,10 @@ namespace ICSharpCode.Decompiler @@ -431,8 +411,10 @@ namespace ICSharpCode.Decompiler
node = node.Parent;
return true;
}
if (node is FixedVariableInitializer)
if (node is FixedVariableInitializer && node.Parent is FixedFieldDeclaration) {
node = node.Parent;
return true;
}
return false;
}
}

15
ILSpy/Languages/CSharpHighlightingTokenWriter.cs

@ -385,25 +385,12 @@ namespace ICSharpCode.ILSpy @@ -385,25 +385,12 @@ namespace ICSharpCode.ILSpy
var node = nodeStack.Peek();
if (node is Identifier)
node = node.Parent;
if (IsDefinition(ref node))
if (Decompiler.TextTokenWriter.IsDefinition(ref node))
return node.GetSymbol();
return null;
}
static bool IsDefinition(ref AstNode node)
{
if (node is EntityDeclaration)
return true;
if (node is VariableInitializer && node.Parent is FieldDeclaration) {
node = node.Parent;
return true;
}
if (node is FixedVariableInitializer)
return true;
return false;
}
ISymbol GetCurrentMemberReference()
{
AstNode node = nodeStack.Peek();

Loading…
Cancel
Save