1 | // |
2 | // Copyright (c) Microsoft. All rights reserved. |
3 | // Licensed under the MIT license. See LICENSE file in the project root for full license information. |
4 | // |
5 | |
6 | //---------------------------------------------------------- |
7 | // SpmiRecordHelper.h - a helper to copy data between agnostic/non-agnostic types. |
8 | //---------------------------------------------------------- |
9 | #ifndef _SpmiRecordsHelper |
10 | #define _SpmiRecordsHelper |
11 | |
12 | #include "methodcontext.h" |
13 | |
14 | class SpmiRecordsHelper |
15 | { |
16 | public: |
17 | static MethodContext::Agnostic_CORINFO_RESOLVED_TOKENin CreateAgnostic_CORINFO_RESOLVED_TOKENin( |
18 | CORINFO_RESOLVED_TOKEN* pResolvedToken); |
19 | |
20 | static MethodContext::Agnostic_CORINFO_RESOLVED_TOKENout CreateAgnostic_CORINFO_RESOLVED_TOKENout_without_buffers( |
21 | CORINFO_RESOLVED_TOKEN* pResolvedToken); |
22 | |
23 | template <typename key, typename value> |
24 | static MethodContext::Agnostic_CORINFO_RESOLVED_TOKENout StoreAgnostic_CORINFO_RESOLVED_TOKENout( |
25 | CORINFO_RESOLVED_TOKEN* pResolvedToken, LightWeightMap<key, value>* buffers); |
26 | |
27 | template <typename key, typename value> |
28 | static MethodContext::Agnostic_CORINFO_RESOLVED_TOKENout RestoreAgnostic_CORINFO_RESOLVED_TOKENout( |
29 | CORINFO_RESOLVED_TOKEN* pResolvedToken, LightWeightMap<key, value>* buffers); |
30 | |
31 | template <typename key, typename value> |
32 | static MethodContext::Agnostic_CORINFO_RESOLVED_TOKEN StoreAgnostic_CORINFO_RESOLVED_TOKEN( |
33 | CORINFO_RESOLVED_TOKEN* pResolvedToken, LightWeightMap<key, value>* buffers); |
34 | |
35 | template <typename key, typename value> |
36 | static MethodContext::Agnostic_CORINFO_RESOLVED_TOKEN RestoreAgnostic_CORINFO_RESOLVED_TOKEN( |
37 | CORINFO_RESOLVED_TOKEN* pResolvedToken, LightWeightMap<key, value>* buffers); |
38 | |
39 | // Restore the out values in the first argument from the second. |
40 | // Can't just return whole CORINFO_RESOLVED_TOKEN because [in] values in it are important too. |
41 | template <typename key, typename value> |
42 | static void Restore_CORINFO_RESOLVED_TOKENout(CORINFO_RESOLVED_TOKEN* pResolvedToken, |
43 | MethodContext::Agnostic_CORINFO_RESOLVED_TOKENout& token, |
44 | LightWeightMap<key, value>* buffers); |
45 | |
46 | static MethodContext::Agnostic_CORINFO_SIG_INFO CreateAgnostic_CORINFO_SIG_INFO_without_buffers( |
47 | CORINFO_SIG_INFO& sigInfo); |
48 | |
49 | template <typename key, typename value> |
50 | static MethodContext::Agnostic_CORINFO_SIG_INFO StoreAgnostic_CORINFO_SIG_INFO(CORINFO_SIG_INFO& sigInfo, |
51 | LightWeightMap<key, value>* buffers); |
52 | |
53 | template <typename key, typename value> |
54 | static MethodContext::Agnostic_CORINFO_SIG_INFO RestoreAgnostic_CORINFO_SIG_INFO( |
55 | CORINFO_SIG_INFO& sigInfo, LightWeightMap<key, value>* buffers); |
56 | |
57 | template <typename key, typename value> |
58 | static CORINFO_SIG_INFO Restore_CORINFO_SIG_INFO(MethodContext::Agnostic_CORINFO_SIG_INFO& sigInfo, |
59 | LightWeightMap<key, value>* buffers); |
60 | |
61 | static MethodContext::Agnostic_CORINFO_LOOKUP_KIND CreateAgnostic_CORINFO_LOOKUP_KIND( |
62 | const CORINFO_LOOKUP_KIND* pGenericLookupKind); |
63 | |
64 | static CORINFO_LOOKUP_KIND RestoreCORINFO_LOOKUP_KIND(MethodContext::Agnostic_CORINFO_LOOKUP_KIND& lookupKind); |
65 | |
66 | static MethodContext::Agnostic_CORINFO_CONST_LOOKUP StoreAgnostic_CORINFO_CONST_LOOKUP( |
67 | CORINFO_CONST_LOOKUP* pLookup); |
68 | |
69 | static CORINFO_CONST_LOOKUP RestoreCORINFO_CONST_LOOKUP(MethodContext::Agnostic_CORINFO_CONST_LOOKUP& lookup); |
70 | |
71 | static MethodContext::Agnostic_CORINFO_RUNTIME_LOOKUP StoreAgnostic_CORINFO_RUNTIME_LOOKUP( |
72 | CORINFO_RUNTIME_LOOKUP* pLookup); |
73 | |
74 | static CORINFO_RUNTIME_LOOKUP RestoreCORINFO_RUNTIME_LOOKUP(MethodContext::Agnostic_CORINFO_RUNTIME_LOOKUP& Lookup); |
75 | |
76 | static MethodContext::Agnostic_CORINFO_LOOKUP StoreAgnostic_CORINFO_LOOKUP(CORINFO_LOOKUP* pLookup); |
77 | |
78 | static CORINFO_LOOKUP RestoreCORINFO_LOOKUP(MethodContext::Agnostic_CORINFO_LOOKUP& agnosticLookup); |
79 | }; |
80 | |
81 | inline MethodContext::Agnostic_CORINFO_RESOLVED_TOKENin SpmiRecordsHelper::CreateAgnostic_CORINFO_RESOLVED_TOKENin( |
82 | CORINFO_RESOLVED_TOKEN* pResolvedToken) |
83 | { |
84 | MethodContext::Agnostic_CORINFO_RESOLVED_TOKENin tokenIn; |
85 | ZeroMemory(&tokenIn, sizeof(tokenIn)); |
86 | tokenIn.tokenContext = (DWORDLONG)pResolvedToken->tokenContext; |
87 | tokenIn.tokenScope = (DWORDLONG)pResolvedToken->tokenScope; |
88 | tokenIn.token = (DWORD)pResolvedToken->token; |
89 | tokenIn.tokenType = (DWORD)pResolvedToken->tokenType; |
90 | return tokenIn; |
91 | } |
92 | |
93 | inline MethodContext::Agnostic_CORINFO_RESOLVED_TOKENout SpmiRecordsHelper:: |
94 | CreateAgnostic_CORINFO_RESOLVED_TOKENout_without_buffers(CORINFO_RESOLVED_TOKEN* pResolvedToken) |
95 | { |
96 | MethodContext::Agnostic_CORINFO_RESOLVED_TOKENout tokenOut; |
97 | ZeroMemory(&tokenOut, sizeof(tokenOut)); |
98 | tokenOut.hClass = (DWORDLONG)pResolvedToken->hClass; |
99 | tokenOut.hMethod = (DWORDLONG)pResolvedToken->hMethod; |
100 | tokenOut.hField = (DWORDLONG)pResolvedToken->hField; |
101 | |
102 | tokenOut.cbTypeSpec = (DWORD)pResolvedToken->cbTypeSpec; |
103 | tokenOut.cbMethodSpec = (DWORD)pResolvedToken->cbMethodSpec; |
104 | |
105 | tokenOut.pTypeSpec_Index = -1; |
106 | tokenOut.pMethodSpec_Index = -1; |
107 | |
108 | return tokenOut; |
109 | } |
110 | |
111 | template <typename key, typename value> |
112 | inline MethodContext::Agnostic_CORINFO_RESOLVED_TOKENout SpmiRecordsHelper::StoreAgnostic_CORINFO_RESOLVED_TOKENout( |
113 | CORINFO_RESOLVED_TOKEN* pResolvedToken, LightWeightMap<key, value>* buffers) |
114 | { |
115 | MethodContext::Agnostic_CORINFO_RESOLVED_TOKENout tokenOut( |
116 | CreateAgnostic_CORINFO_RESOLVED_TOKENout_without_buffers(pResolvedToken)); |
117 | |
118 | tokenOut.pTypeSpec_Index = |
119 | (DWORD)buffers->AddBuffer((unsigned char*)pResolvedToken->pTypeSpec, pResolvedToken->cbTypeSpec); |
120 | tokenOut.pMethodSpec_Index = |
121 | (DWORD)buffers->AddBuffer((unsigned char*)pResolvedToken->pMethodSpec, pResolvedToken->cbMethodSpec); |
122 | |
123 | return tokenOut; |
124 | } |
125 | |
126 | template <typename key, typename value> |
127 | inline MethodContext::Agnostic_CORINFO_RESOLVED_TOKENout SpmiRecordsHelper::RestoreAgnostic_CORINFO_RESOLVED_TOKENout( |
128 | CORINFO_RESOLVED_TOKEN* pResolvedToken, LightWeightMap<key, value>* buffers) |
129 | { |
130 | MethodContext::Agnostic_CORINFO_RESOLVED_TOKENout tokenOut( |
131 | CreateAgnostic_CORINFO_RESOLVED_TOKENout_without_buffers(pResolvedToken)); |
132 | tokenOut.pTypeSpec_Index = |
133 | (DWORD)buffers->Contains((unsigned char*)pResolvedToken->pTypeSpec, pResolvedToken->cbTypeSpec); |
134 | tokenOut.pMethodSpec_Index = |
135 | (DWORD)buffers->Contains((unsigned char*)pResolvedToken->pMethodSpec, pResolvedToken->cbMethodSpec); |
136 | return tokenOut; |
137 | } |
138 | |
139 | template <typename key, typename value> |
140 | inline MethodContext::Agnostic_CORINFO_RESOLVED_TOKEN SpmiRecordsHelper::StoreAgnostic_CORINFO_RESOLVED_TOKEN( |
141 | CORINFO_RESOLVED_TOKEN* pResolvedToken, LightWeightMap<key, value>* buffers) |
142 | { |
143 | MethodContext::Agnostic_CORINFO_RESOLVED_TOKEN token; |
144 | token.inValue = CreateAgnostic_CORINFO_RESOLVED_TOKENin(pResolvedToken); |
145 | token.outValue = StoreAgnostic_CORINFO_RESOLVED_TOKENout(pResolvedToken, buffers); |
146 | return token; |
147 | } |
148 | |
149 | template <typename key, typename value> |
150 | inline MethodContext::Agnostic_CORINFO_RESOLVED_TOKEN SpmiRecordsHelper::RestoreAgnostic_CORINFO_RESOLVED_TOKEN( |
151 | CORINFO_RESOLVED_TOKEN* pResolvedToken, LightWeightMap<key, value>* buffers) |
152 | { |
153 | MethodContext::Agnostic_CORINFO_RESOLVED_TOKEN token; |
154 | ZeroMemory(&token, sizeof(token)); |
155 | token.inValue = CreateAgnostic_CORINFO_RESOLVED_TOKENin(pResolvedToken); |
156 | token.outValue = RestoreAgnostic_CORINFO_RESOLVED_TOKENout(pResolvedToken, buffers); |
157 | return token; |
158 | } |
159 | |
160 | template <typename key, typename value> |
161 | inline void SpmiRecordsHelper::Restore_CORINFO_RESOLVED_TOKENout( |
162 | CORINFO_RESOLVED_TOKEN* pResolvedToken, |
163 | MethodContext::Agnostic_CORINFO_RESOLVED_TOKENout& tokenOut, |
164 | LightWeightMap<key, value>* buffers) |
165 | { |
166 | pResolvedToken->hClass = (CORINFO_CLASS_HANDLE)tokenOut.hClass; |
167 | pResolvedToken->hMethod = (CORINFO_METHOD_HANDLE)tokenOut.hMethod; |
168 | pResolvedToken->hField = (CORINFO_FIELD_HANDLE)tokenOut.hField; |
169 | pResolvedToken->pTypeSpec = (PCCOR_SIGNATURE)buffers->GetBuffer(tokenOut.pTypeSpec_Index); |
170 | pResolvedToken->cbTypeSpec = (ULONG)tokenOut.cbTypeSpec; |
171 | pResolvedToken->pMethodSpec = (PCCOR_SIGNATURE)buffers->GetBuffer(tokenOut.pMethodSpec_Index); |
172 | pResolvedToken->cbMethodSpec = (ULONG)tokenOut.cbMethodSpec; |
173 | } |
174 | |
175 | inline MethodContext::Agnostic_CORINFO_SIG_INFO SpmiRecordsHelper::CreateAgnostic_CORINFO_SIG_INFO_without_buffers( |
176 | CORINFO_SIG_INFO& sigInfo) |
177 | { |
178 | MethodContext::Agnostic_CORINFO_SIG_INFO sig; |
179 | ZeroMemory(&sig, sizeof(sig)); |
180 | sig.callConv = (DWORD)sigInfo.callConv; |
181 | sig.retTypeClass = (DWORDLONG)sigInfo.retTypeClass; |
182 | sig.retTypeSigClass = (DWORDLONG)sigInfo.retTypeSigClass; |
183 | sig.retType = (DWORD)sigInfo.retType; |
184 | sig.flags = (DWORD)sigInfo.flags; |
185 | sig.numArgs = (DWORD)sigInfo.numArgs; |
186 | sig.sigInst_classInstCount = (DWORD)sigInfo.sigInst.classInstCount; |
187 | sig.sigInst_methInstCount = (DWORD)sigInfo.sigInst.methInstCount; |
188 | sig.args = (DWORDLONG)sigInfo.args; |
189 | sig.cbSig = (DWORD)sigInfo.cbSig; |
190 | sig.scope = (DWORDLONG)sigInfo.scope; |
191 | sig.token = (DWORD)sigInfo.token; |
192 | return sig; |
193 | } |
194 | |
195 | template <typename key, typename value> |
196 | inline MethodContext::Agnostic_CORINFO_SIG_INFO SpmiRecordsHelper::StoreAgnostic_CORINFO_SIG_INFO( |
197 | CORINFO_SIG_INFO& sigInfo, LightWeightMap<key, value>* buffers) |
198 | { |
199 | MethodContext::Agnostic_CORINFO_SIG_INFO sig(CreateAgnostic_CORINFO_SIG_INFO_without_buffers(sigInfo)); |
200 | sig.sigInst_classInst_Index = |
201 | buffers->AddBuffer((unsigned char*)sigInfo.sigInst.classInst, sigInfo.sigInst.classInstCount * 8); |
202 | sig.sigInst_methInst_Index = |
203 | buffers->AddBuffer((unsigned char*)sigInfo.sigInst.methInst, sigInfo.sigInst.methInstCount * 8); |
204 | sig.pSig_Index = (DWORD)buffers->AddBuffer((unsigned char*)sigInfo.pSig, sigInfo.cbSig); |
205 | return sig; |
206 | } |
207 | |
208 | template <typename key, typename value> |
209 | inline MethodContext::Agnostic_CORINFO_SIG_INFO SpmiRecordsHelper::RestoreAgnostic_CORINFO_SIG_INFO( |
210 | CORINFO_SIG_INFO& sigInfo, LightWeightMap<key, value>* buffers) |
211 | { |
212 | MethodContext::Agnostic_CORINFO_SIG_INFO sig(CreateAgnostic_CORINFO_SIG_INFO_without_buffers(sigInfo)); |
213 | sig.sigInst_classInst_Index = |
214 | buffers->Contains((unsigned char*)sigInfo.sigInst.classInst, sigInfo.sigInst.classInstCount * 8); |
215 | sig.sigInst_methInst_Index = |
216 | buffers->Contains((unsigned char*)sigInfo.sigInst.methInst, sigInfo.sigInst.methInstCount * 8); |
217 | sig.pSig_Index = (DWORD)buffers->Contains((unsigned char*)sigInfo.pSig, sigInfo.cbSig); |
218 | return sig; |
219 | } |
220 | |
221 | template <typename key, typename value> |
222 | inline CORINFO_SIG_INFO SpmiRecordsHelper::Restore_CORINFO_SIG_INFO(MethodContext::Agnostic_CORINFO_SIG_INFO& sigInfo, |
223 | LightWeightMap<key, value>* buffers) |
224 | { |
225 | CORINFO_SIG_INFO sig; |
226 | sig.callConv = (CorInfoCallConv)sigInfo.callConv; |
227 | sig.retTypeClass = (CORINFO_CLASS_HANDLE)sigInfo.retTypeClass; |
228 | sig.retTypeSigClass = (CORINFO_CLASS_HANDLE)sigInfo.retTypeSigClass; |
229 | sig.retType = (CorInfoType)sigInfo.retType; |
230 | sig.flags = (unsigned)sigInfo.flags; |
231 | sig.numArgs = (unsigned)sigInfo.numArgs; |
232 | sig.sigInst.classInstCount = (unsigned)sigInfo.sigInst_classInstCount; |
233 | sig.sigInst.classInst = (CORINFO_CLASS_HANDLE*)buffers->GetBuffer(sigInfo.sigInst_classInst_Index); |
234 | sig.sigInst.methInstCount = (unsigned)sigInfo.sigInst_methInstCount; |
235 | sig.sigInst.methInst = (CORINFO_CLASS_HANDLE*)buffers->GetBuffer(sigInfo.sigInst_methInst_Index); |
236 | sig.args = (CORINFO_ARG_LIST_HANDLE)sigInfo.args; |
237 | sig.cbSig = (unsigned int)sigInfo.cbSig; |
238 | sig.pSig = (PCCOR_SIGNATURE)buffers->GetBuffer(sigInfo.pSig_Index); |
239 | sig.scope = (CORINFO_MODULE_HANDLE)sigInfo.scope; |
240 | sig.token = (mdToken)sigInfo.token; |
241 | return sig; |
242 | } |
243 | |
244 | inline MethodContext::Agnostic_CORINFO_LOOKUP_KIND SpmiRecordsHelper::CreateAgnostic_CORINFO_LOOKUP_KIND( |
245 | const CORINFO_LOOKUP_KIND* pGenericLookupKind) |
246 | { |
247 | MethodContext::Agnostic_CORINFO_LOOKUP_KIND genericLookupKind; |
248 | ZeroMemory(&genericLookupKind, sizeof(genericLookupKind)); |
249 | if (pGenericLookupKind != nullptr) |
250 | { |
251 | genericLookupKind.needsRuntimeLookup = (DWORD)pGenericLookupKind->needsRuntimeLookup; |
252 | genericLookupKind.runtimeLookupKind = (DWORD)pGenericLookupKind->runtimeLookupKind; |
253 | genericLookupKind.runtimeLookupFlags = pGenericLookupKind->runtimeLookupFlags; |
254 | } |
255 | // We don't store result->runtimeLookupArgs, which is opaque data. Ok? |
256 | return genericLookupKind; |
257 | } |
258 | |
259 | inline CORINFO_LOOKUP_KIND SpmiRecordsHelper::RestoreCORINFO_LOOKUP_KIND( |
260 | MethodContext::Agnostic_CORINFO_LOOKUP_KIND& lookupKind) |
261 | { |
262 | CORINFO_LOOKUP_KIND genericLookupKind; |
263 | genericLookupKind.needsRuntimeLookup = lookupKind.needsRuntimeLookup != 0; |
264 | genericLookupKind.runtimeLookupKind = (CORINFO_RUNTIME_LOOKUP_KIND)lookupKind.runtimeLookupKind; |
265 | genericLookupKind.runtimeLookupFlags = lookupKind.runtimeLookupFlags; |
266 | genericLookupKind.runtimeLookupArgs = nullptr; // We don't store this opaque data. Ok? |
267 | return genericLookupKind; |
268 | } |
269 | |
270 | inline MethodContext::Agnostic_CORINFO_CONST_LOOKUP SpmiRecordsHelper::StoreAgnostic_CORINFO_CONST_LOOKUP( |
271 | CORINFO_CONST_LOOKUP* pLookup) |
272 | { |
273 | MethodContext::Agnostic_CORINFO_CONST_LOOKUP constLookup; |
274 | ZeroMemory(&constLookup, sizeof(constLookup)); |
275 | constLookup.accessType = (DWORD)pLookup->accessType; |
276 | constLookup.handle = (DWORDLONG)pLookup->handle; |
277 | return constLookup; |
278 | } |
279 | |
280 | inline CORINFO_CONST_LOOKUP SpmiRecordsHelper::RestoreCORINFO_CONST_LOOKUP( |
281 | MethodContext::Agnostic_CORINFO_CONST_LOOKUP& lookup) |
282 | { |
283 | CORINFO_CONST_LOOKUP constLookup; |
284 | constLookup.accessType = (InfoAccessType)lookup.accessType; |
285 | constLookup.handle = (CORINFO_GENERIC_HANDLE)lookup.handle; |
286 | return constLookup; |
287 | } |
288 | |
289 | inline MethodContext::Agnostic_CORINFO_RUNTIME_LOOKUP SpmiRecordsHelper::StoreAgnostic_CORINFO_RUNTIME_LOOKUP( |
290 | CORINFO_RUNTIME_LOOKUP* pLookup) |
291 | { |
292 | MethodContext::Agnostic_CORINFO_RUNTIME_LOOKUP runtimeLookup; |
293 | ZeroMemory(&runtimeLookup, sizeof(runtimeLookup)); |
294 | runtimeLookup.signature = (DWORDLONG)pLookup->signature; |
295 | runtimeLookup.helper = (DWORD)pLookup->helper; |
296 | runtimeLookup.indirections = (DWORD)pLookup->indirections; |
297 | runtimeLookup.testForNull = (DWORD)pLookup->testForNull; |
298 | runtimeLookup.testForFixup = (DWORD)pLookup->testForFixup; |
299 | runtimeLookup.indirectFirstOffset = (DWORD)pLookup->indirectFirstOffset; |
300 | runtimeLookup.indirectSecondOffset = (DWORD)pLookup->indirectSecondOffset; |
301 | for (int i = 0; i < CORINFO_MAXINDIRECTIONS; i++) |
302 | runtimeLookup.offsets[i] = (DWORDLONG)pLookup->offsets[i]; |
303 | return runtimeLookup; |
304 | } |
305 | |
306 | inline CORINFO_RUNTIME_LOOKUP SpmiRecordsHelper::RestoreCORINFO_RUNTIME_LOOKUP( |
307 | MethodContext::Agnostic_CORINFO_RUNTIME_LOOKUP& lookup) |
308 | { |
309 | CORINFO_RUNTIME_LOOKUP runtimeLookup; |
310 | runtimeLookup.signature = (LPVOID)lookup.signature; |
311 | runtimeLookup.helper = (CorInfoHelpFunc)lookup.helper; |
312 | runtimeLookup.indirections = (WORD)lookup.indirections; |
313 | runtimeLookup.testForNull = lookup.testForNull != 0; |
314 | runtimeLookup.testForFixup = lookup.testForFixup != 0; |
315 | runtimeLookup.indirectFirstOffset = lookup.indirectFirstOffset != 0; |
316 | runtimeLookup.indirectSecondOffset = lookup.indirectSecondOffset != 0; |
317 | for (int i = 0; i < CORINFO_MAXINDIRECTIONS; i++) |
318 | runtimeLookup.offsets[i] = (size_t)lookup.offsets[i]; |
319 | return CORINFO_RUNTIME_LOOKUP(); |
320 | } |
321 | |
322 | inline MethodContext::Agnostic_CORINFO_LOOKUP SpmiRecordsHelper::StoreAgnostic_CORINFO_LOOKUP(CORINFO_LOOKUP* pLookup) |
323 | { |
324 | MethodContext::Agnostic_CORINFO_LOOKUP lookup; |
325 | ZeroMemory(&lookup, sizeof(lookup)); |
326 | lookup.lookupKind = CreateAgnostic_CORINFO_LOOKUP_KIND(&pLookup->lookupKind); |
327 | if (pLookup->lookupKind.needsRuntimeLookup) |
328 | { |
329 | lookup.runtimeLookup = StoreAgnostic_CORINFO_RUNTIME_LOOKUP(&pLookup->runtimeLookup); |
330 | } |
331 | else |
332 | { |
333 | lookup.constLookup = StoreAgnostic_CORINFO_CONST_LOOKUP(&pLookup->constLookup); |
334 | } |
335 | return lookup; |
336 | } |
337 | |
338 | inline CORINFO_LOOKUP SpmiRecordsHelper::RestoreCORINFO_LOOKUP(MethodContext::Agnostic_CORINFO_LOOKUP& agnosticLookup) |
339 | { |
340 | CORINFO_LOOKUP lookup; |
341 | ZeroMemory(&lookup, sizeof(lookup)); |
342 | lookup.lookupKind = RestoreCORINFO_LOOKUP_KIND(agnosticLookup.lookupKind); |
343 | if (lookup.lookupKind.needsRuntimeLookup) |
344 | { |
345 | lookup.runtimeLookup = RestoreCORINFO_RUNTIME_LOOKUP(agnosticLookup.runtimeLookup); |
346 | } |
347 | else |
348 | { |
349 | lookup.constLookup = RestoreCORINFO_CONST_LOOKUP(agnosticLookup.constLookup); |
350 | } |
351 | return lookup; |
352 | } |
353 | |
354 | #endif |
355 | |