public bool TryGetMethodNameAndSignaturePointersFromNativeLayoutSignature(TypeManagerHandle module, uint methodNameAndSigToken, out RuntimeSignature methodNameSig, out RuntimeSignature methodSig) { methodNameSig = default(RuntimeSignature); methodSig = default(RuntimeSignature); NativeReader reader = GetNativeLayoutInfoReader(module); NativeParser parser = new NativeParser(reader, methodNameAndSigToken); if (parser.IsNull) { return(false); } methodNameSig = RuntimeSignature.CreateFromNativeLayoutSignature(module, parser.Offset); string methodName = parser.GetString(); // Signatures are indirected to through a relative offset so that we don't have to parse them // when not comparing signatures (parsing them requires resolving types and is tremendously // expensive). NativeParser sigParser = parser.GetParserFromRelativeOffset(); methodSig = RuntimeSignature.CreateFromNativeLayoutSignature(module, sigParser.Offset); return(true); }
private unsafe bool TryGetStaticRuntimeMethodHandleComponents(RuntimeMethodHandle runtimeMethodHandle, out RuntimeTypeHandle declaringTypeHandle, out MethodNameAndSignature nameAndSignature, out RuntimeTypeHandle[] genericMethodArgs) { declaringTypeHandle = default(RuntimeTypeHandle); nameAndSignature = null; genericMethodArgs = null; // Make sure it's not a dynamically allocated RuntimeMethodHandle before we attempt to use it to parse native layout data Debug.Assert(((*(IntPtr *)&runtimeMethodHandle).ToInt64() & 0x1) == 0); RuntimeMethodHandleInfo *methodData = *(RuntimeMethodHandleInfo **)&runtimeMethodHandle; #if CORERT // The native layout info signature is a pair. // The first is a pointer that points to the TypeManager indirection cell. // The second is the offset into the native layout info blob in that TypeManager, where the native signature is encoded. IntPtr *nativeLayoutInfoSignatureData = (IntPtr *)methodData->NativeLayoutInfoSignature; RuntimeSignature signature = RuntimeSignature.CreateFromNativeLayoutSignature( new TypeManagerHandle(*(IntPtr *)nativeLayoutInfoSignatureData[0]), (uint)nativeLayoutInfoSignatureData[1].ToInt32()); #else IntPtr moduleHandle = RuntimeAugments.GetOSModuleFromPointer(methodData->NativeLayoutInfoSignature); RuntimeSignature signature = RuntimeSignature.CreateFromNativeLayoutSignature( new TypeManagerHandle(moduleHandle), GetNativeLayoutInfoReader(new TypeManagerHandle(moduleHandle)).AddressToOffset(methodData->NativeLayoutInfoSignature)); #endif RuntimeSignature remainingSignature; return(GetMethodFromSignatureAndContext(signature, null, null, out declaringTypeHandle, out nameAndSignature, out genericMethodArgs, out remainingSignature)); }
// // Parse a native layout signature pointed to by "signature" in the executable image, optionally using // "typeArgs" and "methodArgs" for generic type parameter substitution. The first field in "signature" // must be an encoded method but any data beyond that is user-defined and returned in "remainingSignature" // public bool GetMethodFromSignatureAndContext(RuntimeSignature signature, RuntimeTypeHandle[] typeArgs, RuntimeTypeHandle[] methodArgs, out RuntimeTypeHandle createdType, out MethodNameAndSignature nameAndSignature, out RuntimeTypeHandle[] genericMethodTypeArgumentHandles, out RuntimeSignature remainingSignature) { NativeReader reader = GetNativeLayoutInfoReader(signature); NativeParser parser = new NativeParser(reader, signature.NativeLayoutOffset); bool result = GetMethodFromSignatureAndContext(ref parser, new TypeManagerHandle(signature.ModuleHandle), typeArgs, methodArgs, out createdType, out nameAndSignature, out genericMethodTypeArgumentHandles); remainingSignature = RuntimeSignature.CreateFromNativeLayoutSignature(signature, parser.Offset); return result; }
// // Parse a native layout signature pointed to by "signature" in the executable image, optionally using // "typeArgs" and "methodArgs" for generic type parameter substitution. The first field in "signature" // must be an encoded type but any data beyond that is user-defined and returned in "remainingSignature" // internal bool GetTypeFromSignatureAndContext(RuntimeSignature signature, RuntimeTypeHandle[] typeArgs, RuntimeTypeHandle[] methodArgs, out RuntimeTypeHandle createdType, out RuntimeSignature remainingSignature) { NativeReader reader = GetNativeLayoutInfoReader(signature.ModuleHandle); NativeParser parser = new NativeParser(reader, signature.NativeLayoutOffset); bool result = GetTypeFromSignatureAndContext(ref parser, signature.ModuleHandle, typeArgs, methodArgs, out createdType); remainingSignature = RuntimeSignature.CreateFromNativeLayoutSignature(signature.ModuleHandle, parser.Offset); return result; }
internal MethodNameAndSignature GetMethodNameAndSignature(ref NativeParser parser, TypeManagerHandle moduleHandle, out RuntimeSignature methodNameSig, out RuntimeSignature methodSig) { methodNameSig = RuntimeSignature.CreateFromNativeLayoutSignature(moduleHandle, parser.Offset); string methodName = parser.GetString(); // Signatures are indirected to through a relative offset so that we don't have to parse them // when not comparing signatures (parsing them requires resolving types and is tremendously // expensive). NativeParser sigParser = parser.GetParserFromRelativeOffset(); methodSig = RuntimeSignature.CreateFromNativeLayoutSignature(moduleHandle, sigParser.Offset); return(new MethodNameAndSignature(methodName, methodSig)); }
private unsafe bool TryGetStaticRuntimeFieldHandleComponents(RuntimeFieldHandle runtimeFieldHandle, out RuntimeTypeHandle declaringTypeHandle, out string fieldName) { fieldName = null; declaringTypeHandle = default(RuntimeTypeHandle); // Make sure it's not a dynamically allocated RuntimeFieldHandle before we attempt to use it to parse native layout data Debug.Assert(((*(IntPtr *)&runtimeFieldHandle).ToInt64() & 0x1) == 0); RuntimeFieldHandleInfo *fieldData = *(RuntimeFieldHandleInfo **)&runtimeFieldHandle; RuntimeSignature signature; #if !CORERT // If the system module is compiled with as a type manager, all modules are compiled as such if (ModuleList.Instance.SystemModule.Handle.IsTypeManager) #endif { // The native layout info signature is a pair. // The first is a pointer that points to the TypeManager indirection cell. // The second is the offset into the native layout info blob in that TypeManager, where the native signature is encoded. IntPtr *nativeLayoutInfoSignatureData = (IntPtr *)fieldData->NativeLayoutInfoSignature; signature = RuntimeSignature.CreateFromNativeLayoutSignature( new TypeManagerHandle(*(IntPtr *)nativeLayoutInfoSignatureData[0]), (uint)nativeLayoutInfoSignatureData[1].ToInt32()); } #if !CORERT else { IntPtr moduleHandle = RuntimeAugments.GetOSModuleFromPointer(fieldData->NativeLayoutInfoSignature); signature = RuntimeSignature.CreateFromNativeLayoutSignature( new TypeManagerHandle(moduleHandle), GetNativeLayoutInfoReader(new TypeManagerHandle(moduleHandle)).AddressToOffset(fieldData->NativeLayoutInfoSignature)); } #endif RuntimeSignature remainingSignature; if (!GetTypeFromSignatureAndContext(signature, null, null, out declaringTypeHandle, out remainingSignature)) { return(false); } // GetTypeFromSignatureAndContext parses the type from the signature and returns a pointer to the next // part of the native layout signature to read which we get the field name from var reader = GetNativeLayoutInfoReader(remainingSignature); var parser = new NativeParser(reader, remainingSignature.NativeLayoutOffset); fieldName = parser.GetString(); return(true); }
private MethodNameAndSignature GetMethodNameAndSignatureFromNativeReader(NativeReader nativeLayoutReader, IntPtr moduleHandle, uint nativeLayoutOffset) { NativeParser parser = new NativeParser(nativeLayoutReader, nativeLayoutOffset); string methodName = parser.GetString(); // Signatures are indirected to through a relative offset so that we don't have to parse them // when not comparing signatures (parsing them requires resolving types and is tremendously // expensive). NativeParser sigParser = parser.GetParserFromRelativeOffset(); RuntimeSignature methodSig = RuntimeSignature.CreateFromNativeLayoutSignature(moduleHandle, sigParser.Offset); return(new MethodNameAndSignature(methodName, methodSig)); }