/// <summary> /// Reads the specified token. /// </summary> /// <param name="token">The token.</param> /// <param name="result">The result.</param> public void Read(TokenTypes token, out ClassLayoutRow result) { if ((token & TokenTypes.TableMask) != TokenTypes.ClassLayout) throw new ArgumentException ("Invalid token type for ClassLayoutRow.", "token"); using (BinaryReader reader = CreateReaderForToken (token)) { result = new ClassLayoutRow (reader.ReadInt16 (), reader.ReadInt32 (), ReadIndexValue (reader, TokenTypes.TypeDef)); } }
void IMetadataProvider.Read(TokenTypes token, out ClassLayoutRow result) { TableHeap theap = (TableHeap)_streams[(int)HeapType.Tables]; theap.Read(token, out result); }
/// <summary> /// Loads all types from the given metadata module. /// </summary> private void LoadTypes() { TokenTypes maxTypeDef, maxField, maxMethod, maxLayout, tokenLayout = TokenTypes.ClassLayout + 1; TypeDefRow typeDefRow, nextTypeDefRow = new TypeDefRow(); ClassLayoutRow layoutRow = new ClassLayoutRow(); int size = 0x0, packing = 0; int typeOffset = 0; int methodOffset = 0; int fieldOffset = 0; RuntimeType rt; maxTypeDef = metadata.GetMaxTokenValue(TokenTypes.TypeDef); maxLayout = metadata.GetMaxTokenValue(TokenTypes.ClassLayout); maxMethod = metadata.GetMaxTokenValue(TokenTypes.MethodDef); maxField = metadata.GetMaxTokenValue(TokenTypes.Field); if (TokenTypes.ClassLayout < maxLayout) layoutRow = metadata.ReadClassLayoutRow(tokenLayout); TokenTypes token = TokenTypes.TypeDef + 1; typeDefRow = metadata.ReadTypeDefRow(token); for (; token <= maxTypeDef; token++) { TokenTypes maxNextMethod, maxNextField; string name = metadata.ReadString(typeDefRow.TypeNameIdx); //Debug.Write(((uint)token).ToString("X") + ": "); //Debug.Write(typeDefRow.TypeNameIdx.ToString("X") + ": "); //Debug.Write(metadata.ReadString(typeDefRow.TypeNameIdx)); if (token < maxTypeDef) { nextTypeDefRow = metadata.ReadTypeDefRow(token + 1); maxNextField = nextTypeDefRow.FieldList; maxNextMethod = nextTypeDefRow.MethodList; if (maxNextMethod > maxMethod) maxNextMethod = maxMethod + 1; if (maxNextField > maxField) maxNextField = maxField + 1; } else { maxNextMethod = maxMethod + 1; maxNextField = maxField + 1; } // Is this our layout info? if (layoutRow.ParentTypeDefIdx == token) { size = layoutRow.ClassSize; packing = layoutRow.PackingSize; //Debug.Write(" [Size: " + size.ToString() + "]"); tokenLayout++; if (tokenLayout <= maxLayout) layoutRow = metadata.ReadClassLayoutRow(tokenLayout); } //Debug.WriteLine(string.Empty); // Create and populate the runtime type rt = new CilRuntimeType(this, token, typeDefRow, maxNextField, maxNextMethod, packing, size); LoadMethods(rt, typeDefRow.MethodList, maxNextMethod, ref methodOffset); LoadFields(rt, typeDefRow.FieldList, maxNextField, ref fieldOffset); types[typeOffset++] = rt; packing = size = 0; typeDefRow = nextTypeDefRow; } }