Ejemplo n.º 1
0
        void CompleteMethodSig(MethodReference meth, MethodSig sig)
        {
            sig.HasThis = meth.HasThis;
            sig.ExplicitThis = meth.ExplicitThis;
            if (sig.HasThis)
                sig.CallingConvention |= 0x20;
            if (sig.ExplicitThis)
                sig.CallingConvention |= 0x40;

            if ((meth.CallingConvention & MethodCallingConvention.VarArg) != 0)
                sig.CallingConvention |= 0x5;

            sig.ParamCount = meth.Parameters.Count;
            sig.Parameters = GetParametersSig (meth.Parameters);

            RetType rtSig = new RetType ();
            rtSig.CustomMods = GetCustomMods (meth.ReturnType.ReturnType);

            if (meth.ReturnType.ReturnType.FullName == Constants.Void)
                rtSig.Void = true;
            else if (meth.ReturnType.ReturnType.FullName == Constants.TypedReference)
                rtSig.TypedByRef = true;
            else if (meth.ReturnType.ReturnType is ReferenceType) {
                rtSig.ByRef = true;
                rtSig.Type = GetSigType (
                    (meth.ReturnType.ReturnType as ReferenceType).ElementType);
            } else
                rtSig.Type = GetSigType (meth.ReturnType.ReturnType);

            sig.RetType = rtSig;
        }
Ejemplo n.º 2
0
        public static void CreateSentinelIfNeeded(IMethodSignature meth, MethodSig signature)
        {
            MethodDefSig sig = signature as MethodDefSig;
            if (sig == null)
                return;

            int sentinel = sig.Sentinel;

            if (sig.Sentinel < 0 || sig.Sentinel >= meth.Parameters.Count)
                return;

            ParameterDefinition param = meth.Parameters [sentinel];
            param.ParameterType = new SentinelType (param.ParameterType);
        }
Ejemplo n.º 3
0
        public MethodReturnType GetMethodReturnType(MethodSig msig, GenericContext context)
        {
            TypeReference retType;
            if (msig.RetType.Void)
                retType = SearchCoreType (Constants.Void);
            else if (msig.RetType.ByRef)
                retType = new ReferenceType (GetTypeRefFromSig (msig.RetType.Type, context));
            else if (msig.RetType.TypedByRef)
                retType = SearchCoreType (Constants.TypedReference);
            else
                retType = GetTypeRefFromSig (msig.RetType.Type, context);

            retType = GetModifierType (msig.RetType.CustomMods, retType);

            return new MethodReturnType (retType);
        }
Ejemplo n.º 4
0
        MethodReference CreateMethodReferenceFromSig(MethodSig ms, string name, TypeReference declaringType, GenericContext context)
        {
            MethodReference methref = new MethodReference (
                name, ms.HasThis, ms.ExplicitThis, ms.MethCallConv);
            methref.DeclaringType = declaringType;

            if (ms is MethodDefSig) {
                int arity = (ms as MethodDefSig).GenericParameterCount;
                for (int i = 0; i < arity; i++)
                    methref.GenericParameters.Add (new GenericParameter (i, methref));
            }

            if (methref.GenericParameters.Count > 0)
                context.Method = methref;

            methref.ReturnType = GetMethodReturnType (ms, context);

            methref.ReturnType.Method = methref;
            for (int j = 0; j < ms.ParamCount; j++) {
                Param p = ms.Parameters [j];
                ParameterDefinition pdef = BuildParameterDefinition (j, p, context);
                pdef.Method = methref;
                methref.Parameters.Add (pdef);
            }

            CreateSentinelIfNeeded (methref, ms);

            return methref;
        }