提交 8cc7daac 编写于 作者: S Shyam N

Crash the compiler if we are trying to emit a method definition token but end...

Crash the compiler if we are trying to emit a method definition token but end up with a handle that does not correspond to a method definition.
上级 38322d48
......@@ -95,7 +95,7 @@ internal abstract partial class MetadataWriter
this.Context = context;
this.messageProvider = messageProvider;
_cancellationToken = cancellationToken;
this.metadata = metadata;
_debugMetadataOpt = debugMetadataOpt;
_dynamicAnalysisDataWriterOpt = dynamicAnalysisDataWriterOpt;
......@@ -322,7 +322,7 @@ private bool IsMinimalDelta
/// The greatest index given to any method definition.
/// </summary>
protected abstract int GreatestMethodDefIndex { get; }
/// <summary>
/// Return true and full metadata handle of the type reference
/// if the reference is available in the current generation.
......@@ -423,9 +423,9 @@ private bool IsMinimalDelta
// Shared builder (reference equals heaps) if we are embedding Portable PDB into the metadata stream.
// Null otherwise.
protected readonly MetadataBuilder _debugMetadataOpt;
internal bool EmitStandaloneDebugMetadata => _debugMetadataOpt != null && metadata != _debugMetadataOpt;
private readonly DynamicAnalysisDataWriter _dynamicAnalysisDataWriterOpt;
private readonly Dictionary<ICustomAttribute, BlobHandle> _customAttributeSignatureIndex = new Dictionary<ICustomAttribute, BlobHandle>();
......@@ -611,8 +611,8 @@ private ImmutableArray<IParameterDefinition> GetParametersToEmitCore(IMethodDefi
// No explicit param row is needed if param has no flags (other than optionally IN),
// no name and no references to the param row, such as CustomAttribute, Constant, or FieldMarshal
if (parDef.Name != String.Empty ||
parDef.HasDefaultValue || parDef.IsOptional || parDef.IsOut || parDef.IsMarshalledExplicitly ||
if (parDef.Name != String.Empty ||
parDef.HasDefaultValue || parDef.IsOptional || parDef.IsOut || parDef.IsMarshalledExplicitly ||
IteratorHelper.EnumerableIsNotEmpty(parDef.GetAttributes(Context)))
{
if (builder != null)
......@@ -675,7 +675,7 @@ private void CreateInitialAssemblyRefIndex()
private void CreateInitialFileRefIndex()
{
Debug.Assert(!_tableIndicesAreComplete);
foreach (IFileReference fileRef in module.GetFiles(Context))
{
string key = fileRef.FileName;
......@@ -1153,7 +1153,7 @@ private BlobHandle GetMethodSignatureHandleAndBlob(IMethodReference methodRefere
var builder = PooledBlobBuilder.GetInstance();
var encoder = new BlobEncoder(builder).MethodSignature(
new SignatureHeader((byte)methodReference.CallingConvention).CallingConvention,
new SignatureHeader((byte)methodReference.CallingConvention).CallingConvention,
methodReference.GenericParameterCount,
isInstanceMethod: (methodReference.CallingConvention & CallingConvention.HasThis) != 0);
......@@ -1724,10 +1724,10 @@ public void WriteMetadataAndIL(PdbWriter nativePdbWriterOpt, Stream metadataStre
BuildMetadataAndIL(
nativePdbWriterOpt,
ilBuilder,
ilBuilder,
mappedFieldDataBuilder,
managedResourceDataBuilder,
out Blob mvidFixup,
out Blob mvidFixup,
out Blob mvidStringFixup);
var typeSystemRowCounts = metadata.GetRowCounts();
......@@ -1791,14 +1791,14 @@ public void WriteMetadataAndIL(PdbWriter nativePdbWriterOpt, Stream metadataStre
_tableIndicesAreComplete = true;
ReportReferencesToAddedSymbols();
BlobBuilder dynamicAnalysisDataOpt = null;
if (_dynamicAnalysisDataWriterOpt != null)
{
dynamicAnalysisDataOpt = new BlobBuilder();
_dynamicAnalysisDataWriterOpt.SerializeMetadataTables(dynamicAnalysisDataOpt);
}
PopulateTypeSystemTables(methodBodyOffsets, mappedFieldDataBuilder, managedResourceDataBuilder, dynamicAnalysisDataOpt, out mvidFixup);
}
......@@ -1948,7 +1948,7 @@ private void PopulateAssemblyTableRows()
name: GetStringHandleForPathAndCheckLength(module.Name, module),
culture: metadata.GetOrAddString(sourceAssembly.Identity.CultureName));
}
private void PopulateCustomAttributeTableRows(ImmutableArray<IGenericParameter> sortedGenericParameters)
{
if (this.IsFullMetadata)
......@@ -2278,9 +2278,9 @@ private void PopulateFieldMarshalTableRows()
var marshallingInformation = parDef.MarshallingInformation;
BlobHandle descriptor = (marshallingInformation != null)
? GetMarshallingDescriptorHandle(marshallingInformation)
: GetMarshallingDescriptorHandle(parDef.MarshallingDescriptor);
BlobHandle descriptor = (marshallingInformation != null)
? GetMarshallingDescriptorHandle(marshallingInformation)
: GetMarshallingDescriptorHandle(parDef.MarshallingDescriptor);
metadata.AddMarshallingDescriptor(
parent: GetParameterHandle(parDef),
......@@ -2450,7 +2450,7 @@ private void PopulateInterfaceImplTableRows()
}
}
}
private void PopulateManifestResourceTableRows(BlobBuilder resourceDataWriter, BlobBuilder dynamicAnalysisDataOpt)
{
if (dynamicAnalysisDataOpt != null)
......@@ -2462,7 +2462,7 @@ private void PopulateManifestResourceTableRows(BlobBuilder resourceDataWriter, B
offset: GetManagedResourceOffset(dynamicAnalysisDataOpt, resourceDataWriter)
);
}
foreach (var resource in this.module.GetResources(Context))
{
EntityHandle implementation;
......@@ -2497,11 +2497,11 @@ private void PopulateMemberRefTableRows()
{
metadata.AddMemberReference(
parent: GetMemberReferenceParent(memberRef),
name: GetStringHandleForNameAndCheckLength(memberRef.Name, memberRef),
name: GetStringHandleForNameAndCheckLength(memberRef.Name, memberRef),
signature: GetMemberReferenceSignatureHandle(memberRef));
}
}
private void PopulateMethodImplTableRows()
{
metadata.SetCapacity(TableIndex.MethodImpl, methodImplList.Count);
......@@ -2514,7 +2514,7 @@ private void PopulateMethodImplTableRows()
methodDeclaration: GetMethodDefinitionOrReferenceHandle(methodImplementation.ImplementedMethod));
}
}
private void PopulateMethodSpecTableRows()
{
var methodSpecs = this.GetMethodSpecs();
......@@ -2652,7 +2652,7 @@ private void PopulateModuleTableRow(out Blob mvidFixup)
encId: metadata.GetOrAddGuid(EncId),
encBaseId: metadata.GetOrAddGuid(EncBaseId));
}
private void PopulateParamTableRows()
{
var parameterDefs = this.GetParameterDefs();
......@@ -2680,7 +2680,7 @@ private void PopulatePropertyTableRows()
signature: GetPropertySignatureHandle(propertyDef));
}
}
private void PopulateTypeDefTableRows()
{
var typeDefs = this.GetTypeDefs();
......@@ -2863,7 +2863,7 @@ private int[] SerializeMethodBodies(BlobBuilder ilBuilder, PdbWriter nativePdbWr
}
_dynamicAnalysisDataWriterOpt?.SerializeMethodDynamicAnalysisData(body);
bodyOffsets[methodRid - 1] = bodyOffset;
methodRid++;
......@@ -2891,11 +2891,11 @@ private int SerializeMethodBody(MethodBodyStreamEncoder encoder, IMethodBody met
}
var encodedBody = encoder.AddMethodBody(
codeSize: methodBody.IL.Length,
maxStack: methodBody.MaxStack,
exceptionRegionCount: exceptionRegions.Length,
codeSize: methodBody.IL.Length,
maxStack: methodBody.MaxStack,
exceptionRegionCount: exceptionRegions.Length,
hasSmallExceptionRegions: MayUseSmallExceptionHeaders(exceptionRegions),
localVariablesSignature: localSignatureHandleOpt,
localVariablesSignature: localSignatureHandleOpt,
attributes: (methodBody.LocalsAreZeroed ? MethodBodyAttributes.InitLocals : 0));
// Don't do small body method caching during deterministic builds until this issue is fixed
......@@ -3083,7 +3083,7 @@ private ReservedBlob<UserStringHandle> ReserveUserString(int length)
internal const uint LiteralGreatestMethodDefinitionToken = 0x40000000;
internal const uint SourceDocumentIndex = 0x20000000;
internal const uint ModuleVersionIdStringToken = 0x80000000;
private void WriteInstructions(Blob finalIL, ImmutableArray<byte> generatedIL, ref UserStringHandle mvidStringHandle, ref Blob mvidStringFixup)
{
// write the raw body first and then patch tokens:
......@@ -3119,7 +3119,9 @@ private void WriteInstructions(Blob finalIL, ImmutableArray<byte> generatedIL, r
switch ((uint)tokenMask)
{
case LiteralMethodDefinitionToken:
token = MetadataTokens.GetToken(ResolveEntityHandleFromPseudoToken(pseudoToken & 0x00ffffff)) & 0x00ffffff;
// Crash the compiler if pseudo token fails to resolve to a MethodDefinitionHandle.
var handle = (MethodDefinitionHandle)ResolveEntityHandleFromPseudoToken(pseudoToken & 0x00ffffff);
token = MetadataTokens.GetToken(handle) & 0x00ffffff;
break;
case LiteralGreatestMethodDefinitionToken:
token = GreatestMethodDefIndex;
......@@ -3137,7 +3139,7 @@ private void WriteInstructions(Blob finalIL, ImmutableArray<byte> generatedIL, r
offset += 4;
break;
}
case OperandType.InlineString:
{
writer.Offset = offset;
......@@ -3221,7 +3223,7 @@ private void SerializeMethodBodyExceptionHandlerTable(ExceptionRegionEncoder enc
region.TryLength,
region.HandlerStartOffset,
region.HandlerLength,
(exceptionType != null) ? GetTypeHandle(exceptionType) : default(EntityHandle),
(exceptionType != null) ? GetTypeHandle(exceptionType) : default(EntityHandle),
region.FilterDecisionStartOffset);
}
}
......@@ -3380,7 +3382,7 @@ private void SerializeMetadataExpression(LiteralEncoder encoder, IMetadataExpres
{
CustomAttributeElementTypeEncoder typeEncoder;
encoder.TaggedScalar(out typeEncoder, out scalarEncoder);
// special case null argument assigned to Object parameter - treat as null string
if (c != null &&
c.Value == null &&
......@@ -3405,7 +3407,7 @@ private void SerializeMetadataExpression(LiteralEncoder encoder, IMetadataExpres
scalarEncoder.NullArray();
return;
}
Debug.Assert(!module.IsPlatformType(c.Type, PlatformType.SystemType) || c.Value == null);
scalarEncoder.Constant(c.Value);
}
......@@ -3599,7 +3601,7 @@ private void SerializePermissionSet(IEnumerable<ICustomAttribute> permissionSet,
private void SerializeReturnValueAndParameters(MethodSignatureEncoder encoder, ISignature signature, ImmutableArray<IParameterTypeInformation> varargParameters)
{
var declaredParameters = signature.GetParameters(Context);
var returnType = signature.GetType(Context);
var returnType = signature.GetType(Context);
ReturnTypeEncoder returnTypeEncoder;
ParametersEncoder parametersEncoder;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册