Browse Source

Merge branch 'newNR' of github.com:icsharpcode/SharpDevelop into newNR

pull/32/merge
Peter Forstmeier 13 years ago
parent
commit
e019155455
  1. 5
      src/AddIns/Debugger/Debugger.Core/PdbSymbolSource.cs
  2. 1
      src/AddIns/Debugger/Debugger.Core/StackFrame.cs
  3. 2
      src/AddIns/DisplayBindings/ILSpyAddIn/DebuggerTextOutput.cs
  4. 9
      src/AddIns/DisplayBindings/ILSpyAddIn/ILSpySymbolSource.cs
  5. 4
      src/AddIns/DisplayBindings/ILSpyAddIn/ViewContent/DecompiledViewContent.cs
  6. 4
      src/Libraries/ICSharpCode.Decompiler/Ast/AstMethodBodyBuilder.cs
  7. 2
      src/Libraries/ICSharpCode.Decompiler/Ast/TextOutputFormatter.cs
  8. 8
      src/Libraries/ICSharpCode.Decompiler/CodeMappings.cs
  9. 4
      src/Libraries/ICSharpCode.Decompiler/Disassembler/MethodBodyDisassembler.cs
  10. 2
      src/Libraries/ICSharpCode.Decompiler/ILAst/ILAstBuilder.cs
  11. 52
      src/Libraries/ICSharpCode.Decompiler/ILAst/ILAstTypes.cs
  12. 10
      src/Main/Base/Project/Src/Services/Debugger/CurrentLineBookmark.cs

5
src/AddIns/Debugger/Debugger.Core/PdbSymbolSource.cs

@ -45,6 +45,11 @@ namespace Debugger @@ -45,6 +45,11 @@ namespace Debugger
this.From = from;
this.To = to;
}
public override string ToString()
{
return string.Format("{0:X2}-{1:X2}", From, To);
}
}
public class ILLocalVariable

1
src/AddIns/Debugger/Debugger.Core/StackFrame.cs

@ -156,6 +156,7 @@ namespace Debugger @@ -156,6 +156,7 @@ namespace Debugger
List<ILRange> stepRanges = new List<ILRange>();
var seq = this.Module.SymbolSource.GetSequencePoint(this.MethodInfo, this.IP);
if (seq != null) {
Process.TraceMessage("Step over: {0} IL:{1}", seq, string.Join(" ", seq.ILRanges));
stepRanges.AddRange(seq.ILRanges);
stepRanges.AddRange(this.Module.SymbolSource.GetIgnoredILRanges(this.MethodInfo));
}

2
src/AddIns/DisplayBindings/ILSpyAddIn/DebuggerTextOutput.cs

@ -3,6 +3,7 @@ @@ -3,6 +3,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using ICSharpCode.Core;
using ICSharpCode.Decompiler;
using Mono.Cecil;
@ -66,6 +67,7 @@ namespace ICSharpCode.ILSpyAddIn @@ -66,6 +67,7 @@ namespace ICSharpCode.ILSpyAddIn
public void AddDebugSymbols(MethodDebugSymbols methodDebugSymbols)
{
var id = XmlDocKeyProvider.GetKey(methodDebugSymbols.CecilMethod);
methodDebugSymbols.SequencePoints = methodDebugSymbols.SequencePoints.OrderBy(s => s.ILOffset).ToList();
this.DebugSymbols.Add(id, methodDebugSymbols);
output.AddDebugSymbols(methodDebugSymbols);
}

9
src/AddIns/DisplayBindings/ILSpyAddIn/ILSpySymbolSource.cs

