示例#1
0
 public static (DmdType fieldType, DmdMethodSignature methodSignature, bool containedGenericParams) ReadMethodSignatureOrFieldType(DmdModule module, DmdDataStream reader, IList <DmdType> genericTypeArguments, IList <DmdType> genericMethodArguments, bool resolve)
 {
     try {
         using (var sigReader = new DmdSignatureReader(module, reader, genericTypeArguments, genericMethodArguments, resolve)) {
             var flags = (DmdSignatureCallingConvention)reader.ReadByte();
             if ((flags & DmdSignatureCallingConvention.Mask) == DmdSignatureCallingConvention.Field)
             {
                 var fieldType = sigReader.ReadType().type;
                 return(fieldType, null, sigReader.containedGenericParams);
             }
             else
             {
                 sigReader.ReadMethodSignature(flags, out var genericParameterCount, out var returnType, out var parameterTypes, out var varArgsParameterTypes);
                 if ((flags & DmdSignatureCallingConvention.Mask) != DmdSignatureCallingConvention.Property)
                 {
                     var methodSignature = new DmdMethodSignature(flags, genericParameterCount, returnType, parameterTypes, varArgsParameterTypes);
                     return(null, methodSignature, sigReader.containedGenericParams);
                 }
             }
         }
     }
     catch (IOException) {
     }
     catch (OutOfMemoryException) {
     }
     return(module.AppDomain.System_Void, null, false);
 }
示例#2
0
 public DmdConstructorRef(DmdType declaringTypeRef, string name, DmdMethodSignature rawMethodSignature, DmdMethodSignature methodSignature)
 {
     this.declaringTypeRef = declaringTypeRef ?? throw new ArgumentNullException(nameof(declaringTypeRef));
     Name = name ?? throw new ArgumentNullException(nameof(name));
     this.rawMethodSignature = rawMethodSignature ?? throw new ArgumentNullException(nameof(rawMethodSignature));
     this.methodSignature    = methodSignature ?? throw new ArgumentNullException(nameof(methodSignature));
 }
示例#3
0
 public DmdMethodDefMD(DmdEcma335MetadataReader reader, RawMethodRow row, uint rid, string name, DmdType declaringType, DmdType reflectedType) : base(rid, declaringType, reflectedType)
 {
     this.reader = reader ?? throw new ArgumentNullException(nameof(reader));
     MethodImplementationFlags = (DmdMethodImplAttributes)row.ImplFlags;
     Attributes      = (DmdMethodAttributes)row.Flags;
     Name            = name ?? throw new ArgumentNullException(nameof(name));
     methodSignature = reader.ReadMethodSignature(row.Signature, DeclaringType.GetGenericArguments(), GetGenericArguments(), isProperty: false);
 }
 public DmdFunctionPointerType(DmdAppDomain appDomain, DmdMethodSignature methodSignature, IList <DmdCustomModifier> customModifiers) : base(customModifiers)
 {
     AppDomain            = appDomain ?? throw new ArgumentNullException(nameof(appDomain));
     this.methodSignature = methodSignature ?? throw new ArgumentNullException(nameof(methodSignature));
     IsFullyResolved      = ((DmdTypeBase)methodSignature.ReturnType).IsFullyResolved &&
                            DmdTypeUtilities.IsFullyResolved(methodSignature.GetParameterTypes()) &&
                            DmdTypeUtilities.IsFullyResolved(methodSignature.GetVarArgsParameterTypes());
 }
示例#5
0
 public DmdMethodDefCOMD(DmdComMetadataReader reader, DmdMethodAttributes attributes, DmdMethodImplAttributes implementationFlags, uint rid, string name, DmdType declaringType, DmdType reflectedType) : base(rid, declaringType, reflectedType)
 {
     this.reader = reader ?? throw new ArgumentNullException(nameof(reader));
     reader.Dispatcher.VerifyAccess();
     MethodImplementationFlags = implementationFlags;
     Attributes      = attributes;
     Name            = name ?? throw new ArgumentNullException(nameof(name));
     methodSignature = reader.ReadMethodSignature_COMThread(MDAPI.GetMethodSignatureBlob(reader.MetaDataImport, 0x06000000 + rid), DeclaringType.GetGenericArguments(), GetGenericArguments(), isProperty: false);
 }
示例#6
0
        public DmdPropertyDefMD(DmdEcma335MetadataReader reader, uint rid, DmdType declaringType, DmdType reflectedType) : base(rid, declaringType, reflectedType)
        {
            this.reader = reader ?? throw new ArgumentNullException(nameof(reader));
            var row = reader.TablesStream.ReadPropertyRow(rid);

            Name            = reader.StringsStream.ReadNoNull(row.Name);
            Attributes      = (DmdPropertyAttributes)row.PropFlags;
            methodSignature = reader.ReadMethodSignature(row.Type, DeclaringType.GetGenericArguments(), null, isProperty: true);
        }
示例#7
0
        public DmdPropertyDefCOMD(DmdComMetadataReader reader, uint rid, DmdType declaringType, DmdType reflectedType) : base(rid, declaringType, reflectedType)
        {
            this.reader = reader ?? throw new ArgumentNullException(nameof(reader));
            reader.Dispatcher.VerifyAccess();
            uint token = 0x17000000 + rid;

            Name            = MDAPI.GetPropertyName(reader.MetaDataImport, token) ?? string.Empty;
            Attributes      = MDAPI.GetPropertyAttributes(reader.MetaDataImport, token);
            methodSignature = reader.ReadMethodSignature_COMThread(MDAPI.GetPropertySignatureBlob(reader.MetaDataImport, token), DeclaringType !.GetGenericArguments(), null, isProperty: true);
        }
