Пример #1
0
        protected override bool DoResolveParameters(ResolveContext rc)
        {
            //
            // Only explicit parameters can be resolved at this point
            //
            if (HasExplicitParameters)
            {
                return(Parameters.Resolve(rc));
            }

            return(true);
        }
Пример #2
0
        public override Expression DoResolve(EmitContext ec)
        {
            //
            // Only explicit parameters can be resolved at this point
            //
            if (HasExplicitParameters)
            {
                if (!Parameters.Resolve(ec))
                {
                    return(null);
                }
            }

            eclass = ExprClass.Value;
            type   = TypeManager.anonymous_method_type;
            return(this);
        }
Пример #3
0
        public override Expression DoResolve(ResolveContext ec)
        {
            //
            // Only explicit parameters can be resolved at this point
            //
            if (HasExplicitParameters)
            {
                if (!Parameters.Resolve(ec))
                {
                    return(null);
                }
            }

            eclass = ExprClass.Value;
            type   = InternalType.AnonymousMethod;
            return(this);
        }
Пример #4
0
        public override bool Define()
        {
#if GMCS_SOURCE
            if (IsGeneric)
            {
                foreach (TypeParameter type_param in TypeParameters)
                {
                    if (!type_param.Resolve(this))
                    {
                        return(false);
                    }
                }

                foreach (TypeParameter type_param in TypeParameters)
                {
                    if (!type_param.DefineType(this))
                    {
                        return(false);
                    }
                }
            }
#endif
            member_cache = new MemberCache(TypeManager.multicast_delegate_type, this);

            // FIXME: POSSIBLY make this static, as it is always constant
            //
            Type [] const_arg_types = new Type [2];
            const_arg_types [0] = TypeManager.object_type;
            const_arg_types [1] = TypeManager.intptr_type;

            const MethodAttributes ctor_mattr = MethodAttributes.RTSpecialName | MethodAttributes.SpecialName |
                                                MethodAttributes.HideBySig | MethodAttributes.Public;

            ConstructorBuilder = TypeBuilder.DefineConstructor(ctor_mattr,
                                                               CallingConventions.Standard,
                                                               const_arg_types);

            ConstructorBuilder.DefineParameter(1, ParameterAttributes.None, "object");
            ConstructorBuilder.DefineParameter(2, ParameterAttributes.None, "method");
            //
            // HACK because System.Reflection.Emit is lame
            //
            IParameterData [] fixed_pars = new IParameterData [] {
                new ParameterData("object", Parameter.Modifier.NONE),
                new ParameterData("method", Parameter.Modifier.NONE)
            };

            AParametersCollection const_parameters = new ParametersCollection(
                fixed_pars,
                new Type[] { TypeManager.object_type, TypeManager.intptr_type });

            TypeManager.RegisterMethod(ConstructorBuilder, const_parameters);
            member_cache.AddMember(ConstructorBuilder, this);

            ConstructorBuilder.SetImplementationFlags(MethodImplAttributes.Runtime);

            //
            // Here the various methods like Invoke, BeginInvoke etc are defined
            //
            // First, call the `out of band' special method for
            // defining recursively any types we need:

            if (!Parameters.Resolve(this))
            {
                return(false);
            }

            //
            // Invoke method
            //

            // Check accessibility
            foreach (Type partype in Parameters.Types)
            {
                if (!IsAccessibleAs(partype))
                {
                    Report.SymbolRelatedToPreviousError(partype);
                    Report.Error(59, Location,
                                 "Inconsistent accessibility: parameter type `{0}' is less accessible than delegate `{1}'",
                                 TypeManager.CSharpName(partype),
                                 GetSignatureForError());
                    return(false);
                }
            }

            ReturnType = ReturnType.ResolveAsTypeTerminal(this, false);
            if (ReturnType == null)
            {
                return(false);
            }

            ret_type = ReturnType.Type;

            if (!IsAccessibleAs(ret_type))
            {
                Report.SymbolRelatedToPreviousError(ret_type);
                Report.Error(58, Location,
                             "Inconsistent accessibility: return type `" +
                             TypeManager.CSharpName(ret_type) + "' is less " +
                             "accessible than delegate `" + GetSignatureForError() + "'");
                return(false);
            }

            CheckProtectedModifier();

            if (RootContext.StdLib && TypeManager.IsSpecialType(ret_type))
            {
                Method.Error1599(Location, ret_type);
                return(false);
            }

            //
            // We don't have to check any others because they are all
            // guaranteed to be accessible - they are standard types.
            //

            CallingConventions cc = Parameters.CallingConvention;

            InvokeBuilder = TypeBuilder.DefineMethod("Invoke",
                                                     mattr,
                                                     cc,
                                                     ret_type,
                                                     Parameters.GetEmitTypes());

            InvokeBuilder.SetImplementationFlags(MethodImplAttributes.Runtime);

            TypeManager.RegisterMethod(InvokeBuilder, Parameters);
            member_cache.AddMember(InvokeBuilder, this);

            if (TypeManager.iasyncresult_type != null && TypeManager.asynccallback_type != null)
            {
                DefineAsyncMethods(cc);
            }

            return(true);
        }