Esempio n. 1
0
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="flags">Flags</param>
 /// <param name="genericParameterCount">Number of generic parameters</param>
 /// <param name="returnType">Return type</param>
 /// <param name="parameterTypes">Parameter types or null</param>
 /// <param name="varArgsParameterTypes">Var args parameter types or null</param>
 public DmdMethodSignature(DmdSignatureCallingConvention flags, int genericParameterCount, DmdType returnType, IList <DmdType> parameterTypes, IList <DmdType> varArgsParameterTypes)
 {
     if (genericParameterCount < 0)
     {
         throw new ArgumentOutOfRangeException(nameof(genericParameterCount));
     }
     Flags = flags;
     GenericParameterCount      = genericParameterCount;
     ReturnType                 = returnType ?? throw new ArgumentNullException(nameof(returnType));
     this.parameterTypes        = ReadOnlyCollectionHelpers.Create(parameterTypes);
     this.varArgsParameterTypes = ReadOnlyCollectionHelpers.Create(varArgsParameterTypes);
 }
Esempio n. 2
0
 /// <summary>
 /// Makes a function pointer type
 /// </summary>
 /// <param name="flags">Flags</param>
 /// <param name="genericParameterCount">Number of generic parameters</param>
 /// <param name="returnType">Return type</param>
 /// <param name="parameterTypes">Parameter types</param>
 /// <param name="varArgsParameterTypes">VarArgs parameter types</param>
 /// <param name="customModifiers">Custom modifiers or null</param>
 /// <param name="options">Options</param>
 /// <returns></returns>
 public abstract DmdType MakeFunctionPointerType(DmdSignatureCallingConvention flags, int genericParameterCount, DmdType returnType, IList <DmdType> parameterTypes, IList <DmdType> varArgsParameterTypes, IList <DmdCustomModifier> customModifiers, DmdMakeTypeOptions options = DmdMakeTypeOptions.None);
Esempio n. 3
0
        public DmdType Create(CorType type)
        {
            if (type == null)
            {
                throw new ArgumentNullException(nameof(type));
            }
            if (recursionCounter++ > 100)
            {
                throw new InvalidOperationException();
            }

            DmdType        result;
            List <DmdType> types;

            switch (type.ElementType)
            {
            case CorElementType.Void:               result = reflectionAppDomain.System_Void; break;

            case CorElementType.Boolean:    result = reflectionAppDomain.System_Boolean; break;

            case CorElementType.Char:               result = reflectionAppDomain.System_Char; break;

            case CorElementType.I1:                 result = reflectionAppDomain.System_SByte; break;

            case CorElementType.U1:                 result = reflectionAppDomain.System_Byte; break;

            case CorElementType.I2:                 result = reflectionAppDomain.System_Int16; break;

            case CorElementType.U2:                 result = reflectionAppDomain.System_UInt16; break;

            case CorElementType.I4:                 result = reflectionAppDomain.System_Int32; break;

            case CorElementType.U4:                 result = reflectionAppDomain.System_UInt32; break;

            case CorElementType.I8:                 result = reflectionAppDomain.System_Int64; break;

            case CorElementType.U8:                 result = reflectionAppDomain.System_UInt64; break;

            case CorElementType.R4:                 result = reflectionAppDomain.System_Single; break;

            case CorElementType.R8:                 result = reflectionAppDomain.System_Double; break;

            case CorElementType.String:             result = reflectionAppDomain.System_String; break;

            case CorElementType.TypedByRef: result = reflectionAppDomain.System_TypedReference; break;

            case CorElementType.I:                  result = reflectionAppDomain.System_IntPtr; break;

            case CorElementType.U:                  result = reflectionAppDomain.System_UIntPtr; break;

            case CorElementType.Object:             result = reflectionAppDomain.System_Object; break;

            case CorElementType.Ptr:
                result = Create(type.FirstTypeParameter).MakePointerType();
                break;

            case CorElementType.ByRef:
                result = Create(type.FirstTypeParameter).MakeByRefType();
                break;

            case CorElementType.SZArray:
                result = Create(type.FirstTypeParameter).MakeArrayType();
                break;

            case CorElementType.Array:
                result = Create(type.FirstTypeParameter).MakeArrayType((int)type.Rank);
                break;

            case CorElementType.ValueType:
            case CorElementType.Class:
                var cl             = type.Class ?? throw new InvalidOperationException();
                var module         = engine.TryGetModule(cl.Module)?.GetReflectionModule() ?? throw new InvalidOperationException();
                var reflectionType = module.ResolveType((int)cl.Token, DmdResolveOptions.ThrowOnError);
                if (reflectionType.GetGenericArguments().Count != 0)
                {
                    types = GetTypesList();
                    foreach (var t in type.TypeParameters)
                    {
                        types.Add(Create(t));
                    }
                    Debug.Assert(types.Count == 0 || reflectionType.GetGenericArguments().Count == types.Count);
                    if (types.Count != 0)
                    {
                        reflectionType = reflectionType.MakeGenericType(types.ToArray());
                    }
                    FreeTypesList(ref types);
                }
                result = reflectionType;
                break;

            case CorElementType.FnPtr:
                DmdType returnType = null;
                types = null;
                foreach (var t in type.TypeParameters)
                {
                    if ((object)returnType == null)
                    {
                        returnType = Create(t);
                    }
                    else
                    {
                        if (types == null)
                        {
                            types = GetTypesList();
                        }
                        types.Add(Create(t));
                    }
                }
                if ((object)returnType == null)
                {
                    throw new InvalidOperationException();
                }
                //TODO: Guessing FnPtr calling convention
                const DmdSignatureCallingConvention fnPtrCallingConvention = DmdSignatureCallingConvention.C;
                //TODO: We're assuming varArgsParameterTypes is empty
                result = reflectionAppDomain.MakeFunctionPointerType(fnPtrCallingConvention, 0, returnType, types?.ToArray() ?? Array.Empty <DmdType>(), Array.Empty <DmdType>(), null);
                FreeTypesList(ref types);
                break;

            case CorElementType.GenericInst:
            case CorElementType.Var:
            case CorElementType.MVar:
            case CorElementType.End:
            case CorElementType.ValueArray:
            case CorElementType.R:
            case CorElementType.CModReqd:
            case CorElementType.CModOpt:
            case CorElementType.Internal:
            case CorElementType.Module:
            case CorElementType.Sentinel:
            case CorElementType.Pinned:
            default:
                Debug.Fail($"Unsupported element type: {type.ElementType}");
                throw new InvalidOperationException();
            }

            recursionCounter--;
            return(result);
        }