private List <FieldX> LayoutFields(out List <FieldX> sfields) { sfields = new List <FieldX>(); List <FieldX> fields = new List <FieldX>(); foreach (var fldX in CurrType.Fields) { if (fldX.Def.IsLiteral) { continue; } if (fldX.IsStatic) { sfields.Add(fldX); } else if (fldX.IsInstance) { fields.Add(fldX); } } var layoutType = CurrType.Def.Layout; string typeName = CurrType.GetNameKey(); if (typeName == "String" || typeName == "System.Array") { layoutType = TypeAttributes.SequentialLayout; } if (layoutType == TypeAttributes.AutoLayout) { fields.Sort((lhs, rhs) => { int cmp = GenContext.GetTypeLayoutOrder(rhs.FieldType).CompareTo(GenContext.GetTypeLayoutOrder(lhs.FieldType)); if (cmp == 0) { return(lhs.Def.Rid.CompareTo(rhs.Def.Rid)); } return(cmp); }); } else if (layoutType == TypeAttributes.SequentialLayout || layoutType == TypeAttributes.ExplicitLayout) { fields.Sort((lhs, rhs) => lhs.Def.Rid.CompareTo(rhs.Def.Rid)); for (int i = 0; i < fields.Count - 1; ++i) { Debug.Assert(fields[i].Def.Rid < fields[i + 1].Def.Rid); } } return(fields); }
private List <FieldX> LayoutFields(out List <FieldX> sfields) { sfields = new List <FieldX>(); List <FieldX> fields = new List <FieldX>(); foreach (var fldX in CurrType.Fields) { if (fldX.IsStatic) { sfields.Add(fldX); } else { fields.Add(fldX); } } var layoutType = CurrType.Def.Layout; string typeName = CurrType.GetNameKey(); if (typeName == "String" || typeName == "System.Array") { layoutType = TypeAttributes.SequentialLayout; } if (layoutType == TypeAttributes.AutoLayout) { fields.Sort((lhs, rhs) => GenContext.GetTypeLayoutOrder(rhs.FieldType).CompareTo(GenContext.GetTypeLayoutOrder(lhs.FieldType))); } else if (layoutType == TypeAttributes.SequentialLayout) { fields.Sort((lhs, rhs) => lhs.Def.Rid.CompareTo(rhs.Def.Rid)); for (int i = 0; i < fields.Count - 1; ++i) { Debug.Assert(fields[i].Def.Rid < fields[i + 1].Def.Rid); } } else if (layoutType == TypeAttributes.ExplicitLayout) { throw new NotImplementedException(); } return(fields); }