diff options
author | Jb Evain <jb@evain.net> | 2015-03-21 00:12:28 +0300 |
---|---|---|
committer | Jb Evain <jb@evain.net> | 2015-03-21 00:12:28 +0300 |
commit | 7826271ad97c5120c74bce30b7cc911464447475 (patch) | |
tree | f313f25952042968b4882cc9f1065f9ce72204c2 /symbols | |
parent | 3f697eb61052afcd05d40320fe30324e6da2834e (diff) |
Add support for reading/writing new mdb info
Diffstat (limited to 'symbols')
-rw-r--r-- | symbols/mdb/Mono.Cecil.Mdb/MdbReader.cs | 35 | ||||
-rw-r--r-- | symbols/mdb/Mono.Cecil.Mdb/MdbWriter.cs | 17 | ||||
-rw-r--r-- | symbols/mdb/Test/Mono.Cecil.Tests/MdbTests.cs | 12 |
3 files changed, 45 insertions, 19 deletions
diff --git a/symbols/mdb/Mono.Cecil.Mdb/MdbReader.cs b/symbols/mdb/Mono.Cecil.Mdb/MdbReader.cs index 658e9f3..1da6653 100644 --- a/symbols/mdb/Mono.Cecil.Mdb/MdbReader.cs +++ b/symbols/mdb/Mono.Cecil.Mdb/MdbReader.cs @@ -124,10 +124,7 @@ namespace Mono.Cecil.Mdb { if (document == null) document = GetDocument (entry.CompileUnit.SourceFile); - instruction.SequencePoint = new SequencePoint (document) { - StartLine = line.Row, - EndLine = line.Row, - }; + instruction.SequencePoint = LineToSequencePoint (line, entry, document); } } @@ -205,10 +202,9 @@ namespace Mono.Cecil.Mdb { for (int i = 0; i < lines.Length; i++) { var line = lines [i]; - instructions.Add (new InstructionSymbol (line.Offset, new SequencePoint (GetDocument (entry.CompileUnit.SourceFile)) { - StartLine = line.Row, - EndLine = line.Row, - })); + instructions.Add (new InstructionSymbol ( + line.Offset, + LineToSequencePoint (line, entry, GetDocument (entry.CompileUnit.SourceFile)))); } } @@ -223,9 +219,32 @@ namespace Mono.Cecil.Mdb { } } + static SequencePoint LineToSequencePoint (LineNumberEntry line, MethodEntry entry, Document document) + { + return new SequencePoint (document) { + StartLine = line.Row, + EndLine = line.EndRow, + StartColumn = line.Column, + EndColumn = line.EndColumn, + }; + } + public void Dispose () { symbol_file.Dispose (); } } + + static class MethodEntryExtensions { + + public static bool HasColumnInfo (this MethodEntry entry) + { + return (entry.MethodFlags & MethodEntry.Flags.ColumnsInfoIncluded) != 0; + } + + public static bool HasEndInfo (this MethodEntry entry) + { + return (entry.MethodFlags & MethodEntry.Flags.EndInfoIncluded) != 0; + } + } } diff --git a/symbols/mdb/Mono.Cecil.Mdb/MdbWriter.cs b/symbols/mdb/Mono.Cecil.Mdb/MdbWriter.cs index 4bc822b..fb6d4a8 100644 --- a/symbols/mdb/Mono.Cecil.Mdb/MdbWriter.cs +++ b/symbols/mdb/Mono.Cecil.Mdb/MdbWriter.cs @@ -90,7 +90,7 @@ namespace Mono.Cecil.Mdb { } void Populate (Collection<Instruction> instructions, int [] offsets, - int [] startRows, int [] startCols, out SourceFile file) + int [] startRows, int [] endRows, int [] startCols, int [] endCols, out SourceFile file) { SourceFile source_file = null; @@ -103,7 +103,9 @@ namespace Mono.Cecil.Mdb { source_file = GetSourceFile (sequence_point.Document); startRows [i] = sequence_point.StartLine; + endRows [i] = sequence_point.EndLine; startCols [i] = sequence_point.StartColumn; + endCols [i] = sequence_point.EndColumn; } file = source_file; @@ -120,22 +122,25 @@ namespace Mono.Cecil.Mdb { var offsets = new int [count]; var start_rows = new int [count]; + var end_rows = new int [count]; var start_cols = new int [count]; + var end_cols = new int [count]; SourceFile file; - Populate (instructions, offsets, start_rows, start_cols, out file); + Populate (instructions, offsets, start_rows, end_rows, start_cols, end_cols, out file); var builder = writer.OpenMethod (file.CompilationUnit, 0, method); - for (int i = 0; i < count; i++) + for (int i = 0; i < count; i++) { builder.MarkSequencePoint ( offsets [i], file.CompilationUnit.SourceFile, start_rows [i], + end_rows [i], start_cols [i], + end_cols [i], false); - - + } if (body.Scope != null && body.Scope.HasScopes) WriteScope (body.Scope, true); @@ -204,6 +209,8 @@ namespace Mono.Cecil.Mdb { GetSourceFile (sequence_point.Document).CompilationUnit.SourceFile, sequence_point.StartLine, sequence_point.EndLine, + sequence_point.StartColumn, + sequence_point.EndColumn, false); } diff --git a/symbols/mdb/Test/Mono.Cecil.Tests/MdbTests.cs b/symbols/mdb/Test/Mono.Cecil.Tests/MdbTests.cs index 3f43fc2..545ee31 100644 --- a/symbols/mdb/Test/Mono.Cecil.Tests/MdbTests.cs +++ b/symbols/mdb/Test/Mono.Cecil.Tests/MdbTests.cs @@ -9,7 +9,7 @@ namespace Mono.Cecil.Tests { public class MdbTests : BaseTestFixture { [Test] - public void Main () + public void MdbWithJustLineInfo () { TestModule ("hello.exe", module => { var type = module.GetType ("Program"); @@ -17,17 +17,17 @@ namespace Mono.Cecil.Tests { AssertCode (@" .locals init (System.Int32 i) - .line 7,7:0,0 'C:\sources\cecil\symbols\Mono.Cecil.Mdb\Test\Resources\assemblies\hello.cs' + .line 7,-1:-1,-1 'C:\sources\cecil\symbols\Mono.Cecil.Mdb\Test\Resources\assemblies\hello.cs' IL_0000: ldc.i4.0 IL_0001: stloc.0 - .line 7,7:0,0 'C:\sources\cecil\symbols\Mono.Cecil.Mdb\Test\Resources\assemblies\hello.cs' + .line 7,-1:-1,-1 'C:\sources\cecil\symbols\Mono.Cecil.Mdb\Test\Resources\assemblies\hello.cs' IL_0002: br IL_0013 - .line 8,8:0,0 'C:\sources\cecil\symbols\Mono.Cecil.Mdb\Test\Resources\assemblies\hello.cs' + .line 8,-1:-1,-1 'C:\sources\cecil\symbols\Mono.Cecil.Mdb\Test\Resources\assemblies\hello.cs' IL_0007: ldarg.0 IL_0008: ldloc.0 IL_0009: ldelem.ref IL_000a: call System.Void Program::Print(System.String) - .line 7,7:0,0 'C:\sources\cecil\symbols\Mono.Cecil.Mdb\Test\Resources\assemblies\hello.cs' + .line 7,-1:-1,-1 'C:\sources\cecil\symbols\Mono.Cecil.Mdb\Test\Resources\assemblies\hello.cs' IL_000f: ldloc.0 IL_0010: ldc.i4.1 IL_0011: add @@ -37,7 +37,7 @@ namespace Mono.Cecil.Tests { IL_0015: ldlen IL_0016: conv.i4 IL_0017: blt IL_0007 - .line 10,10:0,0 'C:\sources\cecil\symbols\Mono.Cecil.Mdb\Test\Resources\assemblies\hello.cs' + .line 10,-1:-1,-1 'C:\sources\cecil\symbols\Mono.Cecil.Mdb\Test\Resources\assemblies\hello.cs' IL_001c: ldc.i4.0 IL_001d: ret ", main); |