@ -15,7 +15,8 @@ namespace ICSharpCode.ILSpyAddIn @@ -15,7 +15,8 @@ namespace ICSharpCode.ILSpyAddIn
{
public static MethodDebugSymbols GetSymbols(IMethod method)
{
var id = IdStringProvider.GetIdString(method);
// Use the non-specialised method definition to look up decompiled symbols
var id = IdStringProvider.GetIdString(method.MemberDefinition);
var content = DecompiledViewContent.Get(method);
if (content != null && content.DebugSymbols.ContainsKey(id)) {
return content.DebugSymbols[id];
@ -31,7 +32,11 @@ namespace ICSharpCode.ILSpyAddIn @@ -31,7 +32,11 @@ namespace ICSharpCode.ILSpyAddIn
var content = DecompiledViewContent.Get(method);
var seq = symbols.SequencePoints.FirstOrDefault(p => p.ILRanges.Any(r => r.From <= iloffset && iloffset < r.To));
return seq.ToDebugger(symbols, content.VirtualFileName);
if (seq == null)
seq = symbols.SequencePoints.FirstOrDefault(p => iloffset <= p.ILOffset);
if (seq != null)
return seq.ToDebugger(symbols, content.VirtualFileName);
return null;
}
public Debugger.SequencePoint GetSequencePoint(Module module, string filename, int line, int column)

4
src/AddIns/DisplayBindings/ILSpyAddIn/ViewContent/DecompiledViewContent.cs

@ -13,6 +13,7 @@ using ICSharpCode.AvalonEdit.Highlighting; @@ -13,6 +13,7 @@ using ICSharpCode.AvalonEdit.Highlighting;
using ICSharpCode.Core;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Ast;
using ICSharpCode.Decompiler.Disassembler;
using ICSharpCode.NRefactory.Documentation;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.ILSpyAddIn.LaunchILSpy;
@ -235,6 +236,9 @@ namespace ICSharpCode.ILSpyAddIn @@ -235,6 +236,9 @@ namespace ICSharpCode.ILSpyAddIn
astBuilder.AddType(typeDefinition);
astBuilder.GenerateCode(textOutput);
// ReflectionDisassembler disasm = new ReflectionDisassembler(textOutput, true, cancellationToken);
// disasm.DisassembleType(typeDefinition);
// save decompilation data
memberLocations = textOutput.MemberLocations;
this.DebugSymbols = textOutput.DebugSymbols;

4
src/Libraries/ICSharpCode.Decompiler/Ast/AstMethodBodyBuilder.cs

@ -147,7 +147,7 @@ namespace ICSharpCode.Decompiler.Ast @@ -147,7 +147,7 @@ namespace ICSharpCode.Decompiler.Ast
if (node is ILLabel) {
yield return new Ast.LabelStatement { Label = ((ILLabel)node).Name };
} else if (node is ILExpression) {
List<ILRange> ilRanges = ILRange.OrderAndJoint(node.GetSelfAndChildrenRecursive<ILExpression>().SelectMany(e => e.ILRanges));
List<ILRange> ilRanges = ILRange.OrderAndJoin(node.GetSelfAndChildrenRecursive<ILExpression>().SelectMany(e => e.ILRanges));
AstNode codeExpr = TransformExpression((ILExpression)node);
if (codeExpr != null) {
codeExpr = codeExpr.WithAnnotation(ilRanges);
@ -253,7 +253,7 @@ namespace ICSharpCode.Decompiler.Ast @@ -253,7 +253,7 @@ namespace ICSharpCode.Decompiler.Ast
Expression astExpr = node as Expression;
// get IL ranges - used in debugger
List<ILRange> ilRanges = ILRange.OrderAndJoint(expr.GetSelfAndChildrenRecursive<ILExpression>().SelectMany(e => e.ILRanges));
List<ILRange> ilRanges = ILRange.OrderAndJoin(expr.GetSelfAndChildrenRecursive<ILExpression>().SelectMany(e => e.ILRanges));
AstNode result;
if (astExpr != null)

2
src/Libraries/ICSharpCode.Decompiler/Ast/TextOutputFormatter.cs

@ -307,7 +307,7 @@ namespace ICSharpCode.Decompiler.Ast @@ -307,7 +307,7 @@ namespace ICSharpCode.Decompiler.Ast
if (symbolsStack.Count > 0 && ranges != null && ranges.Count > 0) {
symbolsStack.Peek().SequencePoints.Add(
new SequencePoint() {
ILRanges = ranges,
ILRanges = ILRange.OrderAndJoin(ranges).ToArray(),
StartLocation = startLocation,
EndLocation = output.Location
});

8
src/Libraries/ICSharpCode.Decompiler/CodeMappings.cs

@ -44,8 +44,14 @@ namespace ICSharpCode.Decompiler @@ -44,8 +44,14 @@ namespace ICSharpCode.Decompiler
public class SequencePoint
{
public List<ILRange> ILRanges { get; set; }
public ILRange[] ILRanges { get; set; }
public TextLocation StartLocation { get; set; }
public TextLocation EndLocation { get; set; }
public int ILOffset { get { return this.ILRanges[0].From; } }
public override string ToString()
{
return string.Join(" ", this.ILRanges) + " " + this.StartLocation + "-" + this.EndLocation;
}
}
}

4
src/Libraries/ICSharpCode.Decompiler/Disassembler/MethodBodyDisassembler.cs

@ -94,7 +94,7 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -94,7 +94,7 @@ namespace ICSharpCode.Decompiler.Disassembler
new SequencePoint() {
StartLocation = output.Location,
EndLocation = output.Location,
ILRanges = new List<ILRange>() { new ILRange { From = inst.Offset, To = inst.Next == null ? method.Body.CodeSize : inst.Next.Offset } }
ILRanges = new ILRange[] { new ILRange(inst.Offset, inst.Next == null ? method.Body.CodeSize : inst.Next.Offset) }
});
}
@ -198,7 +198,7 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -198,7 +198,7 @@ namespace ICSharpCode.Decompiler.Disassembler
new SequencePoint() {
StartLocation = startLocation,
EndLocation = output.Location,
ILRanges = new List<ILRange>() { new ILRange { From = inst.Offset, To = inst.Next == null ? codeSize : inst.Next.Offset } }
ILRanges = new ILRange[] { new ILRange(inst.Offset, inst.Next == null ? codeSize : inst.Next.Offset) }
});
}

