/// <summary> /// Extracts the method signature from the metadata by rid /// </summary> public R2RMethod(byte[] image, MetadataReader mdReader, uint rid, int entryPointId, GenericElementTypes[] instanceArgs, uint[] tok) { Token = _mdtMethodDef | rid; EntryPointRuntimeFunctionId = entryPointId; _mdReader = mdReader; RuntimeFunctions = new List <RuntimeFunction>(); // get the method signature from the MethodDefhandle MethodDefinitionHandle methodDefHandle = MetadataTokens.MethodDefinitionHandle((int)rid); _methodDef = mdReader.GetMethodDefinition(methodDefHandle); Name = mdReader.GetString(_methodDef.Name); BlobReader signatureReader = mdReader.GetBlobReader(_methodDef.Signature); TypeDefinitionHandle declaringTypeHandle = _methodDef.GetDeclaringType(); TypeDefinition declaringTypeDef; while (!declaringTypeHandle.IsNil) { declaringTypeDef = mdReader.GetTypeDefinition(declaringTypeHandle); DeclaringType = mdReader.GetString(declaringTypeDef.Name) + "." + DeclaringType; declaringTypeHandle = declaringTypeDef.GetDeclaringType(); } NamespaceDefinitionHandle namespaceHandle = declaringTypeDef.NamespaceDefinition; while (!namespaceHandle.IsNil) { NamespaceDefinition namespaceDef = mdReader.GetNamespaceDefinition(namespaceHandle); DeclaringType = mdReader.GetString(namespaceDef.Name) + "." + DeclaringType; namespaceHandle = namespaceDef.Parent; } SignatureHeader signatureHeader = signatureReader.ReadSignatureHeader(); IsGeneric = signatureHeader.IsGeneric; GenericParameterHandleCollection genericParams = _methodDef.GetGenericParameters(); _genericParamInstanceMap = new Dictionary <string, GenericInstance>(); int argCount = signatureReader.ReadCompressedInteger(); if (IsGeneric) { argCount = signatureReader.ReadCompressedInteger(); } ReturnType = new SignatureType(ref signatureReader, mdReader, genericParams); ArgTypes = new SignatureType[argCount]; for (int i = 0; i < argCount; i++) { ArgTypes[i] = new SignatureType(ref signatureReader, mdReader, genericParams); } if (IsGeneric && instanceArgs != null && tok != null) { InitGenericInstances(genericParams, instanceArgs, tok); } }
public R2RMethod(byte[] image, MetadataReader mdReader, NativeArray methodEntryPoints, uint offset, uint rid) { // get the id of the entry point runtime function from the MethodEntryPoints NativeArray Token = _mdtMethodDef | rid; uint id = 0; // the RUNTIME_FUNCTIONS index offset = methodEntryPoints.DecodeUnsigned(image, offset, ref id); if ((id & 1) != 0) { if ((id & 2) != 0) { uint val = 0; methodEntryPoints.DecodeUnsigned(image, offset, ref val); offset -= val; } // TODO: Dump fixups id >>= 2; } else { id >>= 1; } EntryPointRuntimeFunctionId = id; NativeCode = new List <RuntimeFunction>(); // get the method signature from the MethodDefhandle try { MethodDefinitionHandle methodDefHandle = MetadataTokens.MethodDefinitionHandle((int)rid); var methodDef = mdReader.GetMethodDefinition(methodDefHandle); BlobReader signatureReader = mdReader.GetBlobReader(methodDef.Signature); SignatureHeader header = signatureReader.ReadSignatureHeader(); Name = mdReader.GetString(methodDef.Name); int argCount = signatureReader.ReadCompressedInteger(); ReturnType = new SignatureType(ref signatureReader, ref mdReader); ArgTypes = new SignatureType[argCount]; for (int i = 0; i < argCount; i++) { ArgTypes[i] = new SignatureType(ref signatureReader, ref mdReader); } } catch (System.BadImageFormatException) { R2RDump.OutputWarning("The method with rowId " + rid + " doesn't have a corresponding MethodDefHandle"); } }