public const int UNSAFE = 0x2000;
public const int TOP = 0x2000;
+ //
+ // We use this internally to flag that the method contains an iterator
+ //
+ public const int METHOD_YIELDS = 0x8000;
+
public const int Accessibility =
PUBLIC | PROTECTED | INTERNAL | PRIVATE;
+ public const int AllowedExplicitImplFlags =
+ UNSAFE | EXTERN;
static public string Name (int i)
{
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 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)
if ((mod_flags & ABSTRACT) != 0)
t |= TypeAttributes.Abstract;
+ return t;
+ }
+
+ public static TypeAttributes TypeAttr (int mod_flags, TypeContainer caller)
+ {
+ TypeAttributes t = TypeAttr (mod_flags, caller.IsTopLevel);
+
// If we do not have static constructors, static methods
// can be invoked without initializing the type.
- if (!caller.HaveStaticConstructor)
+ if (!caller.UserDefinedStaticConstructor &&
+ (caller.Kind != Kind.Interface))
t |= TypeAttributes.BeforeFieldInit;
return t;
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;
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 & 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;
+
if ((mod_flags & VIRTUAL) != 0)
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;
}
if ((mod & Modifiers.UNSAFE) != 0){
if (!RootContext.Unsafe){
Report.Error (227, l,
- "Unsafe code requires the --unsafe command " +
+ "Unsafe code requires the -unsafe command " +
"line option to be specified");
}
}
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");
+ }
}
}