@@ -76,7 +76,7 @@ struct InvalidPrecode
7676
7777struct StubPrecodeData
7878{
79- TADDR MethodDesc; // MethodDesc pointer or interpreted code address or-ed with the InterpretedCodeAddressFlag
79+ TADDR MethodDesc;
8080 PCODE Target;
8181 BYTE Type;
8282};
@@ -133,26 +133,18 @@ struct StubPrecode
133133 }
134134
135135 TADDR GetMethodDesc ()
136- #ifdef FEATURE_INTERPRETER
137- ;
138- #else
139136 {
140137 LIMITED_METHOD_DAC_CONTRACT;
141138
142139 return dac_cast<TADDR>(GetData ()->MethodDesc );
143140 }
144- #endif
145141
146142 PCODE GetTarget ()
147- #ifdef FEATURE_INTERPRETER
148- ;
149- #else
150143 {
151144 LIMITED_METHOD_DAC_CONTRACT;
152145
153146 return GetData ()->Target ;
154147 }
155- #endif
156148
157149 BYTE GetType ()
158150 {
@@ -175,7 +167,7 @@ struct StubPrecode
175167 InterlockedExchangeT<PCODE>(&pData->Target , GetPreStubEntryPoint ());
176168 }
177169
178- BOOL SetTargetInterlocked (TADDR target, TADDR expected, BOOL fInterpreter )
170+ BOOL SetTargetInterlocked (TADDR target, TADDR expected)
179171 {
180172 CONTRACTL
181173 {
@@ -184,12 +176,6 @@ struct StubPrecode
184176 }
185177 CONTRACTL_END;
186178
187- #ifdef FEATURE_INTERPRETER
188- if (fInterpreter )
189- {
190- target = (PCODE)InterpreterStub;
191- }
192- #endif
193179 StubPrecodeData *pData = GetData ();
194180 return InterlockedCompareExchangeT<PCODE>(&pData->Target , (PCODE)target, (PCODE)expected) == expected;
195181 }
@@ -222,13 +208,42 @@ typedef DPTR(NDirectImportPrecode) PTR_NDirectImportPrecode;
222208
223209#endif // HAS_NDIRECT_IMPORT_PRECODE
224210
211+ struct InterpreterPrecodeData
212+ {
213+ TADDR ByteCodeAddr;
214+ PCODE Target;
215+ BYTE Type;
216+ };
217+
218+ typedef DPTR (InterpreterPrecodeData) PTR_InterpreterPrecodeData;
219+
220+ struct InterpreterPrecode
221+ {
222+ static const int Type = 0x06 ;
223+
224+ BYTE m_code[StubPrecode::CodeSize];
225+
226+ void Init (InterpreterPrecode* pPrecodeRX, TADDR byteCodeAddr);
227+
228+ PTR_InterpreterPrecodeData GetData () const
229+ {
230+ LIMITED_METHOD_CONTRACT;
231+ return dac_cast<PTR_InterpreterPrecodeData>(dac_cast<TADDR>(this ) + GetStubCodePageSize ());
232+ }
233+
234+ PCODE GetEntryPoint ()
235+ {
236+ LIMITED_METHOD_CONTRACT;
237+ return PINSTRToPCODE (dac_cast<TADDR>(this ));
238+ }
239+ };
225240
226241#ifdef HAS_FIXUP_PRECODE
227242
228243struct FixupPrecodeData
229244{
230245 PCODE Target;
231- TADDR MethodDesc; // MethodDesc pointer or interpreted code address or-ed with the InterpretedCodeAddressFlag
246+ TADDR MethodDesc;
232247 PCODE PrecodeFixupThunk;
233248};
234249
@@ -289,23 +304,15 @@ struct FixupPrecode
289304 }
290305
291306 TADDR GetMethodDesc ()
292- #ifdef FEATURE_INTERPRETER
293- ;
294- #else
295307 {
296308 return (TADDR)GetData ()->MethodDesc ;
297309 }
298- #endif
299310
300311 PCODE GetTarget ()
301- #ifdef FEATURE_INTERPRETER
302- ;
303- #else
304312 {
305313 LIMITED_METHOD_DAC_CONTRACT;
306314 return GetData ()->Target ;
307315 }
308- #endif
309316
310317 PCODE *GetTargetSlot ()
311318 {
@@ -331,7 +338,7 @@ struct FixupPrecode
331338 InterlockedExchangeT<PCODE>(&GetData ()->Target , target);
332339 }
333340
334- BOOL SetTargetInterlocked (TADDR target, TADDR expected, BOOL fInterpreter )
341+ BOOL SetTargetInterlocked (TADDR target, TADDR expected)
335342 {
336343 CONTRACTL
337344 {
@@ -340,15 +347,6 @@ struct FixupPrecode
340347 }
341348 CONTRACTL_END;
342349
343- #ifdef FEATURE_INTERPRETER
344- if (fInterpreter )
345- {
346- _ASSERTE (IS_ALIGNED (&GetData ()->PrecodeFixupThunk , sizeof (SIZE_T)));
347- _ASSERTE ((PCODE)GetData ()->Target == ((PCODE)this + FixupCodeOffset));
348- PCODE oldTarget = (PCODE)GetData ()->PrecodeFixupThunk ;
349- return InterlockedCompareExchangeT<PCODE>(&GetData ()->PrecodeFixupThunk , (PCODE)InterpreterStub, (PCODE)oldTarget) == (PCODE)oldTarget;
350- }
351- #endif
352350 PCODE oldTarget = (PCODE)GetData ()->Target ;
353351 if (oldTarget != ((PCODE)this + FixupCodeOffset))
354352 {
@@ -381,6 +379,7 @@ typedef DPTR(class Precode) PTR_Precode;
381379enum PrecodeType {
382380 PRECODE_INVALID = InvalidPrecode::Type,
383381 PRECODE_STUB = StubPrecode::Type,
382+ PRECODE_INTERPRETER = InterpreterPrecode::Type,
384383#ifdef HAS_NDIRECT_IMPORT_PRECODE
385384 PRECODE_NDIRECT_IMPORT = NDirectImportPrecode::Type,
386385#endif // HAS_NDIRECT_IMPORT_PRECODE
@@ -568,11 +567,15 @@ class Precode {
568567
569568 static Precode* Allocate (PrecodeType t, MethodDesc* pMD,
570569 LoaderAllocator *pLoaderAllocator, AllocMemTracker *pamTracker);
570+
571+ static InterpreterPrecode* AllocateInterpreterPrecode (PCODE byteCode,
572+ LoaderAllocator * pLoaderAllocator, AllocMemTracker * pamTracker);
573+
571574 void Init (Precode* pPrecodeRX, PrecodeType t, MethodDesc* pMD, LoaderAllocator *pLoaderAllocator);
572575
573576#ifndef DACCESS_COMPILE
574577 void ResetTargetInterlocked ();
575- BOOL SetTargetInterlocked (PCODE target, BOOL fOnlyRedirectFromPrestub = TRUE , BOOL fInterpreter = FALSE );
578+ BOOL SetTargetInterlocked (PCODE target, BOOL fOnlyRedirectFromPrestub = TRUE );
576579
577580 // Reset precode to point to prestub
578581 void Reset ();
0 commit comments