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); }
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)); }
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()); }
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); }
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); }
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); }
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)); }
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); }
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); }
/// <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);
public override bool CallStaticIndirect(DmdMethodSignature methodSig, ILValue methodAddress, ILValue[] arguments, out ILValue returnValue) { returnValue = null; return(false); //TODO: }
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)); }
public DmdMethodSpec(DmdMethodDef genericMethodDefinition, IList <DmdType> genericArguments) { this.genericMethodDefinition = genericMethodDefinition ?? throw new ArgumentNullException(nameof(genericMethodDefinition)); methodSignature = genericMethodDefinition.GetMethodSignature(genericArguments); this.genericArguments = ReadOnlyCollectionHelpers.Create(genericArguments); }
/// <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); }
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; }