diff options
author | Zoltan Varga <vargaz@gmail.com> | 2017-01-10 03:09:13 +0300 |
---|---|---|
committer | Zoltan Varga <vargaz@gmail.com> | 2017-01-10 03:09:19 +0300 |
commit | f204efcded9ddb17be2e957fa8d394c5cf52ae47 (patch) | |
tree | b85e1945c5b9eae55025b49ccc350efb95fdbaa0 | |
parent | 6e592a98ee8398992c010d24029c5d9ff9812f00 (diff) |
[ppdb] Fix the encoding/decoding of empty parts in document names, they should be encoded as index 0. Also, empty parts should be retained during writing, since /foo/bar is encoded as <empty><foo><bar>.
-rw-r--r-- | Mono.Cecil/AssemblyReader.cs | 4 | ||||
-rw-r--r-- | Mono.Cecil/AssemblyWriter.cs | 11 | ||||
-rw-r--r-- | Test/Mono.Cecil.Tests/PortablePdbTests.cs | 16 | ||||
-rw-r--r-- | Test/Resources/assemblies/line.exe | bin | 0 -> 4096 bytes | |||
-rw-r--r-- | Test/Resources/assemblies/line.pdb | bin | 0 -> 340 bytes |
5 files changed, 26 insertions, 5 deletions
diff --git a/Mono.Cecil/AssemblyReader.cs b/Mono.Cecil/AssemblyReader.cs index 5576ee0..f9b84bb 100644 --- a/Mono.Cecil/AssemblyReader.cs +++ b/Mono.Cecil/AssemblyReader.cs @@ -3750,7 +3750,9 @@ namespace Mono.Cecil { if (i > 0 && separator != 0) builder.Append (separator); - builder.Append (reader.ReadUTF8StringBlob (ReadCompressedUInt32 ())); + uint part = ReadCompressedUInt32 (); + if (part != 0) + builder.Append (reader.ReadUTF8StringBlob (part)); } return builder.ToString (); diff --git a/Mono.Cecil/AssemblyWriter.cs b/Mono.Cecil/AssemblyWriter.cs index 8171555..2f20d63 100644 --- a/Mono.Cecil/AssemblyWriter.cs +++ b/Mono.Cecil/AssemblyWriter.cs @@ -2507,10 +2507,13 @@ namespace Mono.Cecil { } signature.WriteByte ((byte) separator); - - var parts = name.Split (new [] { separator }, StringSplitOptions.RemoveEmptyEntries); - for (int i = 0; i < parts.Length; i++) - signature.WriteCompressedUInt32 (GetUTF8StringBlobIndex (parts [i])); + var parts = name.Split (new [] { separator }); + for (int i = 0; i < parts.Length; i++) { + if (parts [i] == String.Empty) + signature.WriteCompressedUInt32 (0); + else + signature.WriteCompressedUInt32 (GetUTF8StringBlobIndex (parts [i])); + } return signature; } diff --git a/Test/Mono.Cecil.Tests/PortablePdbTests.cs b/Test/Mono.Cecil.Tests/PortablePdbTests.cs index 14cf1eb..29637d0 100644 --- a/Test/Mono.Cecil.Tests/PortablePdbTests.cs +++ b/Test/Mono.Cecil.Tests/PortablePdbTests.cs @@ -351,5 +351,21 @@ namespace Mono.Cecil.Tests { Assert.IsTrue (module.HasSymbols); }, symbolReaderProvider: typeof (PortablePdbReaderProvider), symbolWriterProvider: typeof (PortablePdbWriterProvider)); } + + [Test] + public void PortablePdbLineInfo () + { + TestModule ("line.exe", module => { + var type = module.GetType ("Tests"); + var main = type.GetMethod ("Main"); + + AssertCode (@" + .locals () + .line 4,4:42,43 '/foo/bar.cs' + IL_0000: nop + .line 5,5:2,3 '/foo/bar.cs' + IL_0001: ret", main); + }, symbolReaderProvider: typeof (PortablePdbReaderProvider), symbolWriterProvider: typeof (PortablePdbWriterProvider)); + } } } diff --git a/Test/Resources/assemblies/line.exe b/Test/Resources/assemblies/line.exe Binary files differnew file mode 100644 index 0000000..80dd8bb --- /dev/null +++ b/Test/Resources/assemblies/line.exe diff --git a/Test/Resources/assemblies/line.pdb b/Test/Resources/assemblies/line.pdb Binary files differnew file mode 100644 index 0000000..9cb8c50 --- /dev/null +++ b/Test/Resources/assemblies/line.pdb |