2
src/Libraries/ICSharpCode.Decompiler/ILAst/ILAstBuilder.cs

@ -743,7 +743,7 @@ namespace ICSharpCode.Decompiler.ILAst @@ -743,7 +743,7 @@ namespace ICSharpCode.Decompiler.ILAst
// Convert stack-based IL code to ILAst tree
foreach(ByteCode byteCode in body) {
ILRange ilRange = new ILRange() { From = byteCode.Offset, To = byteCode.EndOffset };
ILRange ilRange = new ILRange(byteCode.Offset, byteCode.EndOffset);
if (byteCode.StackBefore == null) {
// Unreachable code

52
src/Libraries/ICSharpCode.Decompiler/ILAst/ILAstTypes.cs

@ -221,37 +221,43 @@ namespace ICSharpCode.Decompiler.ILAst @@ -221,37 +221,43 @@ namespace ICSharpCode.Decompiler.ILAst
}
}
public class ILRange
public struct ILRange
{
public int From;
public int To; // Exlusive
public readonly int From;
public readonly int To; // Exlusive
public ILRange(int @from, int to)
{
this.From = @from;
this.To = to;
}
public override string ToString()
{
return string.Format("{0}-{1}", From.ToString("X"), To.ToString("X"));
return string.Format("{0:X2}-{1:X2}", From, To);
}
public static List<ILRange> OrderAndJoint(IEnumerable<ILRange> input)
public static List<ILRange> OrderAndJoin(IEnumerable<ILRange> input)
{
if (input == null)
throw new ArgumentNullException("Input is null!");
List<ILRange> ranges = input.Where(r => r != null).OrderBy(r => r.From).ToList();
for (int i = 0; i < ranges.Count - 1;) {
ILRange curr = ranges[i];
ILRange next = ranges[i + 1];
// Merge consequtive ranges if they intersect
if (curr.From <= next.From && next.From <= curr.To) {
curr.To = Math.Max(curr.To, next.To);
ranges.RemoveAt(i + 1);
} else {
i++;
List<ILRange> result = new List<ILRange>();
foreach(ILRange curr in input.OrderBy(r => r.From)) {
if (result.Count > 0) {
// Merge consequtive ranges if possible
ILRange last = result[result.Count - 1];
if (curr.From <= last.To) {
result[result.Count - 1] = new ILRange(last.From, Math.Max(last.To, curr.To));
continue;
}
}
result.Add(curr);
}
return ranges;
return result;
}
public static IEnumerable<ILRange> Invert(IEnumerable<ILRange> input, int codeSize)
public static List<ILRange> Invert(IEnumerable<ILRange> input, int codeSize)
{
if (input == null)
throw new ArgumentNullException("Input is null!");
@ -259,23 +265,25 @@ namespace ICSharpCode.Decompiler.ILAst @@ -259,23 +265,25 @@ namespace ICSharpCode.Decompiler.ILAst
if (codeSize <= 0)
throw new ArgumentException("Code size must be grater than 0");
var ordered = OrderAndJoint(input);
List<ILRange> ordered = OrderAndJoin(input);
List<ILRange> result = new List<ILRange>(ordered.Count + 1);
if (ordered.Count == 0) {
yield return new ILRange() { From = 0, To = codeSize };
result.Add(new ILRange(0, codeSize));
} else {
// Gap before the first element
if (ordered.First().From != 0)
yield return new ILRange() { From = 0, To = ordered.First().From };
result.Add(new ILRange(0, ordered.First().From));
// Gaps between elements
for (int i = 0; i < ordered.Count - 1; i++)
yield return new ILRange() { From = ordered[i].To, To = ordered[i + 1].From };
result.Add(new ILRange(ordered[i].To, ordered[i + 1].From));
// Gap after the last element
Debug.Assert(ordered.Last().To <= codeSize);
if (ordered.Last().To != codeSize)
yield return new ILRange() { From = ordered.Last().To, To = codeSize };
result.Add(new ILRange(ordered.Last().To, codeSize));
}
return result;
}
}

10
src/Main/Base/Project/Src/Services/Debugger/CurrentLineBookmark.cs

@ -52,9 +52,6 @@ namespace ICSharpCode.SharpDevelop.Debugging @@ -52,9 +52,6 @@ namespace ICSharpCode.SharpDevelop.Debugging
if (startColumn < 1)
startColumn = 1;
IDocumentLine line = document.GetLineByNumber(startLine);
if (endColumn < 1 || endColumn > line.Length)
endColumn = line.Length;
instance = new CurrentLineBookmark();
instance.Location = new TextLocation(startLine, startColumn);
instance.FileName = fileName;
@ -96,8 +93,11 @@ namespace ICSharpCode.SharpDevelop.Debugging @@ -96,8 +93,11 @@ namespace ICSharpCode.SharpDevelop.Debugging
protected override ITextMarker CreateMarker(ITextMarkerService markerService)
{
IDocumentLine line = this.Document.GetLineByNumber(startLine);
ITextMarker marker = markerService.Create(line.Offset + startColumn - 1, Math.Max(endColumn - startColumn, 1));
IDocumentLine sLine = this.Document.GetLineByNumber(startLine);
IDocumentLine eLine = this.Document.GetLineByNumber(endLine);
int sOffset = Math.Min(sLine.Offset + startColumn - 1, sLine.EndOffset);
int eOffset = Math.Min(eLine.Offset + endColumn - 1, eLine.EndOffset);
ITextMarker marker = markerService.Create(sOffset, Math.Max(eOffset - sOffset, 1));
IHighlighter highlighter = this.Document.GetService(typeof(IHighlighter)) as IHighlighter;
marker.BackgroundColor = DefaultBackground;
marker.ForegroundColor = DefaultForeground;

Loading…
Cancel
Save