X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fmcs%2Fmethod.cs;h=7c7e12e10858008c4526f82f1abd9d05550b1ffe;hb=3e476138366f3dd57de9c1c65961adb3e1321e31;hp=1ed1913a85b43757d784d7976494230f9ebf63ea;hpb=9c05ae86ad8ca9ac33546be6d616828d75af4372;p=mono.git diff --git a/mcs/mcs/method.cs b/mcs/mcs/method.cs index 1ed1913a85b..7c7e12e1085 100644 --- a/mcs/mcs/method.cs +++ b/mcs/mcs/method.cs @@ -164,8 +164,8 @@ namespace Mono.CSharp { MethodBase metaInfo; readonly AParametersCollection parameters; - public MethodSpec (IMemberDefinition details, MethodBase info, AParametersCollection parameters, Modifiers modifiers) - : base (details, info.Name, modifiers) + public MethodSpec (MemberKind kind, IMemberDefinition details, MethodBase info, AParametersCollection parameters, Modifiers modifiers) + : base (kind, details, info.Name, modifiers) { this.MetaInfo = info; this.parameters = parameters; @@ -190,12 +190,12 @@ namespace Mono.CSharp { // TODO: Does not work on .NET var par = TypeManager.GetParameterData (mb); - return new MethodSpec (definition, mb, par, modifiers); + return new MethodSpec (Kind, definition, mb, par, Modifiers); } public bool IsAbstract { get { - return (modifiers & Modifiers.ABSTRACT) != 0; + return (Modifiers & Modifiers.ABSTRACT) != 0; } } @@ -214,7 +214,7 @@ namespace Mono.CSharp { // When is virtual or abstract public bool IsVirtual { get { - return (modifiers & (Modifiers.VIRTUAL | Modifiers.ABSTRACT | Modifiers.OVERRIDE)) != 0; + return (Modifiers & (Modifiers.VIRTUAL | Modifiers.ABSTRACT | Modifiers.OVERRIDE)) != 0; } } @@ -338,6 +338,14 @@ namespace Mono.CSharp { ModFlags |= Modifiers.DEBUGGER_HIDDEN; } + MemberKind kind; + if (this is Operator) + kind = MemberKind.Operator; + else if (this is Destructor) + kind = MemberKind.Destructor; + else + kind = MemberKind.Method; + if (IsPartialDefinition) { caching_flags &= ~Flags.Excluded_Undetected; caching_flags |= Flags.Excluded; @@ -345,10 +353,10 @@ namespace Mono.CSharp { // Add to member cache only when a partial method implementation has not been found yet if ((caching_flags & Flags.PartialDefinitionExists) == 0) { MethodBase mb = new PartialMethodDefinitionInfo (this); - Parent.MemberCache.AddMember (mb, this); - TypeManager.AddMethod (mb, this); - spec = new MethodSpec (this, mb, Parameters, ModFlags); + spec = new MethodSpec (kind, this, mb, Parameters, ModFlags); + Parent.MemberCache.AddMember (mb, spec); + TypeManager.AddMethod (mb, this); } return true; @@ -362,12 +370,12 @@ namespace Mono.CSharp { MethodBuilder = MethodData.MethodBuilder; - spec = new MethodSpec (this, MethodBuilder, Parameters, ModFlags); + spec = new MethodSpec (kind, this, MethodBuilder, Parameters, ModFlags); if (TypeManager.IsGenericMethod (MethodBuilder)) Parent.MemberCache.AddGenericMember (MethodBuilder, this); - Parent.MemberCache.AddMember (MethodBuilder, this); + Parent.MemberCache.AddMember (MethodBuilder, spec); return true; } @@ -627,7 +635,7 @@ namespace Mono.CSharp { FullNamedExpression return_type, Modifiers mod, MemberName name, ParametersCompiled parameters, Attributes attrs) : base (parent, generic, return_type, mod, - parent.PartialContainer.Kind == Kind.Interface ? AllowedInterfaceModifiers : AllowedModifiers, + parent.PartialContainer.Kind == MemberKind.Interface ? AllowedInterfaceModifiers : AllowedModifiers, name, attrs, parameters) { } @@ -1184,7 +1192,7 @@ namespace Mono.CSharp { Parent.MemberCache.CheckExistingMembersOverloads (this, ConstructorInfo.ConstructorName, Parameters, Report); - if (Parent.PartialContainer.Kind == Kind.Struct) { + if (Parent.PartialContainer.Kind == MemberKind.Struct) { if (Parameters.Count == 0) { Report.Error (568, Location, "Structs cannot contain explicit parameterless constructors"); @@ -1237,7 +1245,7 @@ namespace Mono.CSharp { ca, CallingConventions, Parameters.GetEmitTypes ()); - spec = new MethodSpec (this, ConstructorBuilder, Parameters, ModFlags); + spec = new MethodSpec (MemberKind.Constructor, this, ConstructorBuilder, Parameters, ModFlags); if (Parent.PartialContainer.IsComImport) { if (!IsDefault ()) { @@ -1247,7 +1255,7 @@ namespace Mono.CSharp { ConstructorBuilder.SetImplementationFlags (MethodImplAttributes.InternalCall); } - Parent.MemberCache.AddMember (ConstructorBuilder, this); + Parent.MemberCache.AddMember (ConstructorBuilder, spec); TypeManager.AddMethod (ConstructorBuilder, this); // It's here only to report an error @@ -1288,12 +1296,12 @@ namespace Mono.CSharp { if (block != null) { // If this is a non-static `struct' constructor and doesn't have any // initializer, it must initialize all of the struct's fields. - if ((Parent.PartialContainer.Kind == Kind.Struct) && + if ((Parent.PartialContainer.Kind == MemberKind.Struct) && ((ModFlags & Modifiers.STATIC) == 0) && (Initializer == null)) block.AddThisVariable (Parent, Location); if (block != null && (ModFlags & Modifiers.STATIC) == 0){ - if (Parent.PartialContainer.Kind == Kind.Class && Initializer == null) + if (Parent.PartialContainer.Kind == MemberKind.Class && Initializer == null) Initializer = new GeneratedBaseInitializer (Location); if (Initializer != null) { @@ -2012,8 +2020,7 @@ namespace Mono.CSharp { return true; } - public override bool IsUsed - { + public override bool IsUsed { get { if (IsDummy) return false; @@ -2022,6 +2029,8 @@ namespace Mono.CSharp { } } + public MethodSpec Spec { get; protected set; } + // // Represents header string for documentation comment. // @@ -2315,6 +2324,16 @@ namespace Mono.CSharp { return null; } + public static OpType? GetType (string metadata_name) + { + for (int i = 0; i < names.Length; ++i) { + if (names[i][1] == metadata_name) + return (OpType) i; + } + + return null; + } + public OpType GetMatchingOperator () { switch (OperatorType) {