X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fmcs%2Ffield.cs;h=8222a01e53e577570fcc542a1b0303971b8607e5;hb=0c56887d08d2f4a31145f116c21fb01fce246c51;hp=278f71e0f1830471ef1bda269a3856f7efafaaf2;hpb=eb0edaa05e35057dbad4bb21ab263013d48ae32c;p=mono.git diff --git a/mcs/mcs/field.cs b/mcs/mcs/field.cs index 278f71e0f18..8222a01e53e 100644 --- a/mcs/mcs/field.cs +++ b/mcs/mcs/field.cs @@ -394,7 +394,7 @@ namespace Mono.CSharp // // Explicit struct layout set by parent // - public CharSet? CharSet { + public CharSet? CharSetValue { get; set; } @@ -425,7 +425,7 @@ namespace Mono.CSharp } // Create nested fixed buffer container - string name = String.Format ("<{0}>__FixedBuffer{1}", Name, GlobalCounter++); + string name = String.Format ("<{0}>__FixedBuffer{1}", TypeDefinition.FilterNestedName (Name), GlobalCounter++); fixed_buffer_type = Parent.TypeBuilder.DefineNestedType (name, TypeAttributes.NestedPublic | TypeAttributes.Sealed | TypeAttributes.BeforeFieldInit, Compiler.BuiltinTypes.ValueType.GetMetaInfo ()); @@ -493,8 +493,32 @@ namespace Mono.CSharp } AttributeEncoder encoder; + MethodSpec ctor; - var ctor = Module.PredefinedMembers.StructLayoutAttributeCtor.Resolve (Location); + var char_set = CharSetValue ?? Module.DefaultCharSet ?? 0; +#if STATIC + // + // Set struct layout without resolving StructLayoutAttribute which is not always available + // + + TypeAttributes attribs = TypeAttributes.SequentialLayout; + switch (char_set) { + case CharSet.None: + case CharSet.Ansi: + attribs |= TypeAttributes.AnsiClass; + break; + case CharSet.Auto: + attribs |= TypeAttributes.AutoClass; + break; + case CharSet.Unicode: + attribs |= TypeAttributes.UnicodeClass; + break; + } + + fixed_buffer_type.__SetAttributes (fixed_buffer_type.Attributes | attribs); + fixed_buffer_type.__SetLayout (0, buffer_size * type_size); +#else + ctor = Module.PredefinedMembers.StructLayoutAttributeCtor.Resolve (Location); if (ctor == null) return; @@ -503,8 +527,6 @@ namespace Mono.CSharp if (field_size == null || field_charset == null) return; - var char_set = CharSet ?? Module.DefaultCharSet ?? 0; - encoder = new AttributeEncoder (); encoder.Encode ((short)LayoutKind.Sequential); encoder.EncodeNamedArguments ( @@ -516,7 +538,7 @@ namespace Mono.CSharp ); fixed_buffer_type.SetCustomAttribute ((ConstructorInfo) ctor.GetMetaInfo (), encoder.ToArray ()); - +#endif // // Don't emit FixedBufferAttribute attribute for private types // @@ -605,9 +627,23 @@ namespace Mono.CSharp if (TypeSpec.IsReferenceType (MemberType)) return true; - if (MemberType.IsEnum) + if (MemberType.IsPointer) return true; + if (MemberType.IsEnum) { + switch (EnumSpec.GetUnderlyingType (MemberType).BuiltinType) { + case BuiltinTypeSpec.Type.SByte: + case BuiltinTypeSpec.Type.Byte: + case BuiltinTypeSpec.Type.Short: + case BuiltinTypeSpec.Type.UShort: + case BuiltinTypeSpec.Type.Int: + case BuiltinTypeSpec.Type.UInt: + return true; + default: + return false; + } + } + return false; } @@ -709,7 +745,7 @@ namespace Mono.CSharp loc = parameter.Location; } - public override TypeSpec ResolveAsType (IMemberContext mc) + public override TypeSpec ResolveAsType (IMemberContext mc, bool allowUnboundTypeArguments) { return parameter.Type; }