X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fmbas%2Fclass.cs;h=ed4a5fe0b6d662c66a129726483c8bedd9dc6c2c;hb=1ca27704b51188d072e5d32dff7ed727610aee97;hp=52218e5705d54a9ab14b1a2f604fb1a6e15bb826;hpb=c1a8080429f60b34cec3539445189c81fdacc527;p=mono.git diff --git a/mcs/mbas/class.cs b/mcs/mbas/class.cs index 52218e5705d..ed4a5fe0b6d 100644 --- a/mcs/mbas/class.cs +++ b/mcs/mbas/class.cs @@ -83,12 +83,6 @@ namespace Mono.MonoBASIC { // Holds the events ArrayList events; - // Holds the indexers - ArrayList indexers; - - // Holds the operators - ArrayList operators; - // Holds AddHandlers stements for events ArrayList handlers; @@ -116,17 +110,23 @@ namespace Mono.MonoBASIC { // from classes from the arraylist `type_bases' // string base_class_name; - + public Type base_class_type; + ArrayList type_bases; - // Attributes for this type - protected Attributes attributes; - // Information in the case we are an attribute type - public AttributeTargets Targets = AttributeTargets.All; - public bool AllowMultiple = false; - public bool Inherited; + AttributeUsageAttribute attribute_usage = new AttributeUsageAttribute (AttributeTargets.All); + + public AttributeUsageAttribute AttributeUsage { + get { + return attribute_usage; + } + + set { + attribute_usage = value; + } + } // The interfaces we implement. Type [] ifaces; @@ -138,22 +138,23 @@ namespace Mono.MonoBASIC { // // The indexer name for this class // - public string IndexerName; + public string DefaultPropName; - public TypeContainer (TypeContainer parent, string name, Location l) - : base (parent, name, l) + public TypeContainer (TypeContainer parent, string name, Attributes attrs, Location l) + : base (parent, name, attrs, l) { - string n; types = new ArrayList (); + + base_class_name = null; + /* string n; + if (parent == null) n = ""; else n = parent.Name; - base_class_name = null; - - //Console.WriteLine ("New class " + name + " inside " + n); + Console.WriteLine ("New class " + name + " inside " + n);*/ } public AdditionResult AddConstant (Const constant) @@ -364,6 +365,13 @@ namespace Mono.MonoBASIC { AdditionResult res; string basename = prop.Name; + string fullname = Name + "." + basename; + + Object value = defined_names [fullname]; + + if (value != null && (!(value is Property))) + return AdditionResult.NameExists; + if ((res = IsValid (basename)) != AdditionResult.Success) return res; @@ -374,7 +382,9 @@ namespace Mono.MonoBASIC { properties.Insert (0, prop); else properties.Add (prop); - DefineName (Name + "." + basename, prop); + + if (value == null) + DefineName (Name + "." + basename, prop); return AdditionResult.Success; } @@ -396,29 +406,6 @@ namespace Mono.MonoBASIC { return AdditionResult.Success; } - public AdditionResult AddIndexer (Indexer i) - { - if (indexers == null) - indexers = new ArrayList (); - - if (i.InterfaceType != null) - indexers.Insert (0, i); - else - indexers.Add (i); - - return AdditionResult.Success; - } - - public AdditionResult AddOperator (Operator op) - { - if (operators == null) - operators = new ArrayList (); - - operators.Add (op); - - return AdditionResult.Success; - } - public AdditionResult AddEventHandler (Statement stmt) { if (handlers == null) @@ -435,7 +422,17 @@ namespace Mono.MonoBASIC { interface_order.Add (iface); } - + public override void ApplyAttributeBuilder (Attribute a, CustomAttributeBuilder cb) + { + base.ApplyAttributeBuilder (a, cb); + } + + public override AttributeTargets AttributeTargets { + get { + throw new NotSupportedException (); + } + } + public ArrayList Types { get { return types; @@ -510,30 +507,12 @@ namespace Mono.MonoBASIC { } } - public ArrayList Indexers { - get { - return indexers; - } - } - - public ArrayList Operators { - get { - return operators; - } - } - public ArrayList Delegates { get { return delegates; } } - public Attributes OptAttributes { - get { - return attributes; - } - } - public bool HaveStaticConstructor { get { return have_static_constructor; @@ -558,7 +537,7 @@ namespace Mono.MonoBASIC { public bool EmitFieldInitializers (EmitContext ec) { ArrayList fields; - ILGenerator ig = ec.ig; + //ILGenerator ig = ec.ig; Expression instance_expr; if (ec.IsStatic){ @@ -742,7 +721,7 @@ namespace Mono.MonoBASIC { } if (t.IsSealed) { - if (t.IsValueType) + if (t.IsValueType) Report.Error (30258, "class `"+ Name + "': a class can not inherit from a struct/enum"); @@ -781,7 +760,6 @@ namespace Mono.MonoBASIC { // public override TypeBuilder DefineType () { - Type parent; bool error; bool is_class; @@ -806,21 +784,21 @@ namespace Mono.MonoBASIC { "Class declared as 'MustInherit' cannot be declared as 'NotInheritable'"); } - ifaces = GetClassBases (is_class, out parent, out error); + ifaces = GetClassBases (is_class, out base_class_type, out error); if (error) return null; if (this is Interface) - parent = null; + base_class_type = null; - if (is_class && parent != null){ - if (parent == TypeManager.enum_type || - (parent == TypeManager.value_type && RootContext.StdLib) || - parent == TypeManager.delegate_type || - parent == TypeManager.array_type){ + if (is_class && base_class_type != null){ + if (base_class_type == TypeManager.enum_type || + (base_class_type == TypeManager.value_type && RootContext.StdLib) || + base_class_type == TypeManager.delegate_type || + base_class_type == TypeManager.array_type){ Report.Error ( 644, Location, "`" + Name + "' cannot inherit from " + - "special class `" + TypeManager.MonoBASIC_Name (parent) + "'"); + "special class `" + TypeManager.MonoBASIC_Name (base_class_type) + "'"); return null; } } @@ -828,7 +806,7 @@ namespace Mono.MonoBASIC { if (!is_class && TypeManager.value_type == null) throw new Exception (); - if (is_class && Parent.Parent == null && (!(this is Interface))) + if (is_class && Parent.Parent == null && (!(this is Interface))) { if ((ModFlags & Modifiers.PRIVATE) != 0) Report.Error (31089, Location, @@ -851,16 +829,15 @@ namespace Mono.MonoBASIC { TypeAttributes type_attributes = TypeAttr; - // if (parent_builder is ModuleBuilder) { if (IsTopLevel){ ModuleBuilder builder = CodeGen.ModuleBuilder; TypeBuilder = builder.DefineType ( - Name, type_attributes, parent, ifaces); + Name, type_attributes, base_class_type, ifaces); } else { TypeBuilder builder = Parent.TypeBuilder; TypeBuilder = builder.DefineNestedType ( - Basename, type_attributes, parent, ifaces); + Basename, type_attributes, base_class_type, ifaces); } if (!is_class) @@ -890,11 +867,10 @@ namespace Mono.MonoBASIC { TypeManager.AddUserType (Name, TypeBuilder, this, ifaces); - if ((parent != null) && - (parent == TypeManager.attribute_type || - parent.IsSubclassOf (TypeManager.attribute_type))) { + if ((base_class_type != null) && + (base_class_type == TypeManager.attribute_type || + base_class_type.IsSubclassOf (TypeManager.attribute_type))) { RootContext.RegisterAttribute (this); - TypeManager.RegisterAttrType (TypeBuilder, this); } else RootContext.RegisterOrder (this); @@ -939,7 +915,7 @@ namespace Mono.MonoBASIC { // have the same modifier Hashtable members = new Hashtable(); int modval; - foreach (MemberCore mc in list) + foreach (MemberCore mc in list) { modval = 0; if(members[mc.Name] == null) @@ -1022,46 +998,6 @@ namespace Mono.MonoBASIC { remove_list.Clear (); } - // - // Defines the indexers, and also verifies that the IndexerNameAttribute in the - // class is consisten. Either it is `Item' or it is the name defined by all the - // indexers with the `IndexerName' attribute. - // - // Turns out that the IndexerNameAttribute is applied to each indexer, - // but it is never emitted, instead a DefaultName attribute is attached - // to the class. - // - void DefineIndexers () - { - string class_indexer_name = null; - - foreach (Indexer i in Indexers){ - string name; - - i.Define (this); - - name = i.IndexerName; - - if (i.InterfaceType != null) - continue; - - if (class_indexer_name == null){ - class_indexer_name = name; - continue; - } - - if (name == class_indexer_name) - continue; - - Report.Error ( - 668, "Two indexers have different names, " + - " you should use the same name for all your indexers"); - } - if (class_indexer_name == null) - class_indexer_name = "Item"; - IndexerName = class_indexer_name; - } - static void Error_KeywordNotAllowed (Location loc) { Report.Error (1530, loc, "Keyword new not allowed for namespace elements"); @@ -1108,7 +1044,7 @@ namespace Mono.MonoBASIC { if (this is Class && (!(this is Interface))){ if (instance_constructors == null){ - if (default_constructor == null) + if (default_constructor == null) DefineDefaultConstructor (false); } @@ -1135,7 +1071,7 @@ namespace Mono.MonoBASIC { // // Constructors are not in the defined_names array // - if (instance_constructors != null) + if (instance_constructors != null) DefineMembers (instance_constructors, null); if (default_static_constructor != null) @@ -1150,17 +1086,6 @@ namespace Mono.MonoBASIC { if (events != null) DefineMembers (events, defined_names); - if (indexers != null) { - DefineIndexers (); - } else - IndexerName = "Item"; - - if (operators != null){ - DefineMembers (operators, null); - - CheckPairedOperators (); - } - if (enums != null) DefineMembers (enums, defined_names); @@ -1309,19 +1234,6 @@ namespace Mono.MonoBASIC { } } - if (operators != null){ - foreach (Operator o in operators) { - if ((o.ModFlags & modflags) == 0) - continue; - if ((o.ModFlags & static_mask) != static_flags) - continue; - - MethodBuilder ob = o.OperatorMethodBuilder; - if (ob != null && filter (ob, criteria) == true) - members.Add (ob); - } - } - if (properties != null){ foreach (Property p in properties){ if ((p.ModFlags & modflags) == 0) @@ -1340,25 +1252,6 @@ namespace Mono.MonoBASIC { members.Add (b); } } - - if (indexers != null){ - foreach (Indexer ix in indexers){ - if ((ix.ModFlags & modflags) == 0) - continue; - if ((ix.ModFlags & static_mask) != static_flags) - continue; - - MethodBuilder b; - - b = ix.GetBuilder; - if (b != null && filter (b, criteria) == true) - members.Add (b); - - b = ix.SetBuilder; - if (b != null && filter (b, criteria) == true) - members.Add (b); - } - } } if ((mt & MemberTypes.Event) != 0) { @@ -1382,25 +1275,12 @@ namespace Mono.MonoBASIC { continue; if ((p.ModFlags & static_mask) != static_flags) continue; - + MemberInfo pb = p.PropertyBuilder; if (pb != null && filter (pb, criteria) == true) members.Add (p.PropertyBuilder); } - - if (indexers != null) - foreach (Indexer ix in indexers) { - if ((ix.ModFlags & modflags) == 0) - continue; - if ((ix.ModFlags & static_mask) != static_flags) - continue; - - MemberInfo ib = ix.PropertyBuilder; - if (ib != null && filter (ib, criteria) == true) { - members.Add (ix.PropertyBuilder); - } - } } if ((mt & MemberTypes.NestedType) != 0) { @@ -1543,21 +1423,13 @@ namespace Mono.MonoBASIC { foreach (Method m in methods) m.Emit (this); - if (operators != null) - foreach (Operator o in operators) - o.Emit (this); - if (properties != null) foreach (Property p in properties) p.Emit (this); - if (indexers != null){ - foreach (Indexer ix in indexers) - ix.Emit (this); - - /*CustomAttributeBuilder cb = Interface.EmitDefaultMemberAttr ( - this, IndexerName, ModFlags, Location); - TypeBuilder.SetCustomAttribute (cb);*/ + if (this.DefaultPropName != null) { + CustomAttributeBuilder cb = new CustomAttributeBuilder (TypeManager.default_member_ctor, new string [] { DefaultPropName }); + TypeBuilder.SetCustomAttribute (cb); } if (fields != null) @@ -1572,9 +1444,10 @@ namespace Mono.MonoBASIC { if (Pending != null) if (Pending.VerifyPendingMethods ()) return; - - Attribute.ApplyAttributes (ec, TypeBuilder, this, OptAttributes, Location); + if (OptAttributes != null) + OptAttributes.Emit (ec, this); + // // Check for internal or private fields that were never assigned // @@ -1610,7 +1483,7 @@ namespace Mono.MonoBASIC { // foreach (TypeContainer tc in types) // tc.Emit (); } - + public override void CloseType () { try { @@ -1693,7 +1566,7 @@ namespace Mono.MonoBASIC { { const int vao = (Modifiers.VIRTUAL | Modifiers.ABSTRACT | Modifiers.OVERRIDE); const int va = (Modifiers.VIRTUAL | Modifiers.ABSTRACT); - const int nv = (Modifiers.SHADOWS | Modifiers.VIRTUAL); + //const int nv = (Modifiers.SHADOWS | Modifiers.VIRTUAL); bool ok = true; string name = MakeName (n); @@ -1716,7 +1589,7 @@ namespace Mono.MonoBASIC { } } - if ((flags & Modifiers.OVERRIDE) != 0 && (flags & Modifiers.VIRTUAL) != 0) + if ((flags & Modifiers.OVERRIDE) != 0 && (flags & Modifiers.VIRTUAL) != 0) { Report.Error ( 30730, loc, name + @@ -1768,7 +1641,7 @@ namespace Mono.MonoBASIC { if ((flags & Modifiers.PRIVATE) != 0){ if ((flags & vao) != 0){ Report.Error ( - 31408, loc, name + + 30266, loc, name + ": Members marked as Overridable or Overrides can not be Private"); ok = false; } @@ -1807,7 +1680,7 @@ namespace Mono.MonoBASIC { // and return the new level. static AccessLevel CheckAccessLevel (AccessLevel level, int flags) { - AccessLevel old_level = level; + //AccessLevel old_level = level; if ((flags & Modifiers.INTERNAL) != 0) { if ((flags & Modifiers.PROTECTED) != 0) { @@ -1972,130 +1845,6 @@ namespace Mono.MonoBASIC { return FindMembers (mt, bf | BindingFlags.DeclaredOnly, null, null); } - // - // Operator pair checking - // - - class OperatorEntry { - public int flags; - public Type ret_type; - public Type type1, type2; - public Operator op; - public Operator.OpType ot; - - public OperatorEntry (int f, Operator o) - { - flags = f; - - ret_type = o.OperatorMethod.GetReturnType (); - Type [] pt = o.OperatorMethod.ParameterTypes; - type1 = pt [0]; - type2 = pt [1]; - op = o; - ot = o.OperatorType; - } - - public override int GetHashCode () - { - return ret_type.GetHashCode (); - } - - public override bool Equals (object o) - { - OperatorEntry other = (OperatorEntry) o; - - if (other.ret_type != ret_type) - return false; - if (other.type1 != type1) - return false; - if (other.type2 != type2) - return false; - return true; - } - } - - // - // Checks that some operators come in pairs: - // == and != - // > and < - // >= and <= - // - // They are matched based on the return type and the argument types - // - void CheckPairedOperators () - { - Hashtable pairs = new Hashtable (null, null); - - // Register all the operators we care about. - foreach (Operator op in operators){ - int reg = 0; - - switch (op.OperatorType){ - case Operator.OpType.Equality: - reg = 1; break; - case Operator.OpType.Inequality: - reg = 2; break; - - case Operator.OpType.GreaterThan: - reg = 1; break; - case Operator.OpType.LessThan: - reg = 2; break; - - case Operator.OpType.GreaterThanOrEqual: - reg = 1; break; - case Operator.OpType.LessThanOrEqual: - reg = 2; break; - } - if (reg == 0) - continue; - - OperatorEntry oe = new OperatorEntry (reg, op); - - object o = pairs [oe]; - if (o == null) - pairs [oe] = oe; - else { - oe = (OperatorEntry) o; - oe.flags |= reg; - } - } - - // - // Look for the mistakes. - // - foreach (DictionaryEntry de in pairs){ - OperatorEntry oe = (OperatorEntry) de.Key; - - if (oe.flags == 3) - continue; - - string s = ""; - switch (oe.ot){ - case Operator.OpType.Equality: - s = "!="; - break; - case Operator.OpType.Inequality: - s = "=="; - break; - case Operator.OpType.GreaterThan: - s = "<"; - break; - case Operator.OpType.LessThan: - s = ">"; - break; - case Operator.OpType.GreaterThanOrEqual: - s = "<="; - break; - case Operator.OpType.LessThanOrEqual: - s = ">="; - break; - } - Report.Error (216, oe.op.Location, - "The operator `" + oe.op + "' requires a matching operator `" + s + "' to also be defined"); - } - } - - } public class Class : TypeContainer { @@ -2112,7 +1861,7 @@ namespace Mono.MonoBASIC { Modifiers.SEALED ; public Class (TypeContainer parent, string name, int mod, Attributes attrs, Location l) - : base (parent, name, l) + : base (parent, name, attrs, l) { int accmods; @@ -2122,7 +1871,24 @@ namespace Mono.MonoBASIC { accmods = Modifiers.PUBLIC; this.ModFlags = Modifiers.Check (AllowedModifiers, mod, accmods, l); - this.attributes = attrs; + } + + public override AttributeTargets AttributeTargets { + get { + return AttributeTargets.Class; + } + } + + public override void ApplyAttributeBuilder(Attribute a, CustomAttributeBuilder cb) + { + if (a.UsageAttribute != null) { + if (base_class_type != TypeManager.attribute_type && !base_class_type.IsSubclassOf (TypeManager.attribute_type) && + TypeBuilder.FullName != "System.Attribute") { + Report.Error (641, a.Location, "Attribute '" + a.Name + "' is only valid on classes derived from System.Attribute"); + } + AttributeUsage = a.UsageAttribute; + } + base.ApplyAttributeBuilder (a, cb); } // @@ -2149,7 +1915,7 @@ namespace Mono.MonoBASIC { Modifiers.PRIVATE; public Struct (TypeContainer parent, string name, int mod, Attributes attrs, Location l) - : base (parent, name, l) + : base (parent, name, attrs, l) { int accmods; @@ -2161,8 +1927,12 @@ namespace Mono.MonoBASIC { this.ModFlags = Modifiers.Check (AllowedModifiers, mod, accmods, l); this.ModFlags |= Modifiers.SEALED; - this.attributes = attrs; - + } + + public override AttributeTargets AttributeTargets { + get { + return AttributeTargets.Struct; + } } // @@ -2252,68 +2022,6 @@ namespace Mono.MonoBASIC { return cc; } - - public void LabelParameters (EmitContext ec, Type [] parameters, MethodBase builder) - { - LabelParameters (ec, parameters, builder, null); - } - - public void LabelParameters (EmitContext ec, Type [] parameters, MethodBase builder, Parameters p_params) - { - // - // Define each type attribute (in/out/ref) and - // the argument names. - // - Parameter [] p = p_params == null ? Parameters.FixedParameters : p_params.FixedParameters; - int i = 0; - - MethodBuilder mb = null; - ConstructorBuilder cb = null; - - if (builder is MethodBuilder) - mb = (MethodBuilder) builder; - else - cb = (ConstructorBuilder) builder; - - if (p != null){ - for (i = 0; i < p.Length; i++) { - ParameterBuilder pb; - - if (mb == null) - pb = cb.DefineParameter ( - i + 1, p [i].Attributes, p [i].Name); - else - pb = mb.DefineParameter ( - i + 1, p [i].Attributes, p [i].Name); - - if (p [i].ParameterInitializer != null) - pb.SetConstant (((Constant) p [i].ParameterInitializer).GetValue()); - - Attributes attr = p [i].OptAttributes; - if (attr != null) - Attribute.ApplyAttributes (ec, pb, pb, attr, Location); - } - } - - if (Parameters.ArrayParameter != null){ - ParameterBuilder pb; - Parameter array_param = Parameters.ArrayParameter; - - if (mb == null) - pb = cb.DefineParameter ( - i + 1, array_param.Attributes, - array_param.Name); - else - pb = mb.DefineParameter ( - i + 1, array_param.Attributes, - array_param.Name); - - CustomAttributeBuilder a = new CustomAttributeBuilder ( - TypeManager.cons_param_array_attribute, new object [0]); - - pb.SetCustomAttribute (a); - } - } } public class Method : MethodCore { @@ -2354,7 +2062,13 @@ namespace Mono.MonoBASIC { { Implements = impl_what; } - + + public override AttributeTargets AttributeTargets { + get { + return AttributeTargets.Method; + } + } + // // Returns the `System.Type' for the ReturnType of this // function. Provides a nice cache. (used between semantic analysis @@ -2488,13 +2202,13 @@ namespace Mono.MonoBASIC { WarningNotHiding (parent);*/ if ((ModFlags & Modifiers.OVERRIDE) != 0){ - Report.Error (30284, Location, + Report.Error (30398, Location, parent.MakeName (Name) + " : No suitable methods found to override"); } - if ((ModFlags & ( Modifiers.NEW | Modifiers.SHADOWS | Modifiers.OVERRIDE )) == 0) + if ((ModFlags & ( Modifiers.NEW | Modifiers.SHADOWS | Modifiers.OVERRIDE )) == 0) { - if ((ModFlags & Modifiers.NONVIRTUAL) != 0) + if ((ModFlags & Modifiers.NONVIRTUAL) != 0) { Report.Error (31088, Location, parent.MakeName (Name) + " : Cannot " + @@ -2576,6 +2290,11 @@ namespace Mono.MonoBASIC { { MethodData.Emit (parent, Block, this); } + + public override void ApplyAttributeBuilder (Attribute a, CustomAttributeBuilder cb) + { + throw new Exception ("FIXME: I am just a placeholder implementation"); + } } public abstract class ConstructorInitializer { @@ -2602,7 +2321,7 @@ namespace Mono.MonoBASIC { public ConstructorInfo ParentConstructor { - get + get { return parent_constructor; } @@ -2634,7 +2353,7 @@ namespace Mono.MonoBASIC { "structs cannot call base class constructors"); return false; } - } + } else t = ec.ContainerType; @@ -2654,8 +2373,8 @@ namespace Mono.MonoBASIC { if (parent_constructor == null) { if (this.implicit_initialization) - Report.Error (30148, loc, "Must declare 'MyBase.New' in the constructor " + - "of the class '" + ec.TypeContainer.Name + "' with appropriate arguments, since the base class '" + + Report.Error (30148, loc, "Must declare 'MyBase.New' in the constructor " + + "of the class '" + ec.TypeContainer.Name + "' with appropriate arguments, since the base class '" + t.FullName + "' does not contain a definition of 'New' without any parameter"); else Report.Error (30455, loc, "Class '" + t + "' can not find a constructor for this argument list" ); @@ -2696,7 +2415,6 @@ namespace Mono.MonoBASIC { public class Constructor : MethodCore { public ConstructorBuilder ConstructorBuilder; public ConstructorInitializer Initializer; - new public Attributes OptAttributes; // // Modifiers allowed for a constructor. @@ -2726,6 +2444,17 @@ namespace Mono.MonoBASIC { Initializer = init; } + public override void ApplyAttributeBuilder (Attribute a, CustomAttributeBuilder cb) + { + ConstructorBuilder.SetCustomAttribute (cb); + } + + public override AttributeTargets AttributeTargets { + get { + return AttributeTargets.Constructor; + } + } + // // Returns true if this is a default constructor // @@ -2798,7 +2527,7 @@ namespace Mono.MonoBASIC { ca |= MethodAttributes.FamORAssem; else ca |= MethodAttributes.Family; - } + } else if ((ModFlags & Modifiers.INTERNAL) != 0) ca |= MethodAttributes.Assembly; else if (IsDefault ()) @@ -2850,7 +2579,7 @@ namespace Mono.MonoBASIC { ec.IsStatic = false; } - LabelParameters (ec, ParameterTypes, ConstructorBuilder); + Parameters.LabelParameters (ec, ConstructorBuilder, Location); // // Classes can have base initializers and instance field initializers. @@ -2872,7 +2601,8 @@ namespace Mono.MonoBASIC { if ((ModFlags & Modifiers.STATIC) != 0) parent.EmitFieldInitializers (ec); - Attribute.ApplyAttributes (ec, ConstructorBuilder, this, OptAttributes, Location); + if (OptAttributes != null) + OptAttributes.Emit (ec, this); // If this is a non-static `struct' constructor and doesn't have any // initializer, it must initialize all of the struct's fields. @@ -2903,11 +2633,11 @@ namespace Mono.MonoBASIC { // // Protected data. // - protected MemberBase member; - protected int modifiers; - protected MethodAttributes flags; - protected bool is_method; - protected string accessor_name; + readonly MemberBase member; + readonly int modifiers; + MethodAttributes flags; + readonly bool is_method; + readonly string accessor_name; ArrayList conditionals; MethodBuilder builder = null; @@ -2945,32 +2675,27 @@ namespace Mono.MonoBASIC { public virtual bool ApplyAttributes (Attributes opt_attrs, bool is_method) { - if ((opt_attrs == null) || (opt_attrs.AttributeSections == null)) + if ((opt_attrs == null) || (opt_attrs.Attrs == null)) return true; - foreach (AttributeSection asec in opt_attrs.AttributeSections) { - if (asec.Attributes == null) - continue; - - foreach (Attribute a in asec.Attributes) { - if (a.Name == "Conditional") { - if (!ApplyConditionalAttribute (a)) - return false; - } else if (a.Name == "Obsolete") { - if (!ApplyObsoleteAttribute (a)) - return false; - } else if (a.Name.IndexOf ("DllImport") != -1) { - if (!is_method) { - a.Type = TypeManager.dllimport_type; - Attribute.Error_AttributeNotValidForElement (a, Location); - return false; - } - if (!ApplyDllImportAttribute (a)) - return false; + foreach (Attribute a in opt_attrs.Attrs) { + if (a.Name == "Conditional") { + if (!ApplyConditionalAttribute (a)) + return false; + } else if (a.Name == "Obsolete") { + if (!ApplyObsoleteAttribute (a)) + return false; + } else if (a.Name.IndexOf ("DllImport") != -1) { + if (!is_method) { + a.Type = TypeManager.dllimport_type; + Attribute.Error_AttributeNotValidForElement (a, Location); + return false; } + if (!ApplyDllImportAttribute (a)) + return false; } } - + return true; } @@ -3116,33 +2841,29 @@ namespace Mono.MonoBASIC { bool IsImplementing = false; Type current_iface_type = iface_type; - if (member is Indexer) - implementing = parent.Pending.IsAbstractIndexer ( - current_iface_type , ReturnType, ParameterTypes); - else - implementing = parent.Pending.IsAbstractMethod ( - current_iface_type, method_name, ReturnType, ParameterTypes); + implementing = parent.Pending.IsAbstractMethod ( + current_iface_type, method_name, ReturnType, ParameterTypes); - if (implementing != null) { - if (!implementing_list.Contains (implementing)) { - implementing_list.Add (implementing); - implementing_iface.Add(current_iface_type); - } - IsImplementing = true; - } else { - Type[] current_iface_types = current_iface_type.GetInterfaces(); - if (current_iface_types.Length == 0) - return false; + if (implementing != null) { + if (!implementing_list.Contains (implementing)) { + implementing_list.Add (implementing); + implementing_iface.Add(current_iface_type); + } + IsImplementing = true; + } else { + Type[] current_iface_types = current_iface_type.GetInterfaces(); + if (current_iface_types.Length == 0) + return false; - foreach (Type curr_iface_type in current_iface_types) { - IsImplementing = SearchBasesForAbstractMethods ( - parent, curr_iface_type, method_name, - ref implementing_list, ref implementing_iface); + foreach (Type curr_iface_type in current_iface_types) { + IsImplementing = SearchBasesForAbstractMethods ( + parent, curr_iface_type, method_name, + ref implementing_list, ref implementing_iface); - if (IsImplementing) - break; - } + if (IsImplementing) + break; } + } return IsImplementing; } @@ -3170,16 +2891,12 @@ namespace Mono.MonoBASIC { if ((member.ModFlags & Modifiers.OVERRIDE) != 0) { if (parent.Pending == null) implementing = null; - else if (member is Indexer) - implementing = parent.Pending.IsAbstractIndexer ( - (Type) parent.TypeBuilder.BaseType, - ReturnType, ParameterTypes); else implementing = parent.Pending.IsAbstractMethod ( (Type) parent.TypeBuilder.BaseType, name, ReturnType, ParameterTypes); - if (implementing != null) + if (implementing != null) IsImplementing = true; } @@ -3288,12 +3005,14 @@ namespace Mono.MonoBASIC { // implement abstract methods from abstract classes // if ((member.ModFlags & Modifiers.OVERRIDE) != 0) { + /* if (member is Indexer) parent.Pending.ImplementIndexer ( (Type) parent.TypeBuilder.BaseType, builder, ReturnType, ParameterTypes, true); else + */ parent.Pending.ImplementMethod ( (Type) parent.TypeBuilder.BaseType, name, ReturnType, @@ -3306,12 +3025,15 @@ namespace Mono.MonoBASIC { if (member.Implements != null) { pos = 0; foreach (MethodInfo Impl in implementing_list) { + + /* if (member is Indexer) parent.Pending.ImplementIndexer ( (Type) implementing_iface[pos++], builder, ReturnType, ParameterTypes, true); else + */ parent.Pending.ImplementMethod ( (Type) implementing_iface[pos++], Impl.Name, ReturnType, @@ -3356,7 +3078,7 @@ namespace Mono.MonoBASIC { Attribute.ApplyAttributes (ec, builder, kind, OptAttributes, Location); if (member is MethodCore) - ((MethodCore) member).LabelParameters (ec, ParameterTypes, MethodBuilder); + ((MethodCore) member).Parameters.LabelParameters (ec, MethodBuilder, ((MethodCore) member).Location); // // abstract or extern methods have no bodies @@ -3468,7 +3190,6 @@ namespace Mono.MonoBASIC { abstract public class MemberBase : MemberCore { public Expression Type; - public readonly Attributes OptAttributes; public ArrayList Implements; protected MethodAttributes flags; @@ -3515,11 +3236,10 @@ namespace Mono.MonoBASIC { // protected MemberBase (Expression type, int mod, int allowed_mod, string name, Attributes attrs, Location loc) - : base (name, loc) + : base (name, attrs, loc) { Type = type; ModFlags = Modifiers.Check (allowed_mod, mod, Modifiers.PUBLIC, loc); - OptAttributes = attrs; } protected virtual bool CheckBase (TypeContainer parent) @@ -3538,16 +3258,10 @@ namespace Mono.MonoBASIC { if (parent.AsAccessible (partype, ModFlags)) continue; - if (this is Indexer) - Report.Error (55, Location, - "Inconsistent accessibility: parameter type `" + - TypeManager.MonoBASIC_Name (partype) + "' is less " + - "accessible than indexer `" + Name + "'"); - else - Report.Error (51, Location, - "Inconsistent accessibility: parameter type `" + - TypeManager.MonoBASIC_Name (partype) + "' is less " + - "accessible than method `" + Name + "'"); + Report.Error (51, Location, + "Inconsistent accessibility: parameter type `" + + TypeManager.MonoBASIC_Name (partype) + "' is less " + + "accessible than method `" + Name + "'"); error = true; } @@ -3584,7 +3298,7 @@ namespace Mono.MonoBASIC { InterfaceTypes.Add (InterfaceType); Type[] tbases = parent.TypeBuilder.GetInterfaces(); - + if (tbases.Length != 0) { ArrayList bases = new ArrayList(); TypeManager.ExpandAllInterfaces (tbases, ref bases); @@ -3616,13 +3330,8 @@ namespace Mono.MonoBASIC { "Inconsistent accessibility: property type `" + TypeManager.MonoBASIC_Name (MemberType) + "' is less " + "accessible than property `" + Name + "'"); - else if (this is Indexer) - Report.Error (54, Location, - "Inconsistent accessibility: indexer return type `" + - TypeManager.MonoBASIC_Name (MemberType) + "' is less " + - "accessible than indexer `" + Name + "'"); else if (this is Method) - Report.Error (50, Location, + Report.Error (30508, Location, "Inconsistent accessibility: return type `" + TypeManager.MonoBASIC_Name (MemberType) + "' is less " + "accessible than method `" + Name + "'"); @@ -3673,7 +3382,14 @@ namespace Mono.MonoBASIC { this.init = init; } - // + public override AttributeTargets AttributeTargets { + get { + return AttributeTargets.Field; + } + } + + + // // Whether this field has an initializer. // public bool HasInitializer { @@ -3737,6 +3453,12 @@ namespace Mono.MonoBASIC { { } + public override AttributeTargets AttributeTargets { + get { + return AttributeTargets.Field; + } + } + public override bool Define (TypeContainer parent) { Type t = parent.ResolveType (Type, false, Location); @@ -3766,7 +3488,7 @@ namespace Mono.MonoBASIC { System.Type.FilterName, Name); if (RootContext.WarningLevel > 1){ - if ((list.Count > 0) && ((ModFlags & Modifiers.SHADOWS) == 0)) + if ((list.Count > 0) && ((ModFlags & Modifiers.SHADOWS) == 0)) { Report.Warning ( 40004, 2, Location, @@ -3836,8 +3558,15 @@ namespace Mono.MonoBASIC { EmitContext ec = new EmitContext (tc, Location, null, FieldBuilder.FieldType, ModFlags); - Attribute.ApplyAttributes (ec, FieldBuilder, this, OptAttributes, Location); + if (OptAttributes != null) + OptAttributes.Emit (ec, this); + } + + public override void ApplyAttributeBuilder (Attribute a, CustomAttributeBuilder cb) + { + FieldBuilder.SetCustomAttribute (cb); } + } // @@ -3857,25 +3586,167 @@ namespace Mono.MonoBASIC { } } - // - // Properties and Indexers both generate PropertyBuilders, we use this to share - // their common bits. - // - abstract public class PropertyBase : MethodCore { - public Accessor Get, Set; - public PropertyBuilder PropertyBuilder; - public MethodBuilder GetBuilder, SetBuilder; - public MethodData GetData, SetData; + public class GetMethod { + private Accessor Get; + public MethodData GetData; + public MethodBuilder GetBuilder; - protected EmitContext ec; + Property parent_property; + Location Location; - public PropertyBase (Expression type, string name, int mod_flags, int allowed_mod, - Parameters parameters, Accessor get_block, Accessor set_block, - Attributes attrs, Location loc) - : base (type, mod_flags, allowed_mod, name, attrs, parameters, loc) + Parameters get_params; + + public GetMethod (Property parent_property, Accessor get_block, Attributes attrs, Parameters p_get, Location loc) { + this.parent_property = parent_property; Get = get_block; + get_params = p_get; + Location = loc; + } + + public MethodBuilder Define (TypeContainer parent) + { + Type [] g_parameters=null; + Parameter [] g_parms; + InternalParameters g_ip=null; + + if (get_params == Parameters.EmptyReadOnlyParameters) { + g_parameters = TypeManager.NoTypes; + g_ip = new InternalParameters (parent, Parameters.EmptyReadOnlyParameters); + } else { + g_parameters = new Type [get_params.FixedParameters.Length]; + for (int i = 0; i < get_params.FixedParameters.Length; i ++) { + g_parameters[i] = get_params.FixedParameters[i].ParameterType; + } + g_parms = new Parameter [get_params.FixedParameters.Length]; + for (int i = 0; i < get_params.FixedParameters.Length; i ++) { + Parameter tp = get_params.FixedParameters[i]; + g_parms[i] = new Parameter (tp.TypeName, tp.Name, + Parameter.Modifier.NONE, null); + } + g_ip = new InternalParameters ( + parent, new Parameters (g_parms, null, Location)); + } + + GetData = new MethodData (parent_property, "get", parent_property.MemberType, + g_parameters, g_ip, CallingConventions.Standard, + Get.OptAttributes, parent_property.ModFlags, parent_property.MethodAttributeFlags, false); + + if (!GetData.Define (parent)) + return null; + + GetBuilder = GetData.MethodBuilder; + + return GetBuilder; + } + + public void Emit (TypeContainer tc) + { + if (GetData != null) + { + parent_property.Parameters = get_params; + GetData.Emit (tc, Get.Block, Get); + } + } + } + + public class SetMethod { + Accessor Set; + MethodData SetData; + MethodBuilder SetBuilder; + + Property parent_property; + Location Location; + + string set_parameter_name; + Parameters set_params; + + public SetMethod (Property parent_property, Accessor set_block, string set_name, + Parameters p_set, Location loc) + { + this.parent_property = parent_property; Set = set_block; + set_params = p_set; + set_parameter_name = set_name; + this.Location = loc; + } + + public MethodBuilder Define (TypeContainer parent) + { + Type [] s_parameters=null; + Parameter [] s_parms; + InternalParameters s_ip=null; + + if (set_params == Parameters.EmptyReadOnlyParameters) + { + s_parameters = new Type [1]; + s_parameters [0] = parent_property.MemberType; + + s_parms = new Parameter [1]; + s_parms [0] = new Parameter (parent_property.Type, set_parameter_name, + Parameter.Modifier.NONE, null); + } else { + s_parameters = new Type [set_params.FixedParameters.Length]; + for (int i = 0; i < set_params.FixedParameters.Length; i ++) { + s_parameters[i] = set_params.FixedParameters[i].ParameterType; + } + + s_parms = new Parameter [set_params.FixedParameters.Length]; + for (int i = 0; i < set_params.FixedParameters.Length; i ++) { + Parameter tp = set_params.FixedParameters[i]; + s_parms[i] = new Parameter (tp.TypeName, tp.Name, + Parameter.Modifier.NONE, null); + } + } + + s_ip = new InternalParameters ( + parent, new Parameters (s_parms, null, Location)); + + SetData = new MethodData (parent_property, "set", TypeManager.void_type, + s_parameters, s_ip, CallingConventions.Standard, + Set.OptAttributes, parent_property.ModFlags, parent_property.MethodAttributeFlags, false); + + if (!SetData.Define (parent)) + return null; + + SetBuilder = SetData.MethodBuilder; + SetBuilder.DefineParameter (1, ParameterAttributes.None, + set_parameter_name); + + return SetBuilder; + } + + public void Emit (TypeContainer tc) + { + if (SetData != null) + { + parent_property.Parameters = set_params; + SetData.Emit (tc, Set.Block, Set); + } + } + } + + public class Property : MethodCore { + GetMethod GetMethod; + SetMethod SetMethod; + + public Accessor Set; + public PropertyBuilder PropertyBuilder; + public MethodBuilder GetBuilder; + public MethodBuilder SetBuilder; + public MethodData SetData; + + protected EmitContext ec; + + public override void ApplyAttributeBuilder (Attribute a, CustomAttributeBuilder cb) + { + PropertyBuilder.SetCustomAttribute (cb); + } + + public override AttributeTargets AttributeTargets { + get { + return AttributeTargets.Property; + } } protected override bool DoDefine (TypeContainer parent) @@ -3903,7 +3774,7 @@ namespace Mono.MonoBASIC { return true; MethodSignature ms = new MethodSignature (Name, null, ParameterTypes); - if (!IsOperator) + if (!IsOperator) { MemberList mi_this; @@ -3929,8 +3800,10 @@ namespace Mono.MonoBASIC { if ((ModFlags & Modifiers.READONLY) != 0) retval = MemberType; - string report_name; + //string report_name; MethodSignature base_ms; + + /* if (this is Indexer) { string name, base_name; @@ -3939,8 +3812,8 @@ namespace Mono.MonoBASIC { ms = new MethodSignature (name, null, ParameterTypes); base_name = TypeManager.IndexerPropertyName (container.TypeBuilder.BaseType); base_ms = new MethodSignature (base_name, retval, ParameterTypes); - } else { - report_name = Name; + } else */ { + //report_name = Name; ms = base_ms = new MethodSignature (Name, retval, ParameterTypes); } @@ -3967,7 +3840,6 @@ namespace Mono.MonoBASIC { MethodSignature.inheritable_property_signature_filter, base_ms); - if (mi_instance.Count > 0) mi = mi_instance; else if (mi_static.Count > 0) @@ -3975,9 +3847,9 @@ namespace Mono.MonoBASIC { else mi = null; - if (mi != null && mi.Count > 0) + if (mi != null && mi.Count > 0) parent_member = (PropertyInfo) mi [0]; - + if (parent_member is PropertyInfo) { PropertyInfo parent_property = (PropertyInfo)parent_member; @@ -4015,11 +3887,14 @@ namespace Mono.MonoBASIC { WarningNotHiding (container); */ if ((ModFlags & Modifiers.OVERRIDE) != 0) { + + /* if (this is Indexer) Report.Error (115, Location, container.MakeName (Name) + " no suitable indexers found to override"); else + */ Report.Error (115, Location, container.MakeName (Name) + " no suitable properties found to override"); @@ -4044,26 +3919,7 @@ namespace Mono.MonoBASIC { return true; } - public virtual void Emit (TypeContainer tc) - { - // - // The PropertyBuilder can be null for explicit implementations, in that - // case, we do not actually emit the ".property", so there is nowhere to - // put the attribute - // - if (PropertyBuilder != null) - Attribute.ApplyAttributes (ec, PropertyBuilder, this, OptAttributes, Location); -/* - if (GetData != null) - GetData.Emit (tc, Get.Block, Get); - if (SetData != null) - SetData.Emit (tc, Set.Block, Set); -*/ - } - } - - public class Property : PropertyBase { const int AllowedModifiers = Modifiers.NEW | Modifiers.PUBLIC | @@ -4074,7 +3930,7 @@ namespace Mono.MonoBASIC { Modifiers.SEALED | Modifiers.OVERRIDE | Modifiers.ABSTRACT | - Modifiers.UNSAFE | + Modifiers.UNSAFE | Modifiers.EXTERN | Modifiers.VIRTUAL | Modifiers.NONVIRTUAL | @@ -4091,13 +3947,15 @@ namespace Mono.MonoBASIC { Accessor get_block, Accessor set_block, Attributes attrs, Location loc, string set_name, Parameters p_get, Parameters p_set, ArrayList impl_what) - : base (type, name, mod_flags, AllowedModifiers, - p_set, - get_block, set_block, attrs, loc) + : base (type, mod_flags, AllowedModifiers, name, attrs, p_set, loc) + { - set_parameter_name = set_name; - get_params = p_get; - set_params = p_set; + if (get_block != null) + GetMethod = new GetMethod (this, get_block, attrs, p_get, loc); + + if (set_block != null) + SetMethod = new SetMethod (this, set_block, set_name, p_set, loc); + Implements = impl_what; } @@ -4111,10 +3969,10 @@ namespace Mono.MonoBASIC { public override bool Define (TypeContainer parent) { - Type [] g_parameters=null, s_parameters=null; - Parameter [] g_parms, s_parms; - InternalParameters g_ip=null, s_ip=null; - + /*Type [] s_parameters=null; + Parameter [] s_parms; + InternalParameters s_ip=null;*/ + if ((parent is Struct) && ((ModFlags & Modifiers.PROTECTED) != 0)) Report.Error (30435, Location, "'Property' inside a 'Structure' can not be declared as " + @@ -4128,87 +3986,23 @@ namespace Mono.MonoBASIC { flags |= MethodAttributes.HideBySig | MethodAttributes.SpecialName; - if (Get == null) { + if (GetMethod == null) { if ((ModFlags & Modifiers.WRITEONLY) == 0) Report.Error ( 30124, Location, "Property without 'Get' accessor must have a 'WriteOnly' modifier"); - } - else { - if (get_params == Parameters.EmptyReadOnlyParameters) { - g_parameters = TypeManager.NoTypes; - g_ip = new InternalParameters ( - parent, Parameters.EmptyReadOnlyParameters); - } else { - g_parameters = new Type [get_params.FixedParameters.Length]; - for (int i = 0; i < get_params.FixedParameters.Length; i ++) { - g_parameters[i] = get_params.FixedParameters[i].ParameterType; - } - g_parms = new Parameter [get_params.FixedParameters.Length]; - for (int i = 0; i < get_params.FixedParameters.Length; i ++) { - Parameter tp = get_params.FixedParameters[i]; - g_parms[i] = new Parameter (tp.TypeName, tp.Name, - Parameter.Modifier.NONE, null); - } - g_ip = new InternalParameters ( - parent, new Parameters (g_parms, null, Location)); - } - - GetData = new MethodData (this, "get", MemberType, - g_parameters, g_ip, CallingConventions.Standard, - Get.OptAttributes, ModFlags, flags, false); - - if (!GetData.Define (parent)) - return false; - - GetBuilder = GetData.MethodBuilder; - } + } else + GetBuilder = GetMethod.Define (parent); - if (Set == null) { + if (SetMethod== null) { if ((ModFlags & Modifiers.READONLY) == 0) Report.Error ( 30124, Location, "Property without 'Set' accessor must have a 'ReadOnly' modifier"); } - else - { - if (set_params == Parameters.EmptyReadOnlyParameters) - { - s_parameters = new Type [1]; - s_parameters [0] = MemberType; - - s_parms = new Parameter [1]; - s_parms [0] = new Parameter (Type, set_parameter_name, - Parameter.Modifier.NONE, null); - } else { - s_parameters = new Type [set_params.FixedParameters.Length]; - for (int i = 0; i < set_params.FixedParameters.Length; i ++) { - s_parameters[i] = set_params.FixedParameters[i].ParameterType; - } - - s_parms = new Parameter [set_params.FixedParameters.Length]; - for (int i = 0; i < set_params.FixedParameters.Length; i ++) { - Parameter tp = set_params.FixedParameters[i]; - s_parms[i] = new Parameter (tp.TypeName, tp.Name, - Parameter.Modifier.NONE, null); - } - } - - s_ip = new InternalParameters ( - parent, new Parameters (s_parms, null, Location)); - - SetData = new MethodData (this, "set", TypeManager.void_type, - s_parameters, s_ip, CallingConventions.Standard, - Set.OptAttributes, ModFlags, flags, false); - - if (!SetData.Define (parent)) - return false; - - SetBuilder = SetData.MethodBuilder; - SetBuilder.DefineParameter (1, ParameterAttributes.None, - set_parameter_name); - } + else + SetBuilder = SetMethod.Define (parent); // FIXME - PropertyAttributes.HasDefault ? @@ -4238,23 +4032,34 @@ namespace Mono.MonoBASIC { return true; } - public override void Emit (TypeContainer tc) + public void Emit (TypeContainer tc) { - base.Emit (tc); + // + // The PropertyBuilder can be null for explicit implementations, in that + // case, we do not actually emit the ".property", so there is nowhere to + // put the attribute + // - if (GetData != null) + if (PropertyBuilder != null && OptAttributes != null) + OptAttributes.Emit (ec, this); + + if (GetMethod != null) { - Parameters = get_params; - GetData.Emit (tc, Get.Block, Get); + GetMethod.Emit (tc); } - if (SetData != null) + if (SetMethod != null) { - Parameters = set_params; - SetData.Emit (tc, Set.Block, Set); + SetMethod.Emit (tc); } - } + + public MethodAttributes MethodAttributeFlags { + get { + return flags; + } + } + } /// @@ -4391,6 +4196,98 @@ namespace Mono.MonoBASIC { } } } + + + public class AddDelegateMethod { + MethodBuilder AddBuilder; + MethodData AddData; + Event parent_event; + Location Location; + + public AddDelegateMethod (Event parent_event, Location loc) + { + this.parent_event = parent_event; + Location = loc; + } + + public MethodBuilder Define (TypeContainer parent) + { + Type [] parameter_types = new Type [1]; + parameter_types [0] = parent_event.MemberType; + + Parameter [] parms = new Parameter [1]; + parms [0] = new Parameter (parent_event.Type, /* was "value" */ parent_event.Name, Parameter.Modifier.NONE, null); + InternalParameters ip = new InternalParameters ( + parent, new Parameters (parms, null, Location)); + + AddData = new MethodData (parent_event, "add", TypeManager.void_type, + parameter_types, ip, CallingConventions.Standard, null, + parent_event.ModFlags, parent_event.MethodAttributeFlags, false); + + if (!AddData.Define (parent)) + return null; + + AddBuilder = AddData.MethodBuilder; + AddBuilder.DefineParameter (1, ParameterAttributes.None, /* was "value" */ parent_event.Name); + + + return AddBuilder; + } + + + public void Emit (TypeContainer tc) + { + ILGenerator ig = AddData.MethodBuilder.GetILGenerator (); + EmitContext ec = new EmitContext (tc, Location, ig, TypeManager.void_type, parent_event.ModFlags); + parent_event.EmitDefaultMethod (ec, true); + } + } + + public class RemoveDelegateMethod { + MethodBuilder RemoveBuilder; + MethodData RemoveData; + Event parent_event; + Location Location; + + public RemoveDelegateMethod (Event parent_event, Location loc) + { + this.parent_event = parent_event; + Location = loc; + } + + public MethodBuilder Define (TypeContainer parent) + { + //EventAttributes e_attr = EventAttributes.RTSpecialName | EventAttributes.SpecialName; + + Type [] parameter_types = new Type [1]; + parameter_types [0] = parent_event.MemberType; + + Parameter [] parms = new Parameter [1]; + parms [0] = new Parameter (parent_event.Type, /* was "value" */ parent_event.Name, Parameter.Modifier.NONE, null); + InternalParameters ip = new InternalParameters ( + parent, new Parameters (parms, null, Location)); + + + RemoveData = new MethodData (parent_event, "remove", TypeManager.void_type, + parameter_types, ip, CallingConventions.Standard, null, + parent_event.ModFlags, parent_event.MethodAttributeFlags, false); + + if (!RemoveData.Define (parent)) + return null; + + RemoveBuilder = RemoveData.MethodBuilder; + RemoveBuilder.DefineParameter (1, ParameterAttributes.None, /* was "value" */ parent_event.Name); + + return RemoveBuilder; + } + + public void Emit (TypeContainer tc) + { + ILGenerator ig = RemoveData.MethodBuilder.GetILGenerator (); + EmitContext ec = new EmitContext (tc, Location, ig, TypeManager.void_type, parent_event.ModFlags); + parent_event.EmitDefaultMethod (ec, false); + } + } public class Event : FieldBase { const int AllowedModifiers = @@ -4406,32 +4303,41 @@ namespace Mono.MonoBASIC { Modifiers.UNSAFE | Modifiers.ABSTRACT; - public readonly Accessor Add; - public readonly Accessor Remove; + public readonly AddDelegateMethod Add; + public readonly RemoveDelegateMethod Remove; public MyEventBuilder EventBuilder; MethodBuilder AddBuilder, RemoveBuilder; - MethodData AddData, RemoveData; - public Event (Expression type, string name, Object init, int mod, Accessor add, - Accessor remove, Attributes attrs, Location loc) - : base (type, mod, AllowedModifiers, name, init, attrs, loc) + public Event (Expression type, string name, Object init, int mod, Attributes attrs, Location loc) + : base (type, mod, AllowedModifiers, name, init, attrs, loc) { - Add = add; - Remove = remove; + Add = new AddDelegateMethod (this, loc); + Remove = new RemoveDelegateMethod (this, loc); + Implements = null; } - public Event (Expression type, string name, Object init, int mod, Accessor add, - Accessor remove, Attributes attrs, ArrayList impl_what, Location loc) + public Event (Expression type, string name, Object init, int mod, Attributes attrs, ArrayList impl_what, Location loc) : base (type, mod, AllowedModifiers, name, init, attrs, loc) { - Add = add; - Remove = remove; + Add = new AddDelegateMethod (this, loc); + Remove = new RemoveDelegateMethod (this, loc); + Implements = impl_what; } - + public override void ApplyAttributeBuilder (Attribute a, CustomAttributeBuilder cb) + { + EventBuilder.SetCustomAttribute (cb); + } + + public override AttributeTargets AttributeTargets { + get { + return AttributeTargets.Event; + } + } + public override bool Define (TypeContainer parent) { EventAttributes e_attr = EventAttributes.RTSpecialName | EventAttributes.SpecialName; @@ -4450,58 +4356,34 @@ namespace Mono.MonoBASIC { Parameter [] parms = new Parameter [1]; parms [0] = new Parameter (Type, /* was "value" */ this.Name, Parameter.Modifier.NONE, null); - InternalParameters ip = new InternalParameters ( + /*InternalParameters ip = new InternalParameters ( parent, new Parameters (parms, null, Location)); + */ if (!CheckBase (parent)) return false; - // - // Now define the accessors - // - AddData = new MethodData (this, "add", TypeManager.void_type, - parameter_types, ip, CallingConventions.Standard, - (Add != null) ? Add.OptAttributes : null, - ModFlags, flags, false); - - if (!AddData.Define (parent)) - return false; - - AddBuilder = AddData.MethodBuilder; - AddBuilder.DefineParameter (1, ParameterAttributes.None, /* was "value" */ this.Name); - - RemoveData = new MethodData (this, "remove", TypeManager.void_type, - parameter_types, ip, CallingConventions.Standard, - (Remove != null) ? Remove.OptAttributes : null, - ModFlags, flags, false); - - if (!RemoveData.Define (parent)) - return false; - - RemoveBuilder = RemoveData.MethodBuilder; - RemoveBuilder.DefineParameter (1, ParameterAttributes.None, /* was "value" */ this.Name); + AddBuilder = Add.Define (parent); + RemoveBuilder = Remove.Define (parent); + if (!IsExplicitImpl){ EventBuilder = new MyEventBuilder ( parent.TypeBuilder, Name, e_attr, MemberType); - if (Add == null && Remove == null) { - FieldBuilder = parent.TypeBuilder.DefineField ( - Name, MemberType, + FieldBuilder = parent.TypeBuilder.DefineField (Name, MemberType, FieldAttributes.FamANDAssem | ((ModFlags & Modifiers.STATIC) != 0 ? FieldAttributes.Static : 0)); - TypeManager.RegisterPrivateFieldOfEvent ( - (EventInfo) EventBuilder, FieldBuilder); - TypeManager.RegisterFieldBase (FieldBuilder, this); - } + TypeManager.RegisterPrivateFieldOfEvent ((EventInfo) EventBuilder, FieldBuilder); + TypeManager.RegisterFieldBase (FieldBuilder, this); EventBuilder.SetAddOnMethod (AddBuilder); EventBuilder.SetRemoveOnMethod (RemoveBuilder); if (!TypeManager.RegisterEvent (EventBuilder, AddBuilder, RemoveBuilder)) { Report.Error (111, Location, - "Class `" + parent.Name + - "' already contains a definition for the event `" + - Name + "'"); + "Class `" + parent.Name + + "' already contains a definition for the event `" + + Name + "'"); return false; } } @@ -4509,7 +4391,7 @@ namespace Mono.MonoBASIC { return true; } - void EmitDefaultMethod (EmitContext ec, bool is_add) + public void EmitDefaultMethod (EmitContext ec, bool is_add) { ILGenerator ig = ec.ig; MethodInfo method = null; @@ -4542,529 +4424,22 @@ namespace Mono.MonoBASIC { EmitContext ec; ec = new EmitContext (tc, Location, null, MemberType, ModFlags); - Attribute.ApplyAttributes (ec, EventBuilder, this, OptAttributes, Location); - - if (Add != null) - AddData.Emit (tc, Add.Block, Add); - else { - ILGenerator ig = AddData.MethodBuilder.GetILGenerator (); - ec = new EmitContext (tc, Location, ig, TypeManager.void_type, ModFlags); - EmitDefaultMethod (ec, true); - } - if (Remove != null) - RemoveData.Emit (tc, Remove.Block, Remove); - else { - ILGenerator ig = RemoveData.MethodBuilder.GetILGenerator (); - ec = new EmitContext (tc, Location, ig, TypeManager.void_type, ModFlags); - EmitDefaultMethod (ec, false); - } - } - - } - - // - // FIXME: This does not handle: - // - // int INTERFACENAME [ args ] - // Does not - // - // Only: - // - // int this [ args ] - - public class Indexer : PropertyBase { - - const int AllowedModifiers = - Modifiers.NEW | - Modifiers.PUBLIC | - Modifiers.PROTECTED | - Modifiers.INTERNAL | - Modifiers.PRIVATE | - Modifiers.VIRTUAL | - Modifiers.SEALED | - Modifiers.OVERRIDE | - Modifiers.UNSAFE | - Modifiers.EXTERN | - Modifiers.ABSTRACT; - - public string IndexerName; - public string InterfaceIndexerName; - - // - // Are we implementing an interface ? - // - bool IsImplementing = false; - - public Indexer (Expression type, string int_type, int flags, Parameters parameters, - Accessor get_block, Accessor set_block, Attributes attrs, Location loc) - : base (type, "", flags, AllowedModifiers, parameters, get_block, set_block, - attrs, loc) - { - ExplicitInterfaceName = int_type; - } - - public override bool Define (TypeContainer parent) - { - PropertyAttributes prop_attr = - PropertyAttributes.RTSpecialName | - PropertyAttributes.SpecialName; - - if (!DoDefine (parent)) - return false; - - IndexerName = Attribute.ScanForIndexerName (ec, OptAttributes); - if (IndexerName == null) - IndexerName = "Item"; - else if (IsExplicitImpl) - Report.Error (592, Location, - "Attribute 'IndexerName' is not valid on this declaration " + - "type. It is valid on `property' declarations only."); - - ShortName = IndexerName; - if (IsExplicitImpl) { - InterfaceIndexerName = TypeManager.IndexerPropertyName (InterfaceType); - Name = InterfaceType.FullName + "." + IndexerName; - } else { - InterfaceIndexerName = IndexerName; - Name = ShortName; - } - - if (!CheckBase (parent)) - return false; - - if (Get != null){ - InternalParameters ip = new InternalParameters (parent, Parameters); - - GetData = new MethodData (this, "get", MemberType, - ParameterTypes, ip, CallingConventions.Standard, - Get.OptAttributes, ModFlags, flags, false); - - if (!GetData.Define (parent)) - return false; - - GetBuilder = GetData.MethodBuilder; - } - - if (Set != null){ - int top = ParameterTypes.Length; - Type [] set_pars = new Type [top + 1]; - ParameterTypes.CopyTo (set_pars, 0); - set_pars [top] = MemberType; - - Parameter [] fixed_parms = Parameters.FixedParameters; - - if (fixed_parms == null){ - throw new Exception ("We currently do not support only array arguments in an indexer"); - // BUG BUG BUG BUG BUG BUG BUG BUG BUG BUG - // BUG BUG BUG BUG BUG BUG BUG BUG BUG BUG - // - // Here is the problem: the `value' parameter has - // to come *after* the array parameter in the declaration - // like this: - // X (object [] x, Type value) - // .param [0] - // - // BUG BUG BUG BUG BUG BUG BUG BUG BUG BUG - // BUG BUG BUG BUG BUG BUG BUG BUG BUG BUG - - } - - Parameter [] tmp = new Parameter [fixed_parms.Length + 1]; - - - fixed_parms.CopyTo (tmp, 0); - tmp [fixed_parms.Length] = new Parameter ( - Type, /* was "value" */ this.Name, Parameter.Modifier.NONE, null); - - Parameters set_formal_params = new Parameters (tmp, null, Location); - - InternalParameters ip = new InternalParameters (parent, set_formal_params); - - SetData = new MethodData (this, "set", TypeManager.void_type, - set_pars, ip, CallingConventions.Standard, - Set.OptAttributes, ModFlags, flags, false); - - if (!SetData.Define (parent)) - return false; - - SetBuilder = SetData.MethodBuilder; - } - - // - // Now name the parameters - // - Parameter [] p = Parameters.FixedParameters; - if (p != null) { - int i; - - for (i = 0; i < p.Length; ++i) { - if (Get != null) - GetBuilder.DefineParameter ( - i + 1, p [i].Attributes, p [i].Name); - - if (Set != null) - SetBuilder.DefineParameter ( - i + 1, p [i].Attributes, p [i].Name); - } - - - if (Set != null) - SetBuilder.DefineParameter ( - i + 1, ParameterAttributes.None, /* was "value" */ this.Name); - - if (i != ParameterTypes.Length) { - Parameter array_param = Parameters.ArrayParameter; - SetBuilder.DefineParameter ( - i + 1, array_param.Attributes, array_param.Name); - } - } - - if (GetData != null) - IsImplementing = GetData.IsImplementing; - else if (SetData != null) - IsImplementing = SetData.IsImplementing; - - // - // Define the PropertyBuilder if one of the following conditions are met: - // a) we're not implementing an interface indexer. - // b) the indexer has a different IndexerName and this is no - // explicit interface implementation. - // - if (!IsExplicitImpl) { - PropertyBuilder = parent.TypeBuilder.DefineProperty ( - IndexerName, prop_attr, MemberType, ParameterTypes); - - if (GetData != null) - PropertyBuilder.SetGetMethod (GetBuilder); - - if (SetData != null) - PropertyBuilder.SetSetMethod (SetBuilder); - - TypeManager.RegisterIndexer (PropertyBuilder, GetBuilder, SetBuilder, - ParameterTypes); - } - - return true; - } - } - - public class Operator : MemberCore { - - const int AllowedModifiers = - Modifiers.PUBLIC | - Modifiers.UNSAFE | - Modifiers.EXTERN | - Modifiers.STATIC; - - const int RequiredModifiers = - Modifiers.PUBLIC | - Modifiers.STATIC; - - public enum OpType : byte { - - // Unary operators - LogicalNot, - OnesComplement, - Increment, - Decrement, - True, - False, - - // Unary and Binary operators - Addition, - Subtraction, - - UnaryPlus, - UnaryNegation, - - // Binary operators - Multiply, - Division, - Modulus, - BitwiseAnd, - BitwiseOr, - ExclusiveOr, - LeftShift, - RightShift, - Equality, - Inequality, - GreaterThan, - LessThan, - GreaterThanOrEqual, - LessThanOrEqual, - - // Implicit and Explicit - Implicit, - Explicit - }; - - public readonly OpType OperatorType; - public readonly Expression ReturnType; - public readonly Expression FirstArgType, SecondArgType; - public readonly string FirstArgName, SecondArgName; - public readonly Block Block; - public Attributes OptAttributes; - public MethodBuilder OperatorMethodBuilder; - - public string MethodName; - public Method OperatorMethod; - - public Operator (OpType type, Expression ret_type, int flags, - Expression arg1type, string arg1name, - Expression arg2type, string arg2name, - Block block, Attributes attrs, Location loc) - : base ("", loc) - { - OperatorType = type; - ReturnType = ret_type; - ModFlags = Modifiers.Check (AllowedModifiers, flags, Modifiers.PUBLIC, loc); - FirstArgType = arg1type; - FirstArgName = arg1name; - SecondArgType = arg2type; - SecondArgName = arg2name; - Block = block; - OptAttributes = attrs; - } - - string Prototype (TypeContainer parent) - { - return parent.Name + ".operator " + OperatorType + " (" + FirstArgType + "," + - SecondArgType + ")"; - } - - public override bool Define (TypeContainer parent) - { - int length = 1; - MethodName = "op_" + OperatorType; - - if (SecondArgType != null) - length = 2; - - Parameter [] param_list = new Parameter [length]; - - if ((ModFlags & RequiredModifiers) != RequiredModifiers){ - Report.Error ( - 558, Location, - "User defined operators `" + - Prototype (parent) + - "' must be declared static and public"); - return false; - } - - param_list[0] = new Parameter (FirstArgType, FirstArgName, - Parameter.Modifier.NONE, null); - if (SecondArgType != null) - param_list[1] = new Parameter (SecondArgType, SecondArgName, - Parameter.Modifier.NONE, null); - - OperatorMethod = new Method (ReturnType, ModFlags, MethodName, - new Parameters (param_list, null, Location), - OptAttributes, Mono.MonoBASIC.Location.Null); - - OperatorMethod.IsOperator = true; - OperatorMethod.Define (parent); - - if (OperatorMethod.MethodBuilder == null) - return false; - - OperatorMethodBuilder = OperatorMethod.MethodBuilder; - - Type [] param_types = OperatorMethod.ParameterTypes; - Type declaring_type = OperatorMethodBuilder.DeclaringType; - Type return_type = OperatorMethod.GetReturnType (); - Type first_arg_type = param_types [0]; - - // Rules for conversion operators - - if (OperatorType == OpType.Implicit || OperatorType == OpType.Explicit) { - if (first_arg_type == return_type && first_arg_type == declaring_type){ - Report.Error ( - 555, Location, - "User-defined conversion cannot take an object of the " + - "enclosing type and convert to an object of the enclosing" + - " type"); - return false; - } - - if (first_arg_type != declaring_type && return_type != declaring_type){ - Report.Error ( - 556, Location, - "User-defined conversion must convert to or from the " + - "enclosing type"); - return false; - } - - if (first_arg_type == TypeManager.object_type || - return_type == TypeManager.object_type){ - Report.Error ( - -8, Location, - "User-defined conversion cannot convert to or from " + - "object type"); - return false; - } - - if (first_arg_type.IsInterface || return_type.IsInterface){ - Report.Error ( - 552, Location, - "User-defined conversion cannot convert to or from an " + - "interface type"); - return false; - } - - if (first_arg_type.IsSubclassOf (return_type) || - return_type.IsSubclassOf (first_arg_type)){ - Report.Error ( - -10, Location, - "User-defined conversion cannot convert between types " + - "that derive from each other"); - return false; - } - } else if (SecondArgType == null) { - // Checks for Unary operators - - if (first_arg_type != declaring_type){ - Report.Error ( - 562, Location, - "The parameter of a unary operator must be the " + - "containing type"); - return false; - } - - if (OperatorType == OpType.Increment || OperatorType == OpType.Decrement) { - if (return_type != declaring_type){ - Report.Error ( - 559, Location, - "The parameter and return type for ++ and -- " + - "must be the containing type"); - return false; - } - - } - - if (OperatorType == OpType.True || OperatorType == OpType.False) { - if (return_type != TypeManager.bool_type){ - Report.Error ( - 215, Location, - "The return type of operator True or False " + - "must be bool"); - return false; - } - } - - } else { - // Checks for Binary operators - - if (first_arg_type != declaring_type && - param_types [1] != declaring_type){ - Report.Error ( - 563, Location, - "One of the parameters of a binary operator must " + - "be the containing type"); - return false; - } - } + if (OptAttributes != null) + OptAttributes.Emit (ec, this); - return true; + Add.Emit (tc); + Remove.Emit (tc); } - - public void Emit (TypeContainer parent) - { - EmitContext ec = new EmitContext (parent, Location, null, null, ModFlags); - Attribute.ApplyAttributes (ec, OperatorMethodBuilder, this, OptAttributes, Location); - // - // abstract or extern methods have no bodies - // - if ((ModFlags & (Modifiers.ABSTRACT | Modifiers.EXTERN)) != 0) - return; - - OperatorMethod.Block = Block; - OperatorMethod.Emit (parent); - } - - public static string GetName (OpType ot) - { - switch (ot){ - case OpType.LogicalNot: - return "!"; - case OpType.OnesComplement: - return "~"; - case OpType.Increment: - return "++"; - case OpType.Decrement: - return "--"; - case OpType.True: - return "true"; - case OpType.False: - return "false"; - case OpType.Addition: - return "+"; - case OpType.Subtraction: - return "-"; - case OpType.UnaryPlus: - return "+"; - case OpType.UnaryNegation: - return "-"; - case OpType.Multiply: - return "*"; - case OpType.Division: - return "/"; - case OpType.Modulus: - return "%"; - case OpType.BitwiseAnd: - return "&"; - case OpType.BitwiseOr: - return "|"; - case OpType.ExclusiveOr: - return "^"; - case OpType.LeftShift: - return "<<"; - case OpType.RightShift: - return ">>"; - case OpType.Equality: - return "=="; - case OpType.Inequality: - return "!="; - case OpType.GreaterThan: - return ">"; - case OpType.LessThan: - return "<"; - case OpType.GreaterThanOrEqual: - return ">="; - case OpType.LessThanOrEqual: - return "<="; - case OpType.Implicit: - return "implicit"; - case OpType.Explicit: - return "explicit"; - default: return ""; + public MethodAttributes MethodAttributeFlags { + get { + return flags; } } - public override string ToString () - { - Type return_type = OperatorMethod.GetReturnType(); - Type [] param_types = OperatorMethod.ParameterTypes; - - if (SecondArgType == null) - return String.Format ( - "{0} operator {1}({2})", - TypeManager.MonoBASIC_Name (return_type), - GetName (OperatorType), - param_types [0]); - else - return String.Format ( - "{0} operator {1}({2}, {3})", - TypeManager.MonoBASIC_Name (return_type), - GetName (OperatorType), - param_types [0], param_types [1]); - } } - // - // This is used to compare method signatures - // struct MethodSignature { public string Name; public Type RetType;