/// <summary> /// Create a new value from a key. Must be threadsafe. Value may or may not be added /// to collection. Return value must not be null. /// </summary> protected override unsafe MethodEntrypointPtr CreateValueFromKey(MethodEntrypointLookup key) { lock (this) { IntPtr thunk = IntPtr.Zero; if (s_thunkPoolHeap == null) { s_thunkPoolHeap = RuntimeAugments.CreateThunksHeap(s_entryPointStub); MethodEntrypointPtr.SetThunkPool(s_thunkPoolHeap); Debug.Assert(s_thunkPoolHeap != null); } thunk = RuntimeAugments.AllocateThunk(s_thunkPoolHeap); Debug.Assert(thunk != IntPtr.Zero); MethodEntrypointData *methodEntrypointData = (MethodEntrypointData *)MemoryHelpers.AllocateMemory(sizeof(MethodEntrypointData)); *methodEntrypointData = new MethodEntrypointData(key.MethodHandle, thunk); RuntimeAugments.SetThunkData(s_thunkPoolHeap, thunk, IntPtr.Zero, new IntPtr(methodEntrypointData)); SerializedDebugData.RegisterTailCallThunk(thunk); return(new MethodEntrypointPtr(methodEntrypointData)); } }
internal MethodEntrypointPtr(MethodEntrypointData *data) { _data = data; }