private static void WriteAligned(BlobBuilder source, BlobBuilder target) { int length = source.Count; target.LinkSuffix(source); target.WriteBytes(0, BitArithmeticUtilities.Align(length, 4) - length); }
private void WriteAligned(MemoryStream source, MemoryStream target) { int length = (int)source.Length; source.WriteTo(target); target.Write(0, BitArithmeticUtilities.Align(length, 4) - length); }
public Builder AddUsingInfo(params short[] groupSizes) { var numGroupSizes = groupSizes.Length; var recordSize = BitArithmeticUtilities.Align(4 + 4 + 2 + 2 * numGroupSizes, 4); // Record size, including header. // Record header _bytesBuilder.Add(Version); _bytesBuilder.Add((byte)CustomDebugInfoKind.UsingInfo); _bytesBuilder.Add(Padding); _bytesBuilder.Add(Padding); _bytesBuilder.Add4(recordSize); // Record body _bytesBuilder.Add2((short)numGroupSizes); foreach (var groupSize in groupSizes) { _bytesBuilder.Add2(groupSize); } if ((_bytesBuilder.Count % 4) != 0) { _bytesBuilder.Add2(0); } Assert.Equal(0, _bytesBuilder.Count % 4); _recordCount++; return(this); }
private static void WriteAligned(BlobWriter source, BlobWriter target) { int length = source.Length; source.WriteTo(target); target.Write(0, BitArithmeticUtilities.Align(length, 4) - length); }
private void WriteAlignedBlobHeap(BlobBuilder writer) { int heapStart = writer.Position; // ensure enough space in the buffer: writer.SetPosition(writer.Position + _blobHeapSize); // Perf consideration: With large heap the following loop may cause a lot of cache misses // since the order of entries in _blobs dictionary depends on the hash of the array values, // which is not correlated to the heap index. If we observe such issue we should order // the entries by heap position before running this loop. foreach (var entry in _blobs) { int heapOffset = entry.Value.HeapPosition; var blob = entry.Key; writer.SetPosition(heapStart + heapOffset); writer.WriteCompressedInteger((uint)blob.Length); writer.WriteBytes(blob); } Debug.Assert(writer.Length - heapStart == _blobHeapSize); // add padding: writer.SetPosition(writer.Length); writer.WriteBytes(0, BitArithmeticUtilities.Align(_blobHeapSize, 4) - _blobHeapSize); }
public static int GetMetadataStreamHeaderSize(string streamName) { return (sizeof(int) + // offset sizeof(int) + // size BitArithmeticUtilities.Align(streamName.Length + 1, 4)); // zero-terminated name, padding }
private int count; // mutate on construction private HashBucket(int hashRoll, uint used, AbstractBucket[] buckets, int count) { this.hashRoll = hashRoll & 31; this.used = used; this.buckets = buckets; this.count = count; Debug.Assert(this.buckets.Length == BitArithmeticUtilities.CountBits(this.used)); }
private void SerializeNamespaceScopeMetadata(IMethodBody methodBody, ArrayBuilder <MemoryStream> customDebugInfo) { if (methodBody.NamespaceScopeEncoding == NamespaceScopeEncoding.Forwarding) { return; } if (ShouldForwardToPreviousMethodWithUsingInfo(methodBody)) { Debug.Assert(!ReferenceEquals(_previousMethodBodyWithUsingInfo, methodBody)); SerializeReferenceToPreviousMethodWithUsingInfo(customDebugInfo); return; } MemoryStream customMetadata = new MemoryStream(); List <ushort> usingCounts = new List <ushort>(); BinaryWriter cmw = new BinaryWriter(customMetadata); foreach (NamespaceScope namespaceScope in methodBody.NamespaceScopes) { usingCounts.Add((ushort)namespaceScope.UsedNamespaces.Length); } // ACASEY: This originally wrote (uint)12, (ushort)1, (ushort)0 in the // case where usingCounts was empty, but I'm not sure why. if (usingCounts.Count > 0) { uint streamLength = 0; cmw.WriteByte(CDI.CdiVersion); cmw.WriteByte(CDI.CdiKindUsingInfo); cmw.Align(4); cmw.WriteUint(streamLength = BitArithmeticUtilities.Align((uint)usingCounts.Count * 2 + 10, 4)); cmw.WriteUshort((ushort)usingCounts.Count); foreach (ushort uc in usingCounts) { cmw.WriteUshort(uc); } cmw.Align(4); Debug.Assert(streamLength == customMetadata.Length); customDebugInfo.Add(customMetadata); } if (_methodBodyWithModuleInfo != null && !ReferenceEquals(_methodBodyWithModuleInfo, methodBody)) { SerializeReferenceToMethodWithModuleInfo(customDebugInfo); } }
private void SerializeNamespaceScopeMetadata(EmitContext context, IMethodBody methodBody, ArrayBuilder <MemoryStream> customDebugInfo) { if (context.Module.GenerateVisualBasicStylePdb) { return; } if (ShouldForwardToPreviousMethodWithUsingInfo(context, methodBody)) { Debug.Assert(!ReferenceEquals(_previousMethodBodyWithUsingInfo, methodBody)); SerializeReferenceToPreviousMethodWithUsingInfo(customDebugInfo); return; } MemoryStream customMetadata = new MemoryStream(); List <ushort> usingCounts = new List <ushort>(); BinaryWriter cmw = new BinaryWriter(customMetadata); for (IImportScope scope = methodBody.ImportScope; scope != null; scope = scope.Parent) { usingCounts.Add((ushort)scope.GetUsedNamespaces().Length); } // ACASEY: This originally wrote (uint)12, (ushort)1, (ushort)0 in the // case where usingCounts was empty, but I'm not sure why. if (usingCounts.Count > 0) { uint streamLength; cmw.WriteByte(CDI.CdiVersion); cmw.WriteByte(CDI.CdiKindUsingInfo); cmw.Align(4); cmw.WriteUint(streamLength = BitArithmeticUtilities.Align((uint)usingCounts.Count * 2 + 10, 4)); cmw.WriteUshort((ushort)usingCounts.Count); foreach (ushort uc in usingCounts) { cmw.WriteUshort(uc); } cmw.Align(4); Debug.Assert(streamLength == customMetadata.Length); customDebugInfo.Add(customMetadata); } if (_methodBodyWithModuleInfo != null && !ReferenceEquals(_methodBodyWithModuleInfo, methodBody)) { SerializeReferenceToMethodWithModuleInfo(customDebugInfo); } }
private int ComputePhysicalSlot(int logicalSlot) { Debug.Assert(logicalSlot >= 0 && logicalSlot < 32); if (this.buckets.Length == 32) { return(logicalSlot); } if (logicalSlot == 0) { return(0); } var mask = uint.MaxValue >> (32 - logicalSlot); // only count the bits up to the logical slot # return(BitArithmeticUtilities.CountBits(this.used & mask)); }
private void WriteAlignedBlobHeap(BlobBuilder builder) { int alignment = BitArithmeticUtilities.Align(_blobHeapSize, 4) - _blobHeapSize; var writer = builder.ReserveBytes(_blobHeapSize + alignment); // Perf consideration: With large heap the following loop may cause a lot of cache misses // since the order of entries in _blobs dictionary depends on the hash of the array values, // which is not correlated to the heap index. If we observe such issue we should order // the entries by heap position before running this loop. foreach (var entry in _blobs) { int heapOffset = entry.Value.HeapPosition; var blob = entry.Key; writer.Offset = heapOffset; writer.WriteCompressedInteger((uint)blob.Length); writer.WriteBytes(blob); } writer.Offset = _blobHeapSize; writer.WriteBytes(0, alignment); }
/// <exception cref="InvalidOperationException">Builder is not writable, it has been linked with another one.</exception> public void Align(int alignment) { int position = Count; WriteBytes(0, BitArithmeticUtilities.Align(position, alignment) - position); }
public MetadataSizes(ImmutableArray <int> rowCounts, ImmutableArray <int> heapSizes, bool isMinimalDelta) { const byte large = 4; const byte small = 2; this.RowCounts = rowCounts; this.HeapSizes = heapSizes; this.isMinimalDelta = isMinimalDelta; this.BlobIndexSize = (isMinimalDelta || heapSizes[(int)HeapIndex.Blob] > ushort.MaxValue) ? large : small; this.StringIndexSize = (isMinimalDelta || heapSizes[(int)HeapIndex.String] > ushort.MaxValue) ? large : small; this.GuidIndexSize = (isMinimalDelta || heapSizes[(int)HeapIndex.Guid] > ushort.MaxValue) ? large : small; this.CustomAttributeTypeCodedIndexSize = this.GetIndexByteSize(3, TableIndex.MethodDef, TableIndex.MemberRef); this.DeclSecurityCodedIndexSize = this.GetIndexByteSize(2, TableIndex.MethodDef, TableIndex.TypeDef); this.EventDefIndexSize = this.GetIndexByteSize(0, TableIndex.Event); this.FieldDefIndexSize = this.GetIndexByteSize(0, TableIndex.Field); this.GenericParamIndexSize = this.GetIndexByteSize(0, TableIndex.GenericParam); this.HasConstantCodedIndexSize = this.GetIndexByteSize(2, TableIndex.Field, TableIndex.Param, TableIndex.Property); this.HasCustomAttributeCodedIndexSize = this.GetIndexByteSize(5, TableIndex.MethodDef, TableIndex.Field, TableIndex.TypeRef, TableIndex.TypeDef, TableIndex.Param, TableIndex.InterfaceImpl, TableIndex.MemberRef, TableIndex.Module, TableIndex.DeclSecurity, TableIndex.Property, TableIndex.Event, TableIndex.StandAloneSig, TableIndex.ModuleRef, TableIndex.TypeSpec, TableIndex.Assembly, TableIndex.AssemblyRef, TableIndex.File, TableIndex.ExportedType, TableIndex.ManifestResource, TableIndex.GenericParam, TableIndex.GenericParamConstraint, TableIndex.MethodSpec); this.HasFieldMarshalCodedIndexSize = this.GetIndexByteSize(1, TableIndex.Field, TableIndex.Param); this.HasSemanticsCodedIndexSize = this.GetIndexByteSize(1, TableIndex.Event, TableIndex.Property); this.ImplementationCodedIndexSize = this.GetIndexByteSize(2, TableIndex.File, TableIndex.AssemblyRef, TableIndex.ExportedType); this.MemberForwardedCodedIndexSize = this.GetIndexByteSize(1, TableIndex.Field, TableIndex.MethodDef); this.MemberRefParentCodedIndexSize = this.GetIndexByteSize(3, TableIndex.TypeDef, TableIndex.TypeRef, TableIndex.ModuleRef, TableIndex.MethodDef, TableIndex.TypeSpec); this.MethodDefIndexSize = this.GetIndexByteSize(0, TableIndex.MethodDef); this.MethodDefOrRefCodedIndexSize = this.GetIndexByteSize(1, TableIndex.MethodDef, TableIndex.MemberRef); this.ModuleRefIndexSize = this.GetIndexByteSize(0, TableIndex.ModuleRef); this.ParameterIndexSize = this.GetIndexByteSize(0, TableIndex.Param); this.PropertyDefIndexSize = this.GetIndexByteSize(0, TableIndex.Property); this.ResolutionScopeCodedIndexSize = this.GetIndexByteSize(2, TableIndex.Module, TableIndex.ModuleRef, TableIndex.AssemblyRef, TableIndex.TypeRef); this.TypeDefIndexSize = this.GetIndexByteSize(0, TableIndex.TypeDef); this.TypeDefOrRefCodedIndexSize = this.GetIndexByteSize(2, TableIndex.TypeDef, TableIndex.TypeRef, TableIndex.TypeSpec); this.TypeOrMethodDefCodedIndexSize = this.GetIndexByteSize(1, TableIndex.TypeDef, TableIndex.MethodDef); int size = this.CalculateTableStreamHeaderSize(); size += GetTableSize(TableIndex.Module, 2 + 3 * this.GuidIndexSize + this.StringIndexSize); size += GetTableSize(TableIndex.TypeRef, this.ResolutionScopeCodedIndexSize + this.StringIndexSize + this.StringIndexSize); size += GetTableSize(TableIndex.TypeDef, 4 + this.StringIndexSize + this.StringIndexSize + this.TypeDefOrRefCodedIndexSize + this.FieldDefIndexSize + this.MethodDefIndexSize); Debug.Assert(RowCounts[(int)TableIndex.FieldPtr] == 0); size += GetTableSize(TableIndex.Field, 2 + this.StringIndexSize + this.BlobIndexSize); Debug.Assert(RowCounts[(int)TableIndex.MethodPtr] == 0); size += GetTableSize(TableIndex.MethodDef, 8 + this.StringIndexSize + this.BlobIndexSize + this.ParameterIndexSize); Debug.Assert(RowCounts[(int)TableIndex.ParamPtr] == 0); size += GetTableSize(TableIndex.Param, 4 + this.StringIndexSize); size += GetTableSize(TableIndex.InterfaceImpl, this.TypeDefIndexSize + this.TypeDefOrRefCodedIndexSize); size += GetTableSize(TableIndex.MemberRef, this.MemberRefParentCodedIndexSize + this.StringIndexSize + this.BlobIndexSize); size += GetTableSize(TableIndex.Constant, 2 + this.HasConstantCodedIndexSize + this.BlobIndexSize); size += GetTableSize(TableIndex.CustomAttribute, this.HasCustomAttributeCodedIndexSize + this.CustomAttributeTypeCodedIndexSize + this.BlobIndexSize); size += GetTableSize(TableIndex.FieldMarshal, this.HasFieldMarshalCodedIndexSize + this.BlobIndexSize); size += GetTableSize(TableIndex.DeclSecurity, 2 + this.DeclSecurityCodedIndexSize + this.BlobIndexSize); size += GetTableSize(TableIndex.ClassLayout, 6 + this.TypeDefIndexSize); size += GetTableSize(TableIndex.FieldLayout, 4 + this.FieldDefIndexSize); size += GetTableSize(TableIndex.StandAloneSig, this.BlobIndexSize); size += GetTableSize(TableIndex.EventMap, this.TypeDefIndexSize + this.EventDefIndexSize); Debug.Assert(RowCounts[(int)TableIndex.EventPtr] == 0); size += GetTableSize(TableIndex.Event, 2 + this.StringIndexSize + this.TypeDefOrRefCodedIndexSize); size += GetTableSize(TableIndex.PropertyMap, this.TypeDefIndexSize + this.PropertyDefIndexSize); Debug.Assert(RowCounts[(int)TableIndex.PropertyPtr] == 0); size += GetTableSize(TableIndex.Property, 2 + this.StringIndexSize + this.BlobIndexSize); size += GetTableSize(TableIndex.MethodSemantics, 2 + this.MethodDefIndexSize + this.HasSemanticsCodedIndexSize); size += GetTableSize(TableIndex.MethodImpl, 0 + this.TypeDefIndexSize + this.MethodDefOrRefCodedIndexSize + this.MethodDefOrRefCodedIndexSize); size += GetTableSize(TableIndex.ModuleRef, 0 + this.StringIndexSize); size += GetTableSize(TableIndex.TypeSpec, 0 + this.BlobIndexSize); size += GetTableSize(TableIndex.ImplMap, 2 + this.MemberForwardedCodedIndexSize + this.StringIndexSize + this.ModuleRefIndexSize); size += GetTableSize(TableIndex.FieldRva, 4 + this.FieldDefIndexSize); size += GetTableSize(TableIndex.EncLog, 8); size += GetTableSize(TableIndex.EncMap, 4); size += GetTableSize(TableIndex.Assembly, 16 + this.BlobIndexSize + this.StringIndexSize + this.StringIndexSize); Debug.Assert(RowCounts[(int)TableIndex.AssemblyProcessor] == 0); Debug.Assert(RowCounts[(int)TableIndex.AssemblyOS] == 0); size += GetTableSize(TableIndex.AssemblyRef, 12 + this.BlobIndexSize + this.StringIndexSize + this.StringIndexSize + this.BlobIndexSize); Debug.Assert(RowCounts[(int)TableIndex.AssemblyRefProcessor] == 0); Debug.Assert(RowCounts[(int)TableIndex.AssemblyRefOS] == 0); size += GetTableSize(TableIndex.File, 4 + this.StringIndexSize + this.BlobIndexSize); size += GetTableSize(TableIndex.ExportedType, 8 + this.StringIndexSize + this.StringIndexSize + this.ImplementationCodedIndexSize); size += GetTableSize(TableIndex.ManifestResource, 8 + this.StringIndexSize + this.ImplementationCodedIndexSize); size += GetTableSize(TableIndex.NestedClass, this.TypeDefIndexSize + this.TypeDefIndexSize); size += GetTableSize(TableIndex.GenericParam, 4 + this.TypeOrMethodDefCodedIndexSize + this.StringIndexSize); size += GetTableSize(TableIndex.MethodSpec, this.MethodDefOrRefCodedIndexSize + this.BlobIndexSize); size += GetTableSize(TableIndex.GenericParamConstraint, this.GenericParamIndexSize + this.TypeDefOrRefCodedIndexSize); // +1 for terminating 0 byte size = BitArithmeticUtilities.Align(size + 1, StreamAlignment); this.MetadataTableStreamSize = size; size += GetAlignedHeapSize(HeapIndex.String); size += GetAlignedHeapSize(HeapIndex.UserString); size += GetAlignedHeapSize(HeapIndex.Guid); size += GetAlignedHeapSize(HeapIndex.Blob); this.MetadataStreamStorageSize = size; }
public int GetAlignedHeapSize(HeapIndex index) { return(BitArithmeticUtilities.Align(HeapSizes[(int)index], StreamAlignment)); }
public MetadataSizes( ImmutableArray <int> rowCounts, ImmutableArray <int> heapSizes, int ilStreamSize, int mappedFieldDataSize, int resourceDataSize, int strongNameSignatureSize, bool isMinimalDelta, bool emitStandaloneDebugMetadata, bool isStandaloneDebugMetadata) { Debug.Assert(rowCounts.Length == MetadataTokens.TableCount); Debug.Assert(heapSizes.Length == MetadataTokens.HeapCount); Debug.Assert(!isStandaloneDebugMetadata || emitStandaloneDebugMetadata); const byte large = 4; const byte small = 2; this.RowCounts = rowCounts; this.HeapSizes = heapSizes; this.ResourceDataSize = resourceDataSize; this.ILStreamSize = ilStreamSize; this.MappedFieldDataSize = mappedFieldDataSize; this.StrongNameSignatureSize = strongNameSignatureSize; this.IsMinimalDelta = isMinimalDelta; this.BlobIndexSize = (isMinimalDelta || heapSizes[(int)HeapIndex.Blob] > ushort.MaxValue) ? large : small; this.StringIndexSize = (isMinimalDelta || heapSizes[(int)HeapIndex.String] > ushort.MaxValue) ? large : small; this.GuidIndexSize = (isMinimalDelta || heapSizes[(int)HeapIndex.Guid] > ushort.MaxValue) ? large : small; ulong allTables = ComputeNonEmptyTableMask(rowCounts); if (!emitStandaloneDebugMetadata) { // all tables PresentTablesMask = allTables; ExternalTablesMask = 0; } else if (isStandaloneDebugMetadata) { // debug tables: PresentTablesMask = allTables & DebugMetadataTablesMask; ExternalTablesMask = allTables & ~DebugMetadataTablesMask; } else { // type-system tables only: PresentTablesMask = allTables & ~DebugMetadataTablesMask; ExternalTablesMask = 0; } this.CustomAttributeTypeCodedIndexSize = this.GetReferenceByteSize(3, TableIndex.MethodDef, TableIndex.MemberRef); this.DeclSecurityCodedIndexSize = this.GetReferenceByteSize(2, TableIndex.MethodDef, TableIndex.TypeDef); this.EventDefIndexSize = this.GetReferenceByteSize(0, TableIndex.Event); this.FieldDefIndexSize = this.GetReferenceByteSize(0, TableIndex.Field); this.GenericParamIndexSize = this.GetReferenceByteSize(0, TableIndex.GenericParam); this.HasConstantCodedIndexSize = this.GetReferenceByteSize(2, TableIndex.Field, TableIndex.Param, TableIndex.Property); this.HasCustomAttributeCodedIndexSize = this.GetReferenceByteSize(5, TableIndex.MethodDef, TableIndex.Field, TableIndex.TypeRef, TableIndex.TypeDef, TableIndex.Param, TableIndex.InterfaceImpl, TableIndex.MemberRef, TableIndex.Module, TableIndex.DeclSecurity, TableIndex.Property, TableIndex.Event, TableIndex.StandAloneSig, TableIndex.ModuleRef, TableIndex.TypeSpec, TableIndex.Assembly, TableIndex.AssemblyRef, TableIndex.File, TableIndex.ExportedType, TableIndex.ManifestResource, TableIndex.GenericParam, TableIndex.GenericParamConstraint, TableIndex.MethodSpec); this.HasFieldMarshalCodedIndexSize = this.GetReferenceByteSize(1, TableIndex.Field, TableIndex.Param); this.HasSemanticsCodedIndexSize = this.GetReferenceByteSize(1, TableIndex.Event, TableIndex.Property); this.ImplementationCodedIndexSize = this.GetReferenceByteSize(2, TableIndex.File, TableIndex.AssemblyRef, TableIndex.ExportedType); this.MemberForwardedCodedIndexSize = this.GetReferenceByteSize(1, TableIndex.Field, TableIndex.MethodDef); this.MemberRefParentCodedIndexSize = this.GetReferenceByteSize(3, TableIndex.TypeDef, TableIndex.TypeRef, TableIndex.ModuleRef, TableIndex.MethodDef, TableIndex.TypeSpec); this.MethodDefIndexSize = this.GetReferenceByteSize(0, TableIndex.MethodDef); this.MethodDefOrRefCodedIndexSize = this.GetReferenceByteSize(1, TableIndex.MethodDef, TableIndex.MemberRef); this.ModuleRefIndexSize = this.GetReferenceByteSize(0, TableIndex.ModuleRef); this.ParameterIndexSize = this.GetReferenceByteSize(0, TableIndex.Param); this.PropertyDefIndexSize = this.GetReferenceByteSize(0, TableIndex.Property); this.ResolutionScopeCodedIndexSize = this.GetReferenceByteSize(2, TableIndex.Module, TableIndex.ModuleRef, TableIndex.AssemblyRef, TableIndex.TypeRef); this.TypeDefIndexSize = this.GetReferenceByteSize(0, TableIndex.TypeDef); this.TypeDefOrRefCodedIndexSize = this.GetReferenceByteSize(2, TableIndex.TypeDef, TableIndex.TypeRef, TableIndex.TypeSpec); this.TypeOrMethodDefCodedIndexSize = this.GetReferenceByteSize(1, TableIndex.TypeDef, TableIndex.MethodDef); this.LocalVariableIndexSize = this.GetReferenceByteSize(0, TableIndex.LocalVariable); this.LocalConstantIndexSize = this.GetReferenceByteSize(0, TableIndex.LocalConstant); this.ImportScopeIndexSize = this.GetReferenceByteSize(0, TableIndex.ImportScope); this.HasCustomDebugInformationSize = this.GetReferenceByteSize(5, TableIndex.MethodDef, TableIndex.Field, TableIndex.TypeRef, TableIndex.TypeDef, TableIndex.Param, TableIndex.InterfaceImpl, TableIndex.MemberRef, TableIndex.Module, TableIndex.DeclSecurity, TableIndex.Property, TableIndex.Event, TableIndex.StandAloneSig, TableIndex.ModuleRef, TableIndex.TypeSpec, TableIndex.Assembly, TableIndex.AssemblyRef, TableIndex.File, TableIndex.ExportedType, TableIndex.ManifestResource, TableIndex.GenericParam, TableIndex.GenericParamConstraint, TableIndex.MethodSpec, TableIndex.Document, TableIndex.LocalScope, TableIndex.LocalVariable, TableIndex.LocalConstant, TableIndex.ImportScope); int size = this.CalculateTableStreamHeaderSize(); size += GetTableSize(TableIndex.Module, 2 + 3 * this.GuidIndexSize + this.StringIndexSize); size += GetTableSize(TableIndex.TypeRef, this.ResolutionScopeCodedIndexSize + this.StringIndexSize + this.StringIndexSize); size += GetTableSize(TableIndex.TypeDef, 4 + this.StringIndexSize + this.StringIndexSize + this.TypeDefOrRefCodedIndexSize + this.FieldDefIndexSize + this.MethodDefIndexSize); Debug.Assert(rowCounts[(int)TableIndex.FieldPtr] == 0); size += GetTableSize(TableIndex.Field, 2 + this.StringIndexSize + this.BlobIndexSize); Debug.Assert(rowCounts[(int)TableIndex.MethodPtr] == 0); size += GetTableSize(TableIndex.MethodDef, 8 + this.StringIndexSize + this.BlobIndexSize + this.ParameterIndexSize); Debug.Assert(rowCounts[(int)TableIndex.ParamPtr] == 0); size += GetTableSize(TableIndex.Param, 4 + this.StringIndexSize); size += GetTableSize(TableIndex.InterfaceImpl, this.TypeDefIndexSize + this.TypeDefOrRefCodedIndexSize); size += GetTableSize(TableIndex.MemberRef, this.MemberRefParentCodedIndexSize + this.StringIndexSize + this.BlobIndexSize); size += GetTableSize(TableIndex.Constant, 2 + this.HasConstantCodedIndexSize + this.BlobIndexSize); size += GetTableSize(TableIndex.CustomAttribute, this.HasCustomAttributeCodedIndexSize + this.CustomAttributeTypeCodedIndexSize + this.BlobIndexSize); size += GetTableSize(TableIndex.FieldMarshal, this.HasFieldMarshalCodedIndexSize + this.BlobIndexSize); size += GetTableSize(TableIndex.DeclSecurity, 2 + this.DeclSecurityCodedIndexSize + this.BlobIndexSize); size += GetTableSize(TableIndex.ClassLayout, 6 + this.TypeDefIndexSize); size += GetTableSize(TableIndex.FieldLayout, 4 + this.FieldDefIndexSize); size += GetTableSize(TableIndex.StandAloneSig, this.BlobIndexSize); size += GetTableSize(TableIndex.EventMap, this.TypeDefIndexSize + this.EventDefIndexSize); Debug.Assert(rowCounts[(int)TableIndex.EventPtr] == 0); size += GetTableSize(TableIndex.Event, 2 + this.StringIndexSize + this.TypeDefOrRefCodedIndexSize); size += GetTableSize(TableIndex.PropertyMap, this.TypeDefIndexSize + this.PropertyDefIndexSize); Debug.Assert(rowCounts[(int)TableIndex.PropertyPtr] == 0); size += GetTableSize(TableIndex.Property, 2 + this.StringIndexSize + this.BlobIndexSize); size += GetTableSize(TableIndex.MethodSemantics, 2 + this.MethodDefIndexSize + this.HasSemanticsCodedIndexSize); size += GetTableSize(TableIndex.MethodImpl, 0 + this.TypeDefIndexSize + this.MethodDefOrRefCodedIndexSize + this.MethodDefOrRefCodedIndexSize); size += GetTableSize(TableIndex.ModuleRef, 0 + this.StringIndexSize); size += GetTableSize(TableIndex.TypeSpec, 0 + this.BlobIndexSize); size += GetTableSize(TableIndex.ImplMap, 2 + this.MemberForwardedCodedIndexSize + this.StringIndexSize + this.ModuleRefIndexSize); size += GetTableSize(TableIndex.FieldRva, 4 + this.FieldDefIndexSize); size += GetTableSize(TableIndex.EncLog, 8); size += GetTableSize(TableIndex.EncMap, 4); size += GetTableSize(TableIndex.Assembly, 16 + this.BlobIndexSize + this.StringIndexSize + this.StringIndexSize); Debug.Assert(rowCounts[(int)TableIndex.AssemblyProcessor] == 0); Debug.Assert(rowCounts[(int)TableIndex.AssemblyOS] == 0); size += GetTableSize(TableIndex.AssemblyRef, 12 + this.BlobIndexSize + this.StringIndexSize + this.StringIndexSize + this.BlobIndexSize); Debug.Assert(rowCounts[(int)TableIndex.AssemblyRefProcessor] == 0); Debug.Assert(rowCounts[(int)TableIndex.AssemblyRefOS] == 0); size += GetTableSize(TableIndex.File, 4 + this.StringIndexSize + this.BlobIndexSize); size += GetTableSize(TableIndex.ExportedType, 8 + this.StringIndexSize + this.StringIndexSize + this.ImplementationCodedIndexSize); size += GetTableSize(TableIndex.ManifestResource, 8 + this.StringIndexSize + this.ImplementationCodedIndexSize); size += GetTableSize(TableIndex.NestedClass, this.TypeDefIndexSize + this.TypeDefIndexSize); size += GetTableSize(TableIndex.GenericParam, 4 + this.TypeOrMethodDefCodedIndexSize + this.StringIndexSize); size += GetTableSize(TableIndex.MethodSpec, this.MethodDefOrRefCodedIndexSize + this.BlobIndexSize); size += GetTableSize(TableIndex.GenericParamConstraint, this.GenericParamIndexSize + this.TypeDefOrRefCodedIndexSize); size += GetTableSize(TableIndex.Document, this.BlobIndexSize + this.GuidIndexSize + this.BlobIndexSize + this.GuidIndexSize); size += GetTableSize(TableIndex.MethodBody, this.BlobIndexSize); size += GetTableSize(TableIndex.LocalScope, this.MethodDefIndexSize + this.ImportScopeIndexSize + this.LocalVariableIndexSize + this.LocalConstantIndexSize + 4 + 4); size += GetTableSize(TableIndex.LocalVariable, 2 + 2 + this.StringIndexSize); size += GetTableSize(TableIndex.LocalConstant, this.StringIndexSize + this.BlobIndexSize); size += GetTableSize(TableIndex.ImportScope, this.ImportScopeIndexSize + this.BlobIndexSize); size += GetTableSize(TableIndex.StateMachineMethod, this.MethodDefIndexSize + this.MethodDefIndexSize); size += GetTableSize(TableIndex.CustomDebugInformation, this.HasCustomDebugInformationSize + this.GuidIndexSize + this.BlobIndexSize); // +1 for terminating 0 byte size = BitArithmeticUtilities.Align(size + 1, StreamAlignment); this.MetadataTableStreamSize = size; size += GetAlignedHeapSize(HeapIndex.String); size += GetAlignedHeapSize(HeapIndex.UserString); size += GetAlignedHeapSize(HeapIndex.Guid); size += GetAlignedHeapSize(HeapIndex.Blob); this.StandalonePdbStreamSize = isStandaloneDebugMetadata ? CalculateStandalonePdbStreamSize() : 0; size += this.StandalonePdbStreamSize; this.MetadataStreamStorageSize = size; }
public void Align(int alignment) { int offset = Offset; WriteBytes(0, BitArithmeticUtilities.Align(offset, alignment) - offset); }
internal void Align(int alignment) { int position = _position; WriteBytes(0, BitArithmeticUtilities.Align(position, alignment) - position); }