private MethodNameAndSignature GetMethodNameAndSignatureFromNativeReader(NativeReader nativeLayoutReader, 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(); IntPtr methodSigPtr = sigParser.Reader.OffsetToAddress(sigParser.Offset); return new MethodNameAndSignature(methodName, RuntimeMethodSignature.CreateFromNativeLayoutSignature(methodSigPtr)); }
public bool TryGetMethodNameAndSignaturePointersFromNativeLayoutSignature(IntPtr module, uint methodNameAndSigToken, out IntPtr methodNameSigPtr, out IntPtr methodSigPtr) { methodNameSigPtr = default(IntPtr); methodSigPtr = default(IntPtr); NativeReader reader = GetNativeLayoutInfoReader(module); uint offset = methodNameAndSigToken; NativeParser parser = new NativeParser(reader, offset); if (parser.IsNull) return false; methodNameSigPtr = parser.Reader.OffsetToAddress(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(); methodSigPtr = sigParser.Reader.OffsetToAddress(sigParser.Offset); return true; }
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; IntPtr remainingSignature; if (!GetTypeFromSignatureAndContext(fieldData->NativeLayoutInfoSignature, 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(RuntimeAugments.GetModuleFromPointer(remainingSignature)); var parser = new NativeParser(reader, reader.AddressToOffset(remainingSignature)); fieldName = parser.GetString(); return true; }