From 8cc7daaccf0f00e4859dd9ef0b4fa1eb82022aa8 Mon Sep 17 00:00:00 2001 From: Shyam N Date: Fri, 5 May 2017 15:03:32 -0700 Subject: [PATCH] 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. --- .../Core/Portable/PEWriter/MetadataWriter.cs | 72 ++++++++++--------- 1 file changed, 37 insertions(+), 35 deletions(-) diff --git a/src/Compilers/Core/Portable/PEWriter/MetadataWriter.cs b/src/Compilers/Core/Portable/PEWriter/MetadataWriter.cs index c65fe050a35..0ee95b95939 100644 --- a/src/Compilers/Core/Portable/PEWriter/MetadataWriter.cs +++ b/src/Compilers/Core/Portable/PEWriter/MetadataWriter.cs @@ -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. /// protected abstract int GreatestMethodDefIndex { get; } - + /// /// 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 _customAttributeSignatureIndex = new Dictionary(); @@ -611,8 +611,8 @@ private ImmutableArray 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 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 ReserveUserString(int length) internal const uint LiteralGreatestMethodDefinitionToken = 0x40000000; internal const uint SourceDocumentIndex = 0x20000000; internal const uint ModuleVersionIdStringToken = 0x80000000; - + private void WriteInstructions(Blob finalIL, ImmutableArray 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 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 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 permissionSet, private void SerializeReturnValueAndParameters(MethodSignatureEncoder encoder, ISignature signature, ImmutableArray varargParameters) { var declaredParameters = signature.GetParameters(Context); - var returnType = signature.GetType(Context); + var returnType = signature.GetType(Context); ReturnTypeEncoder returnTypeEncoder; ParametersEncoder parametersEncoder; -- GitLab