示例#1
0
        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);
        }
示例#2
0
        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);
        }