提交 54a80068 编写于 作者: T Tomáš Matoušek

Merge pull request #4579 from tmat/EncAssemblyDef

Do not emit AssemblyDef into EnC delta
......@@ -7,6 +7,7 @@
using System.Reflection;
using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using System.Threading;
using Microsoft.CodeAnalysis.CodeGen;
using Microsoft.CodeAnalysis.CSharp.Symbols;
using Microsoft.CodeAnalysis.CSharp.Test.Utilities;
......@@ -85,18 +86,9 @@ public void Delta_AssemblyDefTable()
generation0,
ImmutableArray.Create(new SemanticEdit(SemanticEditKind.Update, f0, f1, preserveLocalVariables: true)));
var reader1 = diff1.GetMetadata().Reader;
var assemblyDef = reader1.GetAssemblyDefinition();
Assert.False(assemblyDef.Name.IsNil);
Assert.Equal(0, assemblyDef.Version.Major);
Assert.Equal(0, assemblyDef.Version.Minor);
Assert.Equal(0, assemblyDef.Version.Revision);
Assert.Equal(0, assemblyDef.Version.Build);
Assert.True(assemblyDef.PublicKey.IsNil);
Assert.True(assemblyDef.Culture.IsNil);
Assert.Equal((AssemblyFlags)0, assemblyDef.Flags);
Assert.Equal(AssemblyHashAlgorithm.Sha1, assemblyDef.HashAlgorithm);
// AssemblyDef record is not emitted to delta since changes in assembly identity are not allowed:
Assert.True(md0.MetadataReader.IsAssembly);
Assert.False(diff1.GetMetadata().Reader.IsAssembly);
}
[Fact]
......@@ -3931,7 +3923,7 @@ .maxstack 1
");
// expect a single TypeRef for System.Object
var md1 = diff1.GetMetadata();
AssertEx.Equal(new[] { "[0x23000002] 0x0000028b.0x00000298" }, DumpTypeRefs(md1.Reader));
AssertEx.Equal(new[] { "[0x23000002] 0x00000266.0x00000273" }, DumpTypeRefs(md1.Reader));
var diff2 = compilation2.EmitDifference(
diff1.NextGeneration,
......@@ -3954,7 +3946,7 @@ .maxstack 1
");
// expect a single TypeRef for System.Object
var md2 = diff2.GetMetadata();
AssertEx.Equal(new[] { "[0x23000003] 0x000002f9.0x00000306" }, DumpTypeRefs(md2.Reader));
AssertEx.Equal(new[] { "[0x23000003] 0x000002af.0x000002bc" }, DumpTypeRefs(md2.Reader));
}
[Fact]
......@@ -4039,7 +4031,7 @@ .maxstack 1
");
// expect a single TypeRef for System.Object
var md2 = diff2.GetMetadata();
AssertEx.Equal(new[] { "[0x23000003] 0x0000032c.0x00000339" }, DumpTypeRefs(md2.Reader));
AssertEx.Equal(new[] { "[0x23000003] 0x000002e2.0x000002ef" }, DumpTypeRefs(md2.Reader));
}
private static IEnumerable<string> DumpTypeRefs(MetadataReader reader)
......
......@@ -119,6 +119,12 @@ private bool IsMinimalDelta
get { return !IsFullMetadata; }
}
/// <summary>
/// NetModules and EnC deltas don't have AssemblyDef record.
/// We don't emit it for EnC deltas since assembly identity has to be preserved across generations (CLR/debugger get confused otherwise).
/// </summary>
private bool EmitAssemblyDefinition => module.AsAssembly != null && !IsMinimalDelta;
/// <summary>
/// Returns metadata generation ordinal. Zero for
/// full metadata and non-zero for delta.
......@@ -459,7 +465,7 @@ private ImmutableArray<int> GetRowCounts()
{
var rowCounts = new int[MetadataTokens.TableCount];
rowCounts[(int)TableIndex.Assembly] = (this.module.AsAssembly != null) ? 1 : 0;
rowCounts[(int)TableIndex.Assembly] = EmitAssemblyDefinition ? 1 : 0;
rowCounts[(int)TableIndex.AssemblyRef] = _assemblyRefTable.Count;
rowCounts[(int)TableIndex.ClassLayout] = _classLayoutTable.Count;
rowCounts[(int)TableIndex.Constant] = _constantTable.Count;
......@@ -2584,12 +2590,12 @@ public int GetHashCode(IAssemblyReference reference)
private void PopulateAssemblyTableRows()
{
IAssembly assembly = this.module.AsAssembly;
if (assembly == null)
if (!EmitAssemblyDefinition)
{
return;
}
IAssembly assembly = this.module.AsAssembly;
_assemblyKey = heaps.GetBlobIndex(assembly.PublicKey);
_assemblyName = this.GetStringIndexForPathAndCheckLength(assembly.Name, assembly);
_assemblyCulture = heaps.GetStringIndex(assembly.Culture);
......@@ -4070,12 +4076,12 @@ private void SerializeFieldRvaTable(BlobBuilder writer, MetadataSizes metadataSi
private void SerializeAssemblyTable(BlobBuilder writer, MetadataSizes metadataSizes)
{
IAssembly assembly = this.module.AsAssembly;
if (assembly == null)
if (!EmitAssemblyDefinition)
{
return;
}
IAssembly assembly = this.module.AsAssembly;
writer.WriteUInt32((uint)assembly.HashAlgorithm);
writer.WriteUInt16((ushort)assembly.Version.Major);
writer.WriteUInt16((ushort)assembly.Version.Minor);
......
......@@ -3488,7 +3488,7 @@ End Class
")
' expect a single TypeRef for System.Object
Dim md1 = diff1.GetMetadata()
AssertEx.Equal({"[0x23000002] 0x00000232.0x0000023f"}, DumpTypeRefs(md1.Reader))
AssertEx.Equal({"[0x23000002] 0x0000020d.0x0000021a"}, DumpTypeRefs(md1.Reader))
Dim diff2 = compilation2.EmitDifference(diff1.NextGeneration,
ImmutableArray.Create(
......@@ -3508,7 +3508,7 @@ End Class
")
' expect a single TypeRef for System.Object
Dim md2 = diff2.GetMetadata()
AssertEx.Equal({"[0x23000003] 0x000002a0.0x000002ad"}, DumpTypeRefs(md2.Reader))
AssertEx.Equal({"[0x23000003] 0x00000256.0x00000263"}, DumpTypeRefs(md2.Reader))
End Sub
<Fact>
......@@ -3580,7 +3580,7 @@ End Class
")
' expect a single TypeRef for System.Object
Dim md2 = diff2.GetMetadata()
AssertEx.Equal({"[0x23000003] 0x000002d3.0x000002e0"}, DumpTypeRefs(md2.Reader))
AssertEx.Equal({"[0x23000003] 0x00000289.0x00000296"}, DumpTypeRefs(md2.Reader))
End Sub
Private Shared Iterator Function DumpTypeRefs(reader As MetadataReader) As IEnumerable(Of String)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册