Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/cecil.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZoltan Varga <vargaz@gmail.com>2017-01-10 03:09:13 +0300
committerZoltan Varga <vargaz@gmail.com>2017-01-10 03:09:19 +0300
commitf204efcded9ddb17be2e957fa8d394c5cf52ae47 (patch)
treeb85e1945c5b9eae55025b49ccc350efb95fdbaa0
parent6e592a98ee8398992c010d24029c5d9ff9812f00 (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.cs4
-rw-r--r--Mono.Cecil/AssemblyWriter.cs11
-rw-r--r--Test/Mono.Cecil.Tests/PortablePdbTests.cs16
-rw-r--r--Test/Resources/assemblies/line.exebin0 -> 4096 bytes
-rw-r--r--Test/Resources/assemblies/line.pdbbin0 -> 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
new file mode 100644
index 0000000..80dd8bb
--- /dev/null
+++ b/Test/Resources/assemblies/line.exe
Binary files differ
diff --git a/Test/Resources/assemblies/line.pdb b/Test/Resources/assemblies/line.pdb
new file mode 100644
index 0000000..9cb8c50
--- /dev/null
+++ b/Test/Resources/assemblies/line.pdb
Binary files differ