private void InitializeFieldDescs() { var numStaticFields = 0; var numThreadStaticFields = 0; var currentDeclaredField = 0; var fieldDescs = new List <FieldDesc>(); for (var i = 0; i < _typeDefinition.Fields.Count; i++) { var fieldDef = _typeDefinition.Fields[i]; // We don't store static final primitive fields in the class layout if (fieldDef.IsLiteral) { continue; } if (!fieldDef.IsPublic) { HalfBakedClass.HasNonPublicFields = true; } if (fieldDef.IsStatic) { if (false) { // TODO: ThreadStatic attr // TODO: not implemented yet } else { fieldDescs.Add(new FieldDesc(fieldDef) { Offset = -1 /* FIELD_OFFSET_UNPLACED */ }); numStaticFields++; } } else { fieldDescs.Add(new FieldDesc(fieldDef) { Offset = -1 /* FIELD_OFFSET_UNPLACED */ }); currentDeclaredField++; } } HalfBakedClass.FieldDescList = fieldDescs.ToArray(); HalfBakedClass.NumInstanceFields = HasParent ? ParentMethodTable.EEClass.NumInstanceFields + currentDeclaredField : 0; HalfBakedClass.NumStaticFields = numStaticFields; HalfBakedClass.NumThreadStaticFields = numThreadStaticFields; // Cache Field descriptors _classLoader.RegisterFieldDescRange(HalfBakedClass.FieldDescList); }