示例#8
0
        DmdMethodBase CreateMethod(DmdType reflectedType, DmdSpecialMethodKind specialMethodKind, string name, DmdType returnType, params DmdType[] parameterTypes)
        {
            var flags = DmdSignatureCallingConvention.Default | DmdSignatureCallingConvention.HasThis;
            var sig   = new DmdMethodSignature(flags, 0, returnType, parameterTypes, null);

            if (name == DmdConstructorInfo.ConstructorName)
            {
                return(new DmdCreatedConstructorDef(specialMethodKind, name, sig, this, reflectedType));
            }
            return(new DmdCreatedMethodDef(specialMethodKind, name, sig, this, reflectedType));
        }
示例#9
0
        static IList <DmdType> GetAllMethodParameterTypes(DmdMethodSignature sig)
        {
            if (sig.GetVarArgsParameterTypes().Count == 0)
            {
                return(sig.GetParameterTypes());
            }
            var list = new List <DmdType>(sig.GetParameterTypes().Count + sig.GetVarArgsParameterTypes().Count);

            list.AddRange(sig.GetParameterTypes());
            list.AddRange(sig.GetVarArgsParameterTypes());
            return(list);
        }
示例#10
0
        public static (DmdMethodSignature methodSignature, bool containedGenericParams) ReadMethodSignature(DmdModule module, DmdDataStream reader, IList <DmdType> genericTypeArguments, IList <DmdType> genericMethodArguments, bool isProperty, bool resolve)
        {
            try {
                using (var sigReader = new DmdSignatureReader(module, reader, genericTypeArguments, genericMethodArguments, resolve)) {
                    sigReader.ReadMethodSignature(out var flags, out var genericParameterCount, out var returnType, out var parameterTypes, out var varArgsParameterTypes);
                    if (((flags & DmdSignatureCallingConvention.Mask) == DmdSignatureCallingConvention.Property) == isProperty)
                    {
                        var methodSignature = new DmdMethodSignature(flags, genericParameterCount, returnType, parameterTypes, varArgsParameterTypes);
                        return(methodSignature, sigReader.containedGenericParams);
                    }
                }
            }
            catch (IOException) {
            }
            catch (OutOfMemoryException) {
            }
            var dummySig = new DmdMethodSignature(isProperty ? DmdSignatureCallingConvention.Property : DmdSignatureCallingConvention.Default, 0, module.AppDomain.System_Void, null, null);

            return(dummySig, false);
        }
示例#11
0
 /// <summary>
 /// Calls a static method or returns false on failure
 /// </summary>
 /// <param name="methodAddress">Method address</param>
 /// <param name="methodSig">Method signature</param>
 /// <param name="arguments">Method arguments</param>
 /// <param name="returnValue">Return value. It's ignored if the method returns <see cref="void"/></param>
 /// <returns></returns>
 public abstract bool CallStaticIndirect(DmdMethodSignature methodSig, ILValue methodAddress, ILValue[] arguments, out ILValue returnValue);
示例#12
0
 public override bool CallStaticIndirect(DmdMethodSignature methodSig, ILValue methodAddress, ILValue[] arguments, out ILValue returnValue)
 {
     returnValue = null;
     return(false);           //TODO:
 }
示例#13
0
 public DmdCreatedConstructorDef(DmdSpecialMethodKind specialMethodKind, string name, DmdMethodSignature methodSignature, DmdType declaringType, DmdType reflectedType) : base(0, declaringType, reflectedType)
 {
     SpecialMethodKind = specialMethodKind;
     Name = name ?? throw new ArgumentNullException(nameof(name));
     this.methodSignature = methodSignature ?? throw new ArgumentNullException(nameof(methodSignature));
 }
示例#14
0
 public DmdMethodSpec(DmdMethodDef genericMethodDefinition, IList <DmdType> genericArguments)
 {
     this.genericMethodDefinition = genericMethodDefinition ?? throw new ArgumentNullException(nameof(genericMethodDefinition));
     methodSignature       = genericMethodDefinition.GetMethodSignature(genericArguments);
     this.genericArguments = ReadOnlyCollectionHelpers.Create(genericArguments);
 }
示例#15
0
 /// <summary>
 /// Calls an instance method or returns false on failure
 /// </summary>
 /// <param name="methodAddress">Method address</param>
 /// <param name="methodSig">Method signature</param>
 /// <param name="arguments">Method arguments</param>
 /// <param name="returnValue">Return value. It's ignored if the method returns <see cref="void"/></param>
 /// <returns></returns>
 public virtual bool CallIndirect(DmdMethodSignature methodSig, ILValue methodAddress, ILValue[] arguments, out ILValue?returnValue)
 {
     returnValue = null;
     return(false);
 }
示例#16
0
 public DmdMethodRefMD(DmdEcma335MetadataReader reader, uint signature, IList <DmdType> genericTypeArguments, DmdType declaringTypeRef, string name, DmdMethodSignature rawMethodSignature, DmdMethodSignature methodSignature)
     : base(declaringTypeRef, name, rawMethodSignature, methodSignature)
 {
     this.reader = reader ?? throw new ArgumentNullException(nameof(reader));
     this.genericTypeArguments = genericTypeArguments;
     this.signature            = signature;
 }