diff options
author | Marek Safar <marek.safar@gmail.com> | 2016-11-24 14:03:52 +0300 |
---|---|---|
committer | Marek Safar <marek.safar@gmail.com> | 2016-11-24 14:03:52 +0300 |
commit | 74ab08331c603d45932fa825c49329e124c2c77a (patch) | |
tree | 202722861663ad5ab6487ddb22005e154200232b | |
parent | 41edb34a24f895d96b98523c35eb26327aedf33f (diff) | |
parent | 8a3eedc7ff08fd30484da5874d1e18db9f3ff7ab (diff) |
Merge remote-tracking branch 'upstream/master'
-rw-r--r-- | Mono.Cecil.Cil/CodeReader.cs | 15 | ||||
-rw-r--r-- | Mono.Cecil/AssemblyWriter.cs | 11 | ||||
-rw-r--r-- | Mono.Cecil/MethodReference.cs | 3 | ||||
-rw-r--r-- | symbols/mdb/Test/Mono.Cecil.Tests/MdbTests.cs | 1 | ||||
-rw-r--r-- | symbols/pdb/Mono.Cecil.Pdb/PdbHelper.cs | 2 | ||||
-rw-r--r-- | symbols/pdb/Mono.Cecil.Pdb/PdbReader.cs | 30 | ||||
-rw-r--r-- | symbols/pdb/Mono.Cecil.Pdb/PdbWriter.cs | 3 | ||||
-rw-r--r-- | symbols/pdb/Test/Mono.Cecil.Tests/PdbTests.cs | 7 | ||||
-rw-r--r-- | symbols/pdb/Test/Resources/assemblies/empty-iterator.dll | bin | 0 -> 4608 bytes | |||
-rw-r--r-- | symbols/pdb/Test/Resources/assemblies/empty-iterator.pdb | bin | 0 -> 11776 bytes |
10 files changed, 53 insertions, 19 deletions
diff --git a/Mono.Cecil.Cil/CodeReader.cs b/Mono.Cecil.Cil/CodeReader.cs index 56dae8d..893b1b3 100644 --- a/Mono.Cecil.Cil/CodeReader.cs +++ b/Mono.Cecil.Cil/CodeReader.cs @@ -159,17 +159,20 @@ namespace Mono.Cecil.Cil { void ReadScope (ScopeDebugInformation scope) { - scope.Start = new InstructionOffset (GetInstruction (scope.Start.Offset)); + var start_instruction = GetInstruction (scope.Start.Offset); + if (start_instruction != null) + scope.Start = new InstructionOffset (start_instruction); var end_instruction = GetInstruction (scope.End.Offset); - scope.End = end_instruction == null - ? new InstructionOffset () - : new InstructionOffset (end_instruction); + if (end_instruction != null) + scope.End = new InstructionOffset (end_instruction); if (!scope.variables.IsNullOrEmpty ()) { for (int i = 0; i < scope.variables.Count; i++) { - var variable = scope.variables [i]; - variable.index = new VariableIndex (GetVariable (variable.Index)); + var variable_info = scope.variables [i]; + var variable = GetVariable (variable_info.Index); + if (variable != null) + variable_info.index = new VariableIndex (variable); } } diff --git a/Mono.Cecil/AssemblyWriter.cs b/Mono.Cecil/AssemblyWriter.cs index a71c0ae..63176e4 100644 --- a/Mono.Cecil/AssemblyWriter.cs +++ b/Mono.Cecil/AssemblyWriter.cs @@ -85,6 +85,9 @@ namespace Mono.Cecil { module.MetadataSystem.Clear (); + if (module.symbol_reader != null) + module.symbol_reader.Dispose (); + var name = module.assembly != null ? module.assembly.Name : null; var fq_name = stream.value.GetFileName (); var symbol_writer_provider = parameters.SymbolWriterProvider; @@ -105,9 +108,6 @@ namespace Mono.Cecil { BuildMetadata (module, metadata); - if (module.symbol_reader != null) - module.symbol_reader.Dispose (); - var writer = ImageWriter.CreateWriter (module, metadata, stream); writer.WriteImage (); @@ -2257,7 +2257,7 @@ namespace Mono.Cecil { { var rid = local_scope_table.AddRow (new LocalScopeRow ( method_info.Method.MetadataToken.RID, - AddImportScope (scope.Import), + scope.import != null ? AddImportScope (scope.import) : 0, local_variable_rid, local_constant_rid, (uint) scope.Start.Offset, @@ -2273,9 +2273,6 @@ namespace Mono.Cecil { if (scope.HasConstants) AddLocalConstants (scope); - if (scope.Import != null) - AddImportScope (scope.Import); - for (int i = 0; i < scope.Scopes.Count; i++) AddLocalScope (method_info, scope.Scopes [i]); } diff --git a/Mono.Cecil/MethodReference.cs b/Mono.Cecil/MethodReference.cs index f8c7bb6..8e92479 100644 --- a/Mono.Cecil/MethodReference.cs +++ b/Mono.Cecil/MethodReference.cs @@ -122,6 +122,9 @@ namespace Mono.Cecil { if (this.ReturnType.ContainsGenericParameter || base.ContainsGenericParameter) return true; + if (!HasParameters) + return false; + var parameters = this.Parameters; for (int i = 0; i < parameters.Count; i++) diff --git a/symbols/mdb/Test/Mono.Cecil.Tests/MdbTests.cs b/symbols/mdb/Test/Mono.Cecil.Tests/MdbTests.cs index 907d744..883028b 100644 --- a/symbols/mdb/Test/Mono.Cecil.Tests/MdbTests.cs +++ b/symbols/mdb/Test/Mono.Cecil.Tests/MdbTests.cs @@ -79,7 +79,6 @@ namespace Mono.Cecil.Tests { foreach (var sp in info.SequencePoints) Assert.AreEqual(@"C:\tmp\repropartial\BreakpointTest.Portable\TestService.cs", sp.Document.Url); - }, symbolReaderProvider: typeof(MdbReaderProvider), symbolWriterProvider: typeof(MdbWriterProvider)); } } diff --git a/symbols/pdb/Mono.Cecil.Pdb/PdbHelper.cs b/symbols/pdb/Mono.Cecil.Pdb/PdbHelper.cs index 6c08b3c..c397398 100644 --- a/symbols/pdb/Mono.Cecil.Pdb/PdbHelper.cs +++ b/symbols/pdb/Mono.Cecil.Pdb/PdbHelper.cs @@ -59,7 +59,7 @@ namespace Mono.Cecil.Pdb { static bool IsPortablePdb (string fileName) { - using (var file = new FileStream (fileName, FileMode.Open, FileAccess.Read, FileShare.None)) + using (var file = new FileStream (fileName, FileMode.Open, FileAccess.Read, FileShare.Read)) return IsPortablePdb (file); } diff --git a/symbols/pdb/Mono.Cecil.Pdb/PdbReader.cs b/symbols/pdb/Mono.Cecil.Pdb/PdbReader.cs index abd503d..317a496 100644 --- a/symbols/pdb/Mono.Cecil.Pdb/PdbReader.cs +++ b/symbols/pdb/Mono.Cecil.Pdb/PdbReader.cs @@ -104,11 +104,17 @@ namespace Mono.Cecil.Pdb { ReadSequencePoints (function, symbol); - if (function.scopes.Length > 1) - throw new NotSupportedException (); - else if (function.scopes.Length == 1) + if (!function.scopes.IsNullOrEmpty()) symbol.scope = ReadScopeAndLocals (function.scopes [0], symbol); + if (function.scopes.Length > 1) { + for (int i = 1; i < function.scopes.Length; i++) { + var s = ReadScopeAndLocals (function.scopes [i], symbol); + if (!AddScope (symbol.scope.Scopes, s)) + symbol.scope.Scopes.Add (s); + } + } + return symbol; } @@ -133,6 +139,9 @@ namespace Mono.Cecil.Pdb { parent.variables = new Collection<VariableDebugInformation> (scope.slots.Length); foreach (PdbSlot slot in scope.slots) { + if (slot.flags == 1) // parameter names + continue; + var index = (int) slot.slot; var variable = new VariableDebugInformation (index, slot.name); if (slot.flags == 4) @@ -157,6 +166,21 @@ namespace Mono.Cecil.Pdb { return parent; } + static bool AddScope (Collection<ScopeDebugInformation> scopes, ScopeDebugInformation scope) + { + foreach (var sub_scope in scopes) { + if (sub_scope.HasScopes && AddScope (sub_scope.Scopes, scope)) + return true; + + if (scope.Start.Offset >= sub_scope.Start.Offset && scope.End.Offset <= sub_scope.End.Offset) { + sub_scope.Scopes.Add (scope); + return true; + } + } + + return false; + } + void ReadSequencePoints (PdbFunction function, MethodDebugInformation info) { if (function.lines == null) diff --git a/symbols/pdb/Mono.Cecil.Pdb/PdbWriter.cs b/symbols/pdb/Mono.Cecil.Pdb/PdbWriter.cs index 1d827b7..553ef2f 100644 --- a/symbols/pdb/Mono.Cecil.Pdb/PdbWriter.cs +++ b/symbols/pdb/Mono.Cecil.Pdb/PdbWriter.cs @@ -45,7 +45,8 @@ namespace Mono.Cecil.Pdb { writer.OpenMethod (sym_token); - DefineSequencePoints (info.sequence_points); + if (!info.sequence_points.IsNullOrEmpty ()) + DefineSequencePoints (info.sequence_points); if (info.scope != null) DefineScope (info.scope, info); diff --git a/symbols/pdb/Test/Mono.Cecil.Tests/PdbTests.cs b/symbols/pdb/Test/Mono.Cecil.Tests/PdbTests.cs index f8b4148..d11b0f9 100644 --- a/symbols/pdb/Test/Mono.Cecil.Tests/PdbTests.cs +++ b/symbols/pdb/Test/Mono.Cecil.Tests/PdbTests.cs @@ -148,6 +148,13 @@ namespace Mono.Cecil.Tests { } [Test] + public void EmptyEnumerable () + { + TestModule ("empty-iterator.dll", module => { + }, readOnly: Platform.OnMono, symbolReaderProvider: typeof (PdbReaderProvider), symbolWriterProvider: typeof (PdbWriterProvider)); + } + + [Test] public void CreateMethodFromScratch () { IgnoreOnMono (); diff --git a/symbols/pdb/Test/Resources/assemblies/empty-iterator.dll b/symbols/pdb/Test/Resources/assemblies/empty-iterator.dll Binary files differnew file mode 100644 index 0000000..7e9bcda --- /dev/null +++ b/symbols/pdb/Test/Resources/assemblies/empty-iterator.dll diff --git a/symbols/pdb/Test/Resources/assemblies/empty-iterator.pdb b/symbols/pdb/Test/Resources/assemblies/empty-iterator.pdb Binary files differnew file mode 100644 index 0000000..42f57a6 --- /dev/null +++ b/symbols/pdb/Test/Resources/assemblies/empty-iterator.pdb |