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; }
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); }
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); }
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; }