|
12 | 12 | // for numeric_limits |
13 | 13 | #include <limits> |
14 | 14 |
|
15 | | -void InvokeCompiledMethod(MethodDesc *pMD, int8_t *pArgs, int8_t *pRet, PCODE overrideTarget = (PCODE)0) |
| 15 | +void InvokeCompiledMethod(MethodDesc *pMD, int8_t *pArgs, int8_t *pRet, PCODE target) |
16 | 16 | { |
17 | 17 | CONTRACTL |
18 | 18 | { |
@@ -45,11 +45,8 @@ void InvokeCompiledMethod(MethodDesc *pMD, int8_t *pArgs, int8_t *pRet, PCODE ov |
45 | 45 | } |
46 | 46 | } |
47 | 47 |
|
48 | | - if (overrideTarget) |
49 | | - // Interpreter-FIXME: Is this a race condition? |
50 | | - pHeader->SetTarget(overrideTarget); |
51 | | - else |
52 | | - pHeader->SetTarget(pMD->GetMultiCallableAddrOfCode(CORINFO_ACCESS_ANY)); // The method to call |
| 48 | + // Interpreter-FIXME: Potential race condition if a single CallStubHeader is reused for multiple targets. |
| 49 | + pHeader->SetTarget(target); // The method to call |
53 | 50 |
|
54 | 51 | pHeader->Invoke(pHeader->Routines, pArgs, pRet, pHeader->TotalStackSize); |
55 | 52 | } |
@@ -164,6 +161,20 @@ static OBJECTREF CreateMultiDimArray(MethodTable* arrayClass, int8_t* stack, int |
164 | 161 | #define LOCAL_VAR_ADDR(offset,type) ((type*)(stack + (offset))) |
165 | 162 | #define LOCAL_VAR(offset,type) (*LOCAL_VAR_ADDR(offset, type)) |
166 | 163 | #define NULL_CHECK(o) do { if ((o) == NULL) { COMPlusThrow(kNullReferenceException); } } while (0) |
| 164 | +#define WITH_INLINED_CALL_FRAME(block) \ |
| 165 | + do { \ |
| 166 | + InlinedCallFrame inlinedCallFrame; \ |
| 167 | + inlinedCallFrame.m_pCallerReturnAddress = (TADDR)ip; \ |
| 168 | + inlinedCallFrame.m_pCallSiteSP = pFrame; \ |
| 169 | + inlinedCallFrame.m_pCalleeSavedFP = (TADDR)stack; \ |
| 170 | + inlinedCallFrame.m_pThread = GetThread(); \ |
| 171 | + inlinedCallFrame.m_Datum = NULL; \ |
| 172 | + inlinedCallFrame.Push(); \ |
| 173 | + \ |
| 174 | + block\ |
| 175 | + \ |
| 176 | + inlinedCallFrame.Pop(); \ |
| 177 | + } while (0) |
167 | 178 |
|
168 | 179 | template <typename THelper> static THelper GetPossiblyIndirectHelper(void* dataItem) |
169 | 180 | { |
@@ -1846,21 +1857,10 @@ void InterpExecMethod(InterpreterFrame *pInterpreterFrame, InterpMethodContextFr |
1846 | 1857 | ? *(PCODE *)pMethod->pDataItems[targetAddrSlot] |
1847 | 1858 | : (PCODE)pMethod->pDataItems[targetAddrSlot]; |
1848 | 1859 |
|
1849 | | - InlinedCallFrame inlinedCallFrame; |
1850 | | - inlinedCallFrame.m_pCallerReturnAddress = (TADDR)ip; |
1851 | | - inlinedCallFrame.m_pCallSiteSP = pFrame; |
1852 | | - inlinedCallFrame.m_pCalleeSavedFP = (TADDR)stack; |
1853 | | - inlinedCallFrame.m_pThread = GetThread(); |
1854 | | - inlinedCallFrame.m_Datum = NULL; |
1855 | | - inlinedCallFrame.Push(); |
1856 | | - |
1857 | | - { |
1858 | | - // Interpreter-FIXME: Create InlinedCallFrame. |
| 1860 | + WITH_INLINED_CALL_FRAME({ |
1859 | 1861 | GCX_PREEMP(); |
1860 | 1862 | InvokeCompiledMethod(targetMethod, stack + callArgsOffset, stack + returnOffset, callTarget); |
1861 | | - } |
1862 | | - |
1863 | | - inlinedCallFrame.Pop(); |
| 1863 | + }); |
1864 | 1864 |
|
1865 | 1865 | break; |
1866 | 1866 | } |
@@ -1898,7 +1898,7 @@ void InterpExecMethod(InterpreterFrame *pInterpreterFrame, InterpMethodContextFr |
1898 | 1898 | if (targetIp == NULL) |
1899 | 1899 | { |
1900 | 1900 | // If we didn't get the interpreter code pointer setup, then this is a method we need to invoke as a compiled method. |
1901 | | - InvokeCompiledMethod(targetMethod, stack + callArgsOffset, stack + returnOffset); |
| 1901 | + InvokeCompiledMethod(targetMethod, stack + callArgsOffset, stack + returnOffset, targetMethod->GetMultiCallableAddrOfCode(CORINFO_ACCESS_ANY)); |
1902 | 1902 | break; |
1903 | 1903 | } |
1904 | 1904 | } |
|
0 commit comments