// Auto-generated file - DO NOT EDIT!
// Please edit md-schema.xml or tabs-decoder.xsl if you want to make changes.
using System;
namespace Mono.PEToolkit.Metadata {
///
///
///
///
public sealed class TabsDecoder {
private TabsDecoder()
{
}
///
///
///
///
public static MDToken DecodeToken(CodedTokenId id, int data)
{
MDToken res = new MDToken();
int tag;
int rid;
TokenType tok;
switch (id) {
case CodedTokenId.TypeDefOrRef :
tag = data & 0x03;
rid = (int) ((uint) data >> 2);
switch (tag) {
case 0 :
tok = TokenType.TypeDef;
break;
case 1 :
tok = TokenType.TypeRef;
break;
case 2 :
tok = TokenType.TypeSpec;
break;
default :
throw new BadMetaDataException("Invalid coded token for TypeDefOrRef, unknown table tag - " + tag);
}
res = new MDToken(tok, rid);
break;
case CodedTokenId.HasConstant :
tag = data & 0x03;
rid = (int) ((uint) data >> 2);
switch (tag) {
case 0 :
tok = TokenType.FieldDef;
break;
case 1 :
tok = TokenType.ParamDef;
break;
case 2 :
tok = TokenType.Property;
break;
default :
throw new BadMetaDataException("Invalid coded token for HasConstant, unknown table tag - " + tag);
}
res = new MDToken(tok, rid);
break;
case CodedTokenId.HasCustomAttribute :
tag = data & 0x1F;
rid = (int) ((uint) data >> 5);
switch (tag) {
case 0 :
tok = TokenType.MethodDef;
break;
case 1 :
tok = TokenType.FieldDef;
break;
case 2 :
tok = TokenType.TypeRef;
break;
case 3 :
tok = TokenType.TypeDef;
break;
case 4 :
tok = TokenType.ParamDef;
break;
case 5 :
tok = TokenType.InterfaceImpl;
break;
case 6 :
tok = TokenType.MemberRef;
break;
case 7 :
tok = TokenType.Module;
break;
case 8 :
tok = TokenType.Permission;
break;
case 9 :
tok = TokenType.Property;
break;
case 10 :
tok = TokenType.Event;
break;
case 11 :
tok = TokenType.Signature;
break;
case 12 :
tok = TokenType.ModuleRef;
break;
case 13 :
tok = TokenType.TypeSpec;
break;
case 14 :
tok = TokenType.Assembly;
break;
case 15 :
tok = TokenType.AssemblyRef;
break;
case 16 :
tok = TokenType.File;
break;
case 17 :
tok = TokenType.ExportedType;
break;
case 18 :
tok = TokenType.ManifestResource;
break;
default :
throw new BadMetaDataException("Invalid coded token for HasCustomAttribute, unknown table tag - " + tag);
}
res = new MDToken(tok, rid);
break;
case CodedTokenId.HasFieldMarshal :
tag = data & 0x01;
rid = (int) ((uint) data >> 1);
switch (tag) {
case 0 :
tok = TokenType.FieldDef;
break;
case 1 :
tok = TokenType.ParamDef;
break;
default :
throw new BadMetaDataException("Invalid coded token for HasFieldMarshal, unknown table tag - " + tag);
}
res = new MDToken(tok, rid);
break;
case CodedTokenId.HasDeclSecurity :
tag = data & 0x03;
rid = (int) ((uint) data >> 2);
switch (tag) {
case 0 :
tok = TokenType.TypeDef;
break;
case 1 :
tok = TokenType.MethodDef;
break;
case 2 :
tok = TokenType.Assembly;
break;
default :
throw new BadMetaDataException("Invalid coded token for HasDeclSecurity, unknown table tag - " + tag);
}
res = new MDToken(tok, rid);
break;
case CodedTokenId.MemberRefParent :
tag = data & 0x07;
rid = (int) ((uint) data >> 3);
switch (tag) {
case 0 :
tok = TokenType.TypeDef;
break;
case 1 :
tok = TokenType.TypeRef;
break;
case 2 :
tok = TokenType.ModuleRef;
break;
case 3 :
tok = TokenType.MethodDef;
break;
case 4 :
tok = TokenType.TypeSpec;
break;
default :
throw new BadMetaDataException("Invalid coded token for MemberRefParent, unknown table tag - " + tag);
}
res = new MDToken(tok, rid);
break;
case CodedTokenId.HasSemantics :
tag = data & 0x01;
rid = (int) ((uint) data >> 1);
switch (tag) {
case 0 :
tok = TokenType.Event;
break;
case 1 :
tok = TokenType.Property;
break;
default :
throw new BadMetaDataException("Invalid coded token for HasSemantics, unknown table tag - " + tag);
}
res = new MDToken(tok, rid);
break;
case CodedTokenId.MethodDefOrRef :
tag = data & 0x01;
rid = (int) ((uint) data >> 1);
switch (tag) {
case 0 :
tok = TokenType.MethodDef;
break;
case 1 :
tok = TokenType.MemberRef;
break;
default :
throw new BadMetaDataException("Invalid coded token for MethodDefOrRef, unknown table tag - " + tag);
}
res = new MDToken(tok, rid);
break;
case CodedTokenId.MemberForwarded :
tag = data & 0x01;
rid = (int) ((uint) data >> 1);
switch (tag) {
case 0 :
tok = TokenType.FieldDef;
break;
case 1 :
tok = TokenType.MethodDef;
break;
default :
throw new BadMetaDataException("Invalid coded token for MemberForwarded, unknown table tag - " + tag);
}
res = new MDToken(tok, rid);
break;
case CodedTokenId.Implementation :
tag = data & 0x03;
rid = (int) ((uint) data >> 2);
switch (tag) {
case 0 :
tok = TokenType.File;
break;
case 1 :
tok = TokenType.AssemblyRef;
break;
case 2 :
tok = TokenType.ExportedType;
break;
default :
throw new BadMetaDataException("Invalid coded token for Implementation, unknown table tag - " + tag);
}
res = new MDToken(tok, rid);
break;
case CodedTokenId.CustomAttributeType :
tag = data & 0x07;
rid = (int) ((uint) data >> 3);
switch (tag) {
case 0 :
tok = TokenType.TypeRef;
break;
case 1 :
tok = TokenType.TypeDef;
break;
case 2 :
tok = TokenType.MethodDef;
break;
case 3 :
tok = TokenType.MemberRef;
break;
case 4 :
tok = TokenType.String;
break;
default :
throw new BadMetaDataException("Invalid coded token for CustomAttributeType, unknown table tag - " + tag);
}
res = new MDToken(tok, rid);
break;
case CodedTokenId.ResolutionScope :
tag = data & 0x03;
rid = (int) ((uint) data >> 2);
switch (tag) {
case 0 :
tok = TokenType.Module;
break;
case 1 :
tok = TokenType.ModuleRef;
break;
case 2 :
tok = TokenType.AssemblyRef;
break;
case 3 :
tok = TokenType.TypeRef;
break;
default :
throw new BadMetaDataException("Invalid coded token for ResolutionScope, unknown table tag - " + tag);
}
res = new MDToken(tok, rid);
break;
default:
break;
}
return res;
}
private static int GetCodedIndexSize(TablesHeap heap, CodedTokenId id, int [] rows)
{
int res = 0;
switch (id) {
case CodedTokenId.TypeDefOrRef :
res = MDUtils.Max(rows [(int) TableId.TypeDef], rows [(int) TableId.TypeRef], rows [(int) TableId.TypeSpec]);
res = res < (1 << (16 - 2)) ? 2 : 4;
break;
case CodedTokenId.HasConstant :
res = MDUtils.Max(rows [(int) TableId.Field], rows [(int) TableId.Param], rows [(int) TableId.Property]);
res = res < (1 << (16 - 2)) ? 2 : 4;
break;
case CodedTokenId.HasCustomAttribute :
res = MDUtils.Max(rows [(int) TableId.Method], rows [(int) TableId.Field], rows [(int) TableId.TypeRef], rows [(int) TableId.TypeDef], rows [(int) TableId.Param], rows [(int) TableId.InterfaceImpl], rows [(int) TableId.MemberRef], rows [(int) TableId.Module], rows [(int) TableId.DeclSecurity], rows [(int) TableId.Property], rows [(int) TableId.Event], rows [(int) TableId.StandAloneSig], rows [(int) TableId.ModuleRef], rows [(int) TableId.TypeSpec], rows [(int) TableId.Assembly], rows [(int) TableId.AssemblyRef], rows [(int) TableId.File], rows [(int) TableId.ExportedType], rows [(int) TableId.ManifestResource]);
res = res < (1 << (16 - 5)) ? 2 : 4;
break;
case CodedTokenId.HasFieldMarshal :
res = MDUtils.Max(rows [(int) TableId.Field], rows [(int) TableId.Param]);
res = res < (1 << (16 - 1)) ? 2 : 4;
break;
case CodedTokenId.HasDeclSecurity :
res = MDUtils.Max(rows [(int) TableId.TypeDef], rows [(int) TableId.Method], rows [(int) TableId.Assembly]);
res = res < (1 << (16 - 2)) ? 2 : 4;
break;
case CodedTokenId.MemberRefParent :
res = MDUtils.Max(rows [(int) TableId.TypeDef], rows [(int) TableId.TypeRef], rows [(int) TableId.ModuleRef], rows [(int) TableId.Method], rows [(int) TableId.TypeSpec]);
res = res < (1 << (16 - 3)) ? 2 : 4;
break;
case CodedTokenId.HasSemantics :
res = MDUtils.Max(rows [(int) TableId.Event], rows [(int) TableId.Property]);
res = res < (1 << (16 - 1)) ? 2 : 4;
break;
case CodedTokenId.MethodDefOrRef :
res = MDUtils.Max(rows [(int) TableId.Method], rows [(int) TableId.MemberRef]);
res = res < (1 << (16 - 1)) ? 2 : 4;
break;
case CodedTokenId.MemberForwarded :
res = MDUtils.Max(rows [(int) TableId.Field], rows [(int) TableId.Method]);
res = res < (1 << (16 - 1)) ? 2 : 4;
break;
case CodedTokenId.Implementation :
res = MDUtils.Max(rows [(int) TableId.File], rows [(int) TableId.AssemblyRef], rows [(int) TableId.ExportedType]);
res = res < (1 << (16 - 2)) ? 2 : 4;
break;
case CodedTokenId.CustomAttributeType :
res = MDUtils.Max(rows [(int) TableId.TypeRef], rows [(int) TableId.TypeDef], rows [(int) TableId.Method], rows [(int) TableId.MemberRef], (heap.StringsIndexSize > 2 ? 1 << 17 : 1));
res = res < (1 << (16 - 3)) ? 2 : 4;
break;
case CodedTokenId.ResolutionScope :
res = MDUtils.Max(rows [(int) TableId.Module], rows [(int) TableId.ModuleRef], rows [(int) TableId.AssemblyRef], rows [(int) TableId.TypeRef]);
res = res < (1 << (16 - 2)) ? 2 : 4;
break;
default:
break;
}
return res;
}
private static int GetIndexSize(TableId tab, int [] rows)
{
// Index is 2 bytes wide if table has less than 2^16 rows
// otherwise it's 4 bytes wide.
return ((uint) rows [(int) tab]) < (1 << 16) ? 2 : 4;
}
private static void AllocBuff(ref byte [] buff, int size)
{
if (buff == null || buff.Length < size) {
buff = new byte [(size + 4) & ~3];
}
Array.Clear(buff, 0, size);
}
///
///
unsafe public static int DecodePhysicalTables(TablesHeap heap, byte [] data, int offs, int [] rows)
{
int rowSize; // expanded row size (all indices are dwords)
int fldSize; // physical field size
int dest;
int nRows;
byte [] buff = null;
int si = heap.StringsIndexSize;
int gi = heap.GUIDIndexSize;
int bi = heap.BlobIndexSize;
if (heap.HasModule) {
rowSize = sizeof (ushort) + 4 + 4 + 4 + 4;
nRows = rows [(int) TableId.Module];
AllocBuff(ref buff, rowSize * nRows);
dest = 0;
MDTable tab = new ModuleTable(heap);
for (int i = nRows; --i >= 0;) {
// Generation, ushort
fldSize = sizeof (ushort);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += sizeof (ushort);
// Name, index(#Strings)
fldSize = si;
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
// Mvid, index(#GUID)
fldSize = gi;
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
// EncId, index(#GUID)
fldSize = gi;
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
// EncBaseId, index(#GUID)
fldSize = gi;
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
}
tab.FromRawData(buff, 0, nRows);
}
if (heap.HasTypeRef) {
rowSize = 4 + 4 + 4;
nRows = rows [(int) TableId.TypeRef];
AllocBuff(ref buff, rowSize * nRows);
dest = 0;
MDTable tab = new TypeRefTable(heap);
for (int i = nRows; --i >= 0;) {
// ResolutionScope, coded-index(ResolutionScope)
fldSize = GetCodedIndexSize(heap, CodedTokenId.ResolutionScope, rows);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
// Name, index(#Strings)
fldSize = si;
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
// Namespace, index(#Strings)
fldSize = si;
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
}
tab.FromRawData(buff, 0, nRows);
}
if (heap.HasTypeDef) {
rowSize = sizeof (uint) + 4 + 4 + 4 + 4 + 4;
nRows = rows [(int) TableId.TypeDef];
AllocBuff(ref buff, rowSize * nRows);
dest = 0;
MDTable tab = new TypeDefTable(heap);
for (int i = nRows; --i >= 0;) {
// Flags, uint
fldSize = sizeof (uint);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += sizeof (uint);
// Name, index(#Strings)
fldSize = si;
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
// Namespace, index(#Strings)
fldSize = si;
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
// Extends, coded-index(TypeDefOrRef)
fldSize = GetCodedIndexSize(heap, CodedTokenId.TypeDefOrRef, rows);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
// FieldList, index(Field)
fldSize = GetIndexSize(TableId.Field, rows);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
// MethodList, index(Method)
fldSize = GetIndexSize(TableId.Method, rows);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
}
tab.FromRawData(buff, 0, nRows);
}
if (heap.HasFieldPtr) {
rowSize = 4;
nRows = rows [(int) TableId.FieldPtr];
AllocBuff(ref buff, rowSize * nRows);
dest = 0;
MDTable tab = new FieldPtrTable(heap);
for (int i = nRows; --i >= 0;) {
// Field, index(Field)
fldSize = GetIndexSize(TableId.Field, rows);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
}
tab.FromRawData(buff, 0, nRows);
}
if (heap.HasField) {
rowSize = sizeof (ushort) + 4 + 4;
nRows = rows [(int) TableId.Field];
AllocBuff(ref buff, rowSize * nRows);
dest = 0;
MDTable tab = new FieldTable(heap);
for (int i = nRows; --i >= 0;) {
// Flags, ushort
fldSize = sizeof (ushort);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += sizeof (ushort);
// Name, index(#Strings)
fldSize = si;
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
// Signature, index(#Blob)
fldSize = bi;
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
}
tab.FromRawData(buff, 0, nRows);
}
if (heap.HasMethodPtr) {
rowSize = 4;
nRows = rows [(int) TableId.MethodPtr];
AllocBuff(ref buff, rowSize * nRows);
dest = 0;
MDTable tab = new MethodPtrTable(heap);
for (int i = nRows; --i >= 0;) {
// Method, index(Method)
fldSize = GetIndexSize(TableId.Method, rows);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
}
tab.FromRawData(buff, 0, nRows);
}
if (heap.HasMethod) {
rowSize = RVA.Size + sizeof (ushort) + sizeof (ushort) + 4 + 4 + 4;
nRows = rows [(int) TableId.Method];
AllocBuff(ref buff, rowSize * nRows);
dest = 0;
MDTable tab = new MethodTable(heap);
for (int i = nRows; --i >= 0;) {
// RVA, RVA
fldSize = RVA.Size;
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += RVA.Size;
// ImplFlags, ushort
fldSize = sizeof (ushort);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += sizeof (ushort);
// Flags, ushort
fldSize = sizeof (ushort);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += sizeof (ushort);
// Name, index(#Strings)
fldSize = si;
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
// Signature, index(#Blob)
fldSize = bi;
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
// ParamList, index(Param)
fldSize = GetIndexSize(TableId.Param, rows);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
}
tab.FromRawData(buff, 0, nRows);
}
if (heap.HasParamPtr) {
rowSize = 4;
nRows = rows [(int) TableId.ParamPtr];
AllocBuff(ref buff, rowSize * nRows);
dest = 0;
MDTable tab = new ParamPtrTable(heap);
for (int i = nRows; --i >= 0;) {
// Param, index(Param)
fldSize = GetIndexSize(TableId.Param, rows);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
}
tab.FromRawData(buff, 0, nRows);
}
if (heap.HasParam) {
rowSize = sizeof (ushort) + sizeof (ushort) + 4;
nRows = rows [(int) TableId.Param];
AllocBuff(ref buff, rowSize * nRows);
dest = 0;
MDTable tab = new ParamTable(heap);
for (int i = nRows; --i >= 0;) {
// Flags, ushort
fldSize = sizeof (ushort);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += sizeof (ushort);
// Sequence, ushort
fldSize = sizeof (ushort);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += sizeof (ushort);
// Name, index(#Strings)
fldSize = si;
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
}
tab.FromRawData(buff, 0, nRows);
}
if (heap.HasInterfaceImpl) {
rowSize = 4 + 4;
nRows = rows [(int) TableId.InterfaceImpl];
AllocBuff(ref buff, rowSize * nRows);
dest = 0;
MDTable tab = new InterfaceImplTable(heap);
for (int i = nRows; --i >= 0;) {
// Class, index(TypeDef)
fldSize = GetIndexSize(TableId.TypeDef, rows);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
// Interface, coded-index(TypeDefOrRef)
fldSize = GetCodedIndexSize(heap, CodedTokenId.TypeDefOrRef, rows);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
}
tab.FromRawData(buff, 0, nRows);
}
if (heap.HasMemberRef) {
rowSize = 4 + 4 + 4;
nRows = rows [(int) TableId.MemberRef];
AllocBuff(ref buff, rowSize * nRows);
dest = 0;
MDTable tab = new MemberRefTable(heap);
for (int i = nRows; --i >= 0;) {
// Class, coded-index(MemberRefParent)
fldSize = GetCodedIndexSize(heap, CodedTokenId.MemberRefParent, rows);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
// Name, index(#Strings)
fldSize = si;
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
// Signature, index(#Blob)
fldSize = bi;
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
}
tab.FromRawData(buff, 0, nRows);
}
if (heap.HasConstant) {
rowSize = sizeof (short) + 4 + 4;
nRows = rows [(int) TableId.Constant];
AllocBuff(ref buff, rowSize * nRows);
dest = 0;
MDTable tab = new ConstantTable(heap);
for (int i = nRows; --i >= 0;) {
// Type, short
fldSize = sizeof (short);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += sizeof (short);
// Parent, coded-index(HasConstant)
fldSize = GetCodedIndexSize(heap, CodedTokenId.HasConstant, rows);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
// Value, index(#Blob)
fldSize = bi;
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
}
tab.FromRawData(buff, 0, nRows);
}
if (heap.HasCustomAttribute) {
rowSize = 4 + 4 + 4;
nRows = rows [(int) TableId.CustomAttribute];
AllocBuff(ref buff, rowSize * nRows);
dest = 0;
MDTable tab = new CustomAttributeTable(heap);
for (int i = nRows; --i >= 0;) {
// Parent, coded-index(HasCustomAttribute)
fldSize = GetCodedIndexSize(heap, CodedTokenId.HasCustomAttribute, rows);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
// Type, coded-index(CustomAttributeType)
fldSize = GetCodedIndexSize(heap, CodedTokenId.CustomAttributeType, rows);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
// Value, index(#Blob)
fldSize = bi;
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
}
tab.FromRawData(buff, 0, nRows);
}
if (heap.HasFieldMarshal) {
rowSize = 4 + 4;
nRows = rows [(int) TableId.FieldMarshal];
AllocBuff(ref buff, rowSize * nRows);
dest = 0;
MDTable tab = new FieldMarshalTable(heap);
for (int i = nRows; --i >= 0;) {
// Parent, coded-index(HasFieldMarshal)
fldSize = GetCodedIndexSize(heap, CodedTokenId.HasFieldMarshal, rows);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
// NativeType, index(#Blob)
fldSize = bi;
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
}
tab.FromRawData(buff, 0, nRows);
}
if (heap.HasDeclSecurity) {
rowSize = sizeof (short) + 4 + 4;
nRows = rows [(int) TableId.DeclSecurity];
AllocBuff(ref buff, rowSize * nRows);
dest = 0;
MDTable tab = new DeclSecurityTable(heap);
for (int i = nRows; --i >= 0;) {
// Action, short
fldSize = sizeof (short);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += sizeof (short);
// Parent, coded-index(HasDeclSecurity)
fldSize = GetCodedIndexSize(heap, CodedTokenId.HasDeclSecurity, rows);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
// PermissionSet, index(#Blob)
fldSize = bi;
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
}
tab.FromRawData(buff, 0, nRows);
}
if (heap.HasClassLayout) {
rowSize = sizeof (short) + sizeof (int) + 4;
nRows = rows [(int) TableId.ClassLayout];
AllocBuff(ref buff, rowSize * nRows);
dest = 0;
MDTable tab = new ClassLayoutTable(heap);
for (int i = nRows; --i >= 0;) {
// PackingSize, short
fldSize = sizeof (short);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += sizeof (short);
// ClassSize, int
fldSize = sizeof (int);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += sizeof (int);
// Parent, index(TypeDef)
fldSize = GetIndexSize(TableId.TypeDef, rows);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
}
tab.FromRawData(buff, 0, nRows);
}
if (heap.HasFieldLayout) {
rowSize = sizeof (int) + 4;
nRows = rows [(int) TableId.FieldLayout];
AllocBuff(ref buff, rowSize * nRows);
dest = 0;
MDTable tab = new FieldLayoutTable(heap);
for (int i = nRows; --i >= 0;) {
// Offset, int
fldSize = sizeof (int);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += sizeof (int);
// Field, index(Field)
fldSize = GetIndexSize(TableId.Field, rows);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
}
tab.FromRawData(buff, 0, nRows);
}
if (heap.HasStandAloneSig) {
rowSize = 4;
nRows = rows [(int) TableId.StandAloneSig];
AllocBuff(ref buff, rowSize * nRows);
dest = 0;
MDTable tab = new StandAloneSigTable(heap);
for (int i = nRows; --i >= 0;) {
// Signature, index(#Blob)
fldSize = bi;
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
}
tab.FromRawData(buff, 0, nRows);
}
if (heap.HasEventMap) {
rowSize = 4 + 4;
nRows = rows [(int) TableId.EventMap];
AllocBuff(ref buff, rowSize * nRows);
dest = 0;
MDTable tab = new EventMapTable(heap);
for (int i = nRows; --i >= 0;) {
// Parent, index(TypeDef)
fldSize = GetIndexSize(TableId.TypeDef, rows);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
// EventList, index(Event)
fldSize = GetIndexSize(TableId.Event, rows);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
}
tab.FromRawData(buff, 0, nRows);
}
if (heap.HasEventPtr) {
rowSize = 4;
nRows = rows [(int) TableId.EventPtr];
AllocBuff(ref buff, rowSize * nRows);
dest = 0;
MDTable tab = new EventPtrTable(heap);
for (int i = nRows; --i >= 0;) {
// Event, index(Event)
fldSize = GetIndexSize(TableId.Event, rows);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
}
tab.FromRawData(buff, 0, nRows);
}
if (heap.HasEvent) {
rowSize = sizeof (short) + 4 + 4;
nRows = rows [(int) TableId.Event];
AllocBuff(ref buff, rowSize * nRows);
dest = 0;
MDTable tab = new EventTable(heap);
for (int i = nRows; --i >= 0;) {
// EventFlags, short
fldSize = sizeof (short);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += sizeof (short);
// Name, index(#Strings)
fldSize = si;
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
// EventType, coded-index(TypeDefOrRef)
fldSize = GetCodedIndexSize(heap, CodedTokenId.TypeDefOrRef, rows);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
}
tab.FromRawData(buff, 0, nRows);
}
if (heap.HasPropertyMap) {
rowSize = 4 + 4;
nRows = rows [(int) TableId.PropertyMap];
AllocBuff(ref buff, rowSize * nRows);
dest = 0;
MDTable tab = new PropertyMapTable(heap);
for (int i = nRows; --i >= 0;) {
// Parent, index(TypeDef)
fldSize = GetIndexSize(TableId.TypeDef, rows);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
// PropertyList, index(Property)
fldSize = GetIndexSize(TableId.Property, rows);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
}
tab.FromRawData(buff, 0, nRows);
}
if (heap.HasPropertyPtr) {
rowSize = 4;
nRows = rows [(int) TableId.PropertyPtr];
AllocBuff(ref buff, rowSize * nRows);
dest = 0;
MDTable tab = new PropertyPtrTable(heap);
for (int i = nRows; --i >= 0;) {
// Property, index(Property)
fldSize = GetIndexSize(TableId.Property, rows);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
}
tab.FromRawData(buff, 0, nRows);
}
if (heap.HasProperty) {
rowSize = sizeof (ushort) + 4 + 4;
nRows = rows [(int) TableId.Property];
AllocBuff(ref buff, rowSize * nRows);
dest = 0;
MDTable tab = new PropertyTable(heap);
for (int i = nRows; --i >= 0;) {
// Flags, ushort
fldSize = sizeof (ushort);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += sizeof (ushort);
// Name, index(#Strings)
fldSize = si;
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
// Type, index(#Blob)
fldSize = bi;
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
}
tab.FromRawData(buff, 0, nRows);
}
if (heap.HasMethodSemantics) {
rowSize = sizeof (ushort) + 4 + 4;
nRows = rows [(int) TableId.MethodSemantics];
AllocBuff(ref buff, rowSize * nRows);
dest = 0;
MDTable tab = new MethodSemanticsTable(heap);
for (int i = nRows; --i >= 0;) {
// Semantics, ushort
fldSize = sizeof (ushort);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += sizeof (ushort);
// Method, index(Method)
fldSize = GetIndexSize(TableId.Method, rows);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
// Association, coded-index(HasSemantics)
fldSize = GetCodedIndexSize(heap, CodedTokenId.HasSemantics, rows);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
}
tab.FromRawData(buff, 0, nRows);
}
if (heap.HasMethodImpl) {
rowSize = 4 + 4 + 4;
nRows = rows [(int) TableId.MethodImpl];
AllocBuff(ref buff, rowSize * nRows);
dest = 0;
MDTable tab = new MethodImplTable(heap);
for (int i = nRows; --i >= 0;) {
// Class, index(TypeDef)
fldSize = GetIndexSize(TableId.TypeDef, rows);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
// MethodBody, coded-index(MethodDefOrRef)
fldSize = GetCodedIndexSize(heap, CodedTokenId.MethodDefOrRef, rows);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
// MethodDeclaration, coded-index(MethodDefOrRef)
fldSize = GetCodedIndexSize(heap, CodedTokenId.MethodDefOrRef, rows);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
}
tab.FromRawData(buff, 0, nRows);
}
if (heap.HasModuleRef) {
rowSize = 4;
nRows = rows [(int) TableId.ModuleRef];
AllocBuff(ref buff, rowSize * nRows);
dest = 0;
MDTable tab = new ModuleRefTable(heap);
for (int i = nRows; --i >= 0;) {
// Name, index(#Strings)
fldSize = si;
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
}
tab.FromRawData(buff, 0, nRows);
}
if (heap.HasTypeSpec) {
rowSize = 4;
nRows = rows [(int) TableId.TypeSpec];
AllocBuff(ref buff, rowSize * nRows);
dest = 0;
MDTable tab = new TypeSpecTable(heap);
for (int i = nRows; --i >= 0;) {
// Signature, index(#Blob)
fldSize = bi;
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
}
tab.FromRawData(buff, 0, nRows);
}
if (heap.HasImplMap) {
rowSize = sizeof (ushort) + 4 + 4 + 4;
nRows = rows [(int) TableId.ImplMap];
AllocBuff(ref buff, rowSize * nRows);
dest = 0;
MDTable tab = new ImplMapTable(heap);
for (int i = nRows; --i >= 0;) {
// MappingFlags, ushort
fldSize = sizeof (ushort);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += sizeof (ushort);
// MemberForwarded, coded-index(MemberForwarded)
fldSize = GetCodedIndexSize(heap, CodedTokenId.MemberForwarded, rows);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
// ImportName, index(#Strings)
fldSize = si;
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
// ImportScope, index(ModuleRef)
fldSize = GetIndexSize(TableId.ModuleRef, rows);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
}
tab.FromRawData(buff, 0, nRows);
}
if (heap.HasFieldRVA) {
rowSize = RVA.Size + 4;
nRows = rows [(int) TableId.FieldRVA];
AllocBuff(ref buff, rowSize * nRows);
dest = 0;
MDTable tab = new FieldRVATable(heap);
for (int i = nRows; --i >= 0;) {
// RVA, RVA
fldSize = RVA.Size;
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += RVA.Size;
// Field, index(Field)
fldSize = GetIndexSize(TableId.Field, rows);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
}
tab.FromRawData(buff, 0, nRows);
}
if (heap.HasENCLog) {
rowSize = sizeof (uint) + sizeof (uint);
nRows = rows [(int) TableId.ENCLog];
AllocBuff(ref buff, rowSize * nRows);
dest = 0;
MDTable tab = new ENCLogTable(heap);
for (int i = nRows; --i >= 0;) {
// Token, uint
fldSize = sizeof (uint);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += sizeof (uint);
// FuncCode, uint
fldSize = sizeof (uint);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += sizeof (uint);
}
tab.FromRawData(buff, 0, nRows);
}
if (heap.HasENCMap) {
rowSize = sizeof (uint);
nRows = rows [(int) TableId.ENCMap];
AllocBuff(ref buff, rowSize * nRows);
dest = 0;
MDTable tab = new ENCMapTable(heap);
for (int i = nRows; --i >= 0;) {
// Token, uint
fldSize = sizeof (uint);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += sizeof (uint);
}
tab.FromRawData(buff, 0, nRows);
}
if (heap.HasAssembly) {
rowSize = sizeof (int) + sizeof (short) + sizeof (short) + sizeof (short) + sizeof (short) + sizeof (uint) + 4 + 4 + 4;
nRows = rows [(int) TableId.Assembly];
AllocBuff(ref buff, rowSize * nRows);
dest = 0;
MDTable tab = new AssemblyTable(heap);
for (int i = nRows; --i >= 0;) {
// HashAlgId, int
fldSize = sizeof (int);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += sizeof (int);
// MajorVersion, short
fldSize = sizeof (short);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += sizeof (short);
// MinorVersion, short
fldSize = sizeof (short);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += sizeof (short);
// BuildNumber, short
fldSize = sizeof (short);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += sizeof (short);
// RevisionNumber, short
fldSize = sizeof (short);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += sizeof (short);
// Flags, uint
fldSize = sizeof (uint);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += sizeof (uint);
// PublicKey, index(#Blob)
fldSize = bi;
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
// Name, index(#Strings)
fldSize = si;
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
// Culture, index(#Strings)
fldSize = si;
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
}
tab.FromRawData(buff, 0, nRows);
}
if (heap.HasAssemblyProcessor) {
rowSize = sizeof (int);
nRows = rows [(int) TableId.AssemblyProcessor];
AllocBuff(ref buff, rowSize * nRows);
dest = 0;
MDTable tab = new AssemblyProcessorTable(heap);
for (int i = nRows; --i >= 0;) {
// Processor, int
fldSize = sizeof (int);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += sizeof (int);
}
tab.FromRawData(buff, 0, nRows);
}
if (heap.HasAssemblyOS) {
rowSize = sizeof (int) + sizeof (int) + sizeof (int);
nRows = rows [(int) TableId.AssemblyOS];
AllocBuff(ref buff, rowSize * nRows);
dest = 0;
MDTable tab = new AssemblyOSTable(heap);
for (int i = nRows; --i >= 0;) {
// OSPlatformID, int
fldSize = sizeof (int);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += sizeof (int);
// OSMajorVersion, int
fldSize = sizeof (int);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += sizeof (int);
// OSMinorVersion, int
fldSize = sizeof (int);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += sizeof (int);
}
tab.FromRawData(buff, 0, nRows);
}
if (heap.HasAssemblyRef) {
rowSize = sizeof (short) + sizeof (short) + sizeof (short) + sizeof (short) + sizeof (uint) + 4 + 4 + 4 + 4;
nRows = rows [(int) TableId.AssemblyRef];
AllocBuff(ref buff, rowSize * nRows);
dest = 0;
MDTable tab = new AssemblyRefTable(heap);
for (int i = nRows; --i >= 0;) {
// MajorVersion, short
fldSize = sizeof (short);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += sizeof (short);
// MinorVersion, short
fldSize = sizeof (short);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += sizeof (short);
// BuildNumber, short
fldSize = sizeof (short);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += sizeof (short);
// RevisionNumber, short
fldSize = sizeof (short);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += sizeof (short);
// Flags, uint
fldSize = sizeof (uint);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += sizeof (uint);
// PublicKeyOrToken, index(#Blob)
fldSize = bi;
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
// Name, index(#Strings)
fldSize = si;
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
// Culture, index(#Strings)
fldSize = si;
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
// HashValue, index(#Blob)
fldSize = bi;
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
}
tab.FromRawData(buff, 0, nRows);
}
if (heap.HasAssemblyRefProcessor) {
rowSize = sizeof (int) + 4;
nRows = rows [(int) TableId.AssemblyRefProcessor];
AllocBuff(ref buff, rowSize * nRows);
dest = 0;
MDTable tab = new AssemblyRefProcessorTable(heap);
for (int i = nRows; --i >= 0;) {
// Processor, int
fldSize = sizeof (int);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += sizeof (int);
// AssemblyRef, index(AssemblyRef)
fldSize = GetIndexSize(TableId.AssemblyRef, rows);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
}
tab.FromRawData(buff, 0, nRows);
}
if (heap.HasAssemblyRefOS) {
rowSize = sizeof (int) + sizeof (int) + sizeof (int) + 4;
nRows = rows [(int) TableId.AssemblyRefOS];
AllocBuff(ref buff, rowSize * nRows);
dest = 0;
MDTable tab = new AssemblyRefOSTable(heap);
for (int i = nRows; --i >= 0;) {
// OSPlatformID, int
fldSize = sizeof (int);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += sizeof (int);
// OSMajorVersion, int
fldSize = sizeof (int);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += sizeof (int);
// OSMinorVersion, int
fldSize = sizeof (int);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += sizeof (int);
// AssemblyRef, index(AssemblyRef)
fldSize = GetIndexSize(TableId.AssemblyRef, rows);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
}
tab.FromRawData(buff, 0, nRows);
}
if (heap.HasFile) {
rowSize = sizeof (uint) + 4 + 4;
nRows = rows [(int) TableId.File];
AllocBuff(ref buff, rowSize * nRows);
dest = 0;
MDTable tab = new FileTable(heap);
for (int i = nRows; --i >= 0;) {
// Flags, uint
fldSize = sizeof (uint);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += sizeof (uint);
// Name, index(#Strings)
fldSize = si;
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
// HashValue, index(#Blob)
fldSize = bi;
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
}
tab.FromRawData(buff, 0, nRows);
}
if (heap.HasExportedType) {
rowSize = sizeof (uint) + 4 + 4 + 4 + 4;
nRows = rows [(int) TableId.ExportedType];
AllocBuff(ref buff, rowSize * nRows);
dest = 0;
MDTable tab = new ExportedTypeTable(heap);
for (int i = nRows; --i >= 0;) {
// Flags, uint
fldSize = sizeof (uint);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += sizeof (uint);
// TypeDefId, index(TypeDef)
fldSize = GetIndexSize(TableId.TypeDef, rows);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
// TypeName, index(#Strings)
fldSize = si;
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
// TypeNamespace, index(#Strings)
fldSize = si;
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
// Implementation, coded-index(Implementation)
fldSize = GetCodedIndexSize(heap, CodedTokenId.Implementation, rows);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
}
tab.FromRawData(buff, 0, nRows);
}
if (heap.HasManifestResource) {
rowSize = sizeof (int) + sizeof (uint) + 4 + 4;
nRows = rows [(int) TableId.ManifestResource];
AllocBuff(ref buff, rowSize * nRows);
dest = 0;
MDTable tab = new ManifestResourceTable(heap);
for (int i = nRows; --i >= 0;) {
// Offset, int
fldSize = sizeof (int);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += sizeof (int);
// Flags, uint
fldSize = sizeof (uint);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += sizeof (uint);
// Name, index(#Strings)
fldSize = si;
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
// Implementation, coded-index(Implementation)
fldSize = GetCodedIndexSize(heap, CodedTokenId.Implementation, rows);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
}
tab.FromRawData(buff, 0, nRows);
}
if (heap.HasNestedClass) {
rowSize = 4 + 4;
nRows = rows [(int) TableId.NestedClass];
AllocBuff(ref buff, rowSize * nRows);
dest = 0;
MDTable tab = new NestedClassTable(heap);
for (int i = nRows; --i >= 0;) {
// NestedClass, index(TypeDef)
fldSize = GetIndexSize(TableId.TypeDef, rows);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
// EnclosingClass, index(TypeDef)
fldSize = GetIndexSize(TableId.TypeDef, rows);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
}
tab.FromRawData(buff, 0, nRows);
}
if (heap.HasTypeTyPar) {
rowSize = sizeof (ushort) + 4 + 4 + 4;
nRows = rows [(int) TableId.TypeTyPar];
AllocBuff(ref buff, rowSize * nRows);
dest = 0;
MDTable tab = new TypeTyParTable(heap);
for (int i = nRows; --i >= 0;) {
// Number, ushort
fldSize = sizeof (ushort);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += sizeof (ushort);
// Class, index(TypeDef)
fldSize = GetIndexSize(TableId.TypeDef, rows);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
// Bound, coded-index(TypeDefOrRef)
fldSize = GetCodedIndexSize(heap, CodedTokenId.TypeDefOrRef, rows);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
// Name, index(#Strings)
fldSize = si;
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
}
tab.FromRawData(buff, 0, nRows);
}
if (heap.HasMethodTyPar) {
rowSize = sizeof (ushort) + 4 + 4 + 4;
nRows = rows [(int) TableId.MethodTyPar];
AllocBuff(ref buff, rowSize * nRows);
dest = 0;
MDTable tab = new MethodTyParTable(heap);
for (int i = nRows; --i >= 0;) {
// Number, ushort
fldSize = sizeof (ushort);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += sizeof (ushort);
// Method, index(Method)
fldSize = GetIndexSize(TableId.Method, rows);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
// Bound, coded-index(TypeDefOrRef)
fldSize = GetCodedIndexSize(heap, CodedTokenId.TypeDefOrRef, rows);
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
// Name, index(#Strings)
fldSize = si;
Array.Copy(data, offs, buff, dest, fldSize);
offs += fldSize;
dest += 4;
}
tab.FromRawData(buff, 0, nRows);
}
return offs;
}
} // end class
} // end namespace