private unsafe bool TryGetStructData(RuntimeTypeHandle structTypeHandle, out ExternalReferencesTable externalReferences, out NativeParser entryParser) { int structHashcode = structTypeHandle.GetHashCode(); externalReferences = default(ExternalReferencesTable); entryParser = default(NativeParser); foreach (NativeFormatModuleInfo module in ModuleList.EnumerateModules()) { NativeReader structMapReader; if (TryGetNativeReaderForBlob(module, ReflectionMapBlob.StructMarshallingStubMap, out structMapReader)) { NativeParser structMapParser = new NativeParser(structMapReader, 0); NativeHashtable structHashtable = new NativeHashtable(structMapParser); externalReferences.InitializeCommonFixupsTable(module); var lookup = structHashtable.Lookup(structHashcode); while (!(entryParser = lookup.GetNext()).IsNull) { RuntimeTypeHandle foundStructType = externalReferences.GetRuntimeTypeHandleFromIndex(entryParser.GetUnsigned()); if (foundStructType.Equals(structTypeHandle)) { return(true); } } } } return(false); }
public unsafe IntPtr TryGetMarshallerForDelegate(RuntimeTypeHandle delegateTypeHandle) { int delegateHashcode = delegateTypeHandle.GetHashCode(); foreach (NativeFormatModuleInfo module in ModuleList.EnumerateModules()) { NativeReader delegateMapReader; if (TryGetNativeReaderForBlob(module, ReflectionMapBlob.DelegateMarshallingStubMap, out delegateMapReader)) { NativeParser delegateMapParser = new NativeParser(delegateMapReader, 0); NativeHashtable delegateHashtable = new NativeHashtable(delegateMapParser); ExternalReferencesTable externalReferences = default(ExternalReferencesTable); externalReferences.InitializeCommonFixupsTable(module); var lookup = delegateHashtable.Lookup(delegateHashcode); NativeParser entryParser; while (!(entryParser = lookup.GetNext()).IsNull) { RuntimeTypeHandle foundDelegateType = externalReferences.GetRuntimeTypeHandleFromIndex(entryParser.GetUnsigned()); if (foundDelegateType.Equals(delegateTypeHandle)) { byte *pByte = (byte *)externalReferences.GetIntPtrFromIndex(entryParser.GetUnsigned()); return((IntPtr)pByte); } } } } return(IntPtr.Zero); }
private unsafe bool TryGetMarshallersForDelegate(RuntimeTypeHandle delegateTypeHandle, out IntPtr openStub, out IntPtr closedStub, out IntPtr delegateCreationStub) { int delegateHashcode = delegateTypeHandle.GetHashCode(); openStub = IntPtr.Zero; closedStub = IntPtr.Zero; delegateCreationStub = IntPtr.Zero; foreach (NativeFormatModuleInfo module in ModuleList.EnumerateModules()) { NativeReader delegateMapReader; if (TryGetNativeReaderForBlob(module, ReflectionMapBlob.DelegateMarshallingStubMap, out delegateMapReader)) { NativeParser delegateMapParser = new NativeParser(delegateMapReader, 0); NativeHashtable delegateHashtable = new NativeHashtable(delegateMapParser); ExternalReferencesTable externalReferences = default(ExternalReferencesTable); externalReferences.InitializeCommonFixupsTable(module); var lookup = delegateHashtable.Lookup(delegateHashcode); NativeParser entryParser; while (!(entryParser = lookup.GetNext()).IsNull) { RuntimeTypeHandle foundDelegateType = externalReferences.GetRuntimeTypeHandleFromIndex(entryParser.GetUnsigned()); if (foundDelegateType.Equals(delegateTypeHandle)) { byte *pOpen = (byte *)externalReferences.GetIntPtrFromIndex(entryParser.GetUnsigned()); byte *pClose = (byte *)externalReferences.GetIntPtrFromIndex(entryParser.GetUnsigned()); byte *pDelegateCreation = (byte *)externalReferences.GetIntPtrFromIndex(entryParser.GetUnsigned()); openStub = (IntPtr)pOpen; closedStub = (IntPtr)pClose; delegateCreationStub = (IntPtr)pDelegateCreation; return(true); } } } } return(false); }