X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fmcs%2Fmodifiers.cs;h=4fb596d1e7d96f91259d51f37d4346bd8083314e;hb=168d424a84ed56998b15dd011e49291c581dd5a9;hp=a5ad3d3646e823006305d3a8f846ebc5fc59f19a;hpb=e3fef3523b673346f9255e0070f1292677c78d1b;p=mono.git diff --git a/mcs/mcs/modifiers.cs b/mcs/mcs/modifiers.cs old mode 100755 new mode 100644 index a5ad3d3646e..4fb596d1e7d --- a/mcs/mcs/modifiers.cs +++ b/mcs/mcs/modifiers.cs @@ -25,10 +25,26 @@ namespace Mono.CSharp { public const int EXTERN = 0x0800; public const int VOLATILE = 0x1000; public const int UNSAFE = 0x2000; - public const int TOP = 0x2000; + private const int TOP = 0x2000; + + public const int PROPERTY_CUSTOM = 0x4000; // Custom property modifier + + // + // We use this internally to flag that the method contains an iterator + // + public const int METHOD_YIELDS = 0x8000; + public const int METHOD_GENERIC = 0x10000; + public const int PARTIAL = 0x20000; + public const int DEFAULT_ACCESS_MODIFER = 0x40000; + public const int METHOD_EXTENSION = 0x80000; + public const int COMPILER_GENERATED = 0x100000; + public const int BACKING_FIELD = 0x200000 | COMPILER_GENERATED; + public const int DEBUGGER_HIDDEN = 0x400000; public const int Accessibility = PUBLIC | PROTECTED | INTERNAL | PRIVATE; + public const int AllowedExplicitImplFlags = + UNSAFE | EXTERN; static public string Name (int i) { @@ -61,17 +77,40 @@ namespace Mono.CSharp { s = "extern"; break; case Modifiers.VOLATILE: s = "volatile"; break; + case Modifiers.UNSAFE: + s = "unsafe"; break; } return s; } - public static TypeAttributes TypeAttr (int mod_flags, TypeContainer caller) + public static string GetDescription (MethodAttributes ma) + { + ma &= MethodAttributes.MemberAccessMask; + + if (ma == MethodAttributes.Assembly) + return "internal"; + + if (ma == MethodAttributes.Family) + return "protected"; + + if (ma == MethodAttributes.Public) + return "public"; + + if (ma == MethodAttributes.FamANDAssem) + return "protected internal"; + + if (ma == MethodAttributes.Private) + return "private"; + + throw new NotImplementedException (ma.ToString ()); + } + + public static TypeAttributes TypeAttr (int mod_flags, bool is_toplevel) { TypeAttributes t = 0; - bool top_level = caller.IsTopLevel; - if (top_level){ + if (is_toplevel){ if ((mod_flags & PUBLIC) != 0) t |= TypeAttributes.Public; if ((mod_flags & PRIVATE) != 0) @@ -94,11 +133,6 @@ namespace Mono.CSharp { if ((mod_flags & ABSTRACT) != 0) t |= TypeAttributes.Abstract; - // If we do not have static constructors, static methods - // can be invoked without initializing the type. - if (!caller.HaveStaticConstructor) - t |= TypeAttributes.BeforeFieldInit; - return t; } @@ -110,12 +144,15 @@ namespace Mono.CSharp { fa |= FieldAttributes.Public; if ((mod_flags & PRIVATE) != 0) fa |= FieldAttributes.Private; - if ((mod_flags & PROTECTED) != 0 && (mod_flags & INTERNAL) != 0) - fa |= FieldAttributes.FamORAssem; - if ((mod_flags & PROTECTED) != 0) - fa |= FieldAttributes.Family; - if ((mod_flags & INTERNAL) != 0) - fa |= FieldAttributes.Assembly; + if ((mod_flags & PROTECTED) != 0){ + if ((mod_flags & INTERNAL) != 0) + fa |= FieldAttributes.FamORAssem; + else + fa |= FieldAttributes.Family; + } else { + if ((mod_flags & INTERNAL) != 0) + fa |= FieldAttributes.Assembly; + } if ((mod_flags & STATIC) != 0) fa |= FieldAttributes.Static; @@ -127,13 +164,13 @@ namespace Mono.CSharp { public static MethodAttributes MethodAttr (int mod_flags) { - MethodAttributes ma = 0; + MethodAttributes ma = MethodAttributes.HideBySig; if ((mod_flags & PUBLIC) != 0) ma |= MethodAttributes.Public; - if ((mod_flags & PRIVATE) != 0) + else if ((mod_flags & PRIVATE) != 0) ma |= MethodAttributes.Private; - if ((mod_flags & PROTECTED) != 0){ + else if ((mod_flags & PROTECTED) != 0){ if ((mod_flags & INTERNAL) != 0) ma |= MethodAttributes.FamORAssem; else @@ -146,8 +183,7 @@ namespace Mono.CSharp { if ((mod_flags & STATIC) != 0) ma |= MethodAttributes.Static; if ((mod_flags & ABSTRACT) != 0){ - ma |= MethodAttributes.Abstract | MethodAttributes.Virtual | - MethodAttributes.HideBySig; + ma |= MethodAttributes.Abstract | MethodAttributes.Virtual; } if ((mod_flags & SEALED) != 0) ma |= MethodAttributes.Final; @@ -156,15 +192,12 @@ namespace Mono.CSharp { ma |= MethodAttributes.Virtual; if ((mod_flags & OVERRIDE) != 0) - ma |= MethodAttributes.Virtual | MethodAttributes.HideBySig; + ma |= MethodAttributes.Virtual; else { if ((ma & MethodAttributes.Virtual) != 0) ma |= MethodAttributes.NewSlot; } - if ((mod_flags & NEW) != 0) - ma |= MethodAttributes.HideBySig; - return ma; } @@ -175,18 +208,14 @@ namespace Mono.CSharp { // public static int Check (int allowed, int mod, int def_access, Location l) { - int invalid_flags = (~allowed) & mod; + int invalid_flags = (~allowed) & (mod & (Modifiers.TOP - 1)); int i; if (invalid_flags == 0){ int a = mod; if ((mod & Modifiers.UNSAFE) != 0){ - if (!RootContext.Unsafe){ - Report.Error (227, l, - "Unsafe code requires the --unsafe command " + - "line option to be specified"); - } + RootContext.CheckUnsafeOption (l); } // @@ -195,6 +224,8 @@ namespace Mono.CSharp { // if ((mod & Accessibility) == 0){ mod |= def_access; + if (def_access != 0) + mod |= DEFAULT_ACCESS_MODIFER; return mod; } @@ -214,15 +245,19 @@ namespace Mono.CSharp { return mod; } - for (i = 1; i < TOP; i <<= 1){ + for (i = 1; i <= TOP; i <<= 1){ if ((i & invalid_flags) == 0) continue; - Report.Error (106, l, "the modifier `" + Name (i) + - "' is not valid for this item"); + Error_InvalidModifier (l, Name (i)); } return allowed & mod; } + + public static void Error_InvalidModifier (Location l, string name) + { + Report.Error (106, l, "The modifier `" + name + "' is not valid for this item"); + } } }