1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
//
// File: ILStubResolver.h
//
//
#ifndef __ILSTUBRESOLVER_H__
#define __ILSTUBRESOLVER_H__
#include "stubgen.h"
class ILStubResolver : DynamicResolver
{
friend class ILStubCache;
friend class ILStubLinker;
public:
// -----------------------------------
// DynamicResolver interface methods
// -----------------------------------
void FreeCompileTimeState();
void GetJitContext(SecurityControlFlags* pSecurityControlFlags,
TypeHandle* pTypeOwner);
ChunkAllocator* GetJitMetaHeap();
BYTE* GetCodeInfo(unsigned* pCodeSize, unsigned* pStackSize, CorInfoOptions* pOptions, unsigned* pEHSize);
SigPointer GetLocalSig();
OBJECTHANDLE ConstructStringLiteral(mdToken metaTok);
BOOL IsValidStringRef(mdToken metaTok);
void ResolveToken(mdToken token, TypeHandle * pTH, MethodDesc ** ppMD, FieldDesc ** ppFD);
SigPointer ResolveSignature(mdToken token);
SigPointer ResolveSignatureForVarArg(mdToken token);
void GetEHInfo(unsigned EHnumber, CORINFO_EH_CLAUSE* clause);
static LPCUTF8 GetStubClassName(MethodDesc* pMD);
LPCUTF8 GetStubMethodName();
MethodDesc* GetDynamicMethod() { LIMITED_METHOD_CONTRACT; return m_pStubMD; }
// -----------------------------------
// ILStubResolver-specific methods
// -----------------------------------
bool IsNativeToCLRInteropStub();
bool IsCLRToNativeInteropStub();
MethodDesc* GetStubMethodDesc();
MethodDesc* GetStubTargetMethodDesc();
void SetStubTargetMethodDesc(MethodDesc* pStubTargetMD);
void SetStubTargetMethodSig(PCCOR_SIGNATURE pStubTargetMethodSig, DWORD cbStubTargetSigLength);
void SetStubMethodDesc(MethodDesc* pStubMD);
COR_ILMETHOD_DECODER * AllocGeneratedIL(size_t cbCode, DWORD cbLocalSig, UINT maxStack);
COR_ILMETHOD_DECODER * GetILHeader();
COR_ILMETHOD_SECT_EH* AllocEHSect(size_t nClauses);
bool IsCompiled();
bool IsILGenerated();
ILStubResolver();
void SetTokenLookupMap(TokenLookupMap* pMap);
void SetJitFlags(CORJIT_FLAGS jitFlags);
CORJIT_FLAGS GetJitFlags();
static void StubGenFailed(ILStubResolver* pResolver);
protected:
enum ILStubType
{
Unassigned = 0,
CLRToNativeInteropStub,
CLRToCOMInteropStub,
CLRToWinRTInteropStub,
NativeToCLRInteropStub,
COMToCLRInteropStub,
WinRTToCLRInteropStub,
#ifdef FEATURE_ARRAYSTUB_AS_IL
ArrayOpStub,
#endif
#ifdef FEATURE_MULTICASTSTUB_AS_IL
MulticastDelegateStub,
#endif
#ifdef FEATURE_STUBS_AS_IL
SecureDelegateStub,
UnboxingILStub,
InstantiatingStub,
#endif
};
enum CompileTimeStatePtrSpecialValues
{
ILNotYetGenerated = NULL,
ILGeneratedAndFreed = 1,
};
void ClearCompileTimeState(CompileTimeStatePtrSpecialValues newState);
void SetStubType(ILStubType stubType);
//
// This stuff is only needed during JIT
//
struct CompileTimeState
{
COR_ILMETHOD_DECODER m_ILHeader;
COR_ILMETHOD_SECT_EH * m_pEHSect;
SigPointer m_StubTargetMethodSig;
TokenLookupMap m_tokenLookupMap;
};
typedef DPTR(struct CompileTimeState) PTR_CompileTimeState;
PTR_CompileTimeState m_pCompileTimeState;
PTR_MethodDesc m_pStubMD;
PTR_MethodDesc m_pStubTargetMD;
ILStubType m_type;
CORJIT_FLAGS m_jitFlags;
};
typedef Holder<ILStubResolver*, DoNothing<ILStubResolver*>, ILStubResolver::StubGenFailed, NULL> ILStubGenHolder;
#endif // __ILSTUBRESOLVER_H__
|