diff options
Diffstat (limited to 'src/vm/i386')
-rw-r--r-- | src/vm/i386/asmconstants.h | 10 | ||||
-rw-r--r-- | src/vm/i386/asmhelpers.asm | 276 | ||||
-rw-r--r-- | src/vm/i386/cgencpu.h | 3 | ||||
-rw-r--r-- | src/vm/i386/cgenx86.cpp | 3 | ||||
-rw-r--r-- | src/vm/i386/excepx86.cpp | 2 | ||||
-rw-r--r-- | src/vm/i386/jithelp.asm | 49 | ||||
-rw-r--r-- | src/vm/i386/jitinterfacex86.cpp | 103 | ||||
-rw-r--r-- | src/vm/i386/stublinkerx86.cpp | 3 | ||||
-rw-r--r-- | src/vm/i386/virtualcallstubcpu.hpp | 117 |
9 files changed, 3 insertions, 563 deletions
diff --git a/src/vm/i386/asmconstants.h b/src/vm/i386/asmconstants.h index 6be010bd63..4ad08ba133 100644 --- a/src/vm/i386/asmconstants.h +++ b/src/vm/i386/asmconstants.h @@ -42,16 +42,6 @@ #define DynamicHelperFrameFlags_ObjectArg 1 #define DynamicHelperFrameFlags_ObjectArg2 2 -#ifdef FEATURE_REMOTING -#define TransparentProxyObject___stubData 0x8 -ASMCONSTANTS_C_ASSERT(TransparentProxyObject___stubData == offsetof(TransparentProxyObject, _stubData)) - -#define TransparentProxyObject___stub 0x14 -ASMCONSTANTS_C_ASSERT(TransparentProxyObject___stub == offsetof(TransparentProxyObject, _stub)) - -#define TransparentProxyObject___pMT 0xc -ASMCONSTANTS_C_ASSERT(TransparentProxyObject___pMT == offsetof(TransparentProxyObject, _pMT)) -#endif // FEATURE_REMOTING // CONTEXT from rotor_pal.h #define CONTEXT_Edi 0x9c diff --git a/src/vm/i386/asmhelpers.asm b/src/vm/i386/asmhelpers.asm index 196fe82260..2315b3ebb2 100644 --- a/src/vm/i386/asmhelpers.asm +++ b/src/vm/i386/asmhelpers.asm @@ -83,10 +83,6 @@ ifdef FEATURE_COMINTEROP EXTERN _CLRToCOMWorker@8:PROC endif -ifdef FEATURE_REMOTING -EXTERN _TransparentProxyStubWorker@8:PROC -endif - ifdef FEATURE_PREJIT EXTERN _ExternalMethodFixupWorker@16:PROC EXTERN _VirtualMethodFixupWorker@8:PROC @@ -101,10 +97,6 @@ ifdef FEATURE_READYTORUN EXTERN _DynamicHelperWorker@20:PROC endif -ifdef FEATURE_REMOTING -EXTERN _InContextTPQuickDispatchAsmStub@0:PROC -endif - EXTERN @JIT_InternalThrow@4:PROC EXTERN @ProfileEnter@8:PROC @@ -1091,182 +1083,6 @@ _UMThunkStubRareDisable proc public _UMThunkStubRareDisable endp -;+---------------------------------------------------------------------------- -; -; Method: CRemotingServices::CheckForContextMatch public -; -; Synopsis: This code generates a check to see if the current context and -; the context of the proxy match. -; -;+---------------------------------------------------------------------------- -; -; returns zero if contexts match -; returns non-zero if contexts do not match -; -; UINT_PTR __stdcall CRemotingServices__CheckForContextMatch(Object* pStubData) -ifdef FEATURE_REMOTING -_CRemotingServices__CheckForContextMatch@4 proc public - push ebx ; spill ebx - mov ebx, [eax+4] ; Get the internal context id by unboxing - ; the stub data - call _GetThread@0 ; Get the current thread, assumes that the - ; registers are preserved - mov eax, [eax+Thread_m_Context] ; Get the current context from the - ; thread - sub eax, ebx ; Get the pointer to the context from the - ; proxy and compare with the current context - pop ebx ; restore the value of ebx - retn -_CRemotingServices__CheckForContextMatch@4 endp -endif ; FEATURE_REMOTING - -;+---------------------------------------------------------------------------- -; -; Method: CRemotingServices::DispatchInterfaceCall public -; -; Synopsis: -; Push that method desc on the stack and jump to the -; transparent proxy stub to execute the call. -; WARNING!! This MethodDesc is not the methoddesc in the vtable -; of the object instead it is the methoddesc in the vtable of -; the interface class. Since we use the MethodDesc only to probe -; the stack via the signature of the method call we are safe. -; If we want to get any object vtable/class specific -; information this is not safe. -; -; -;+---------------------------------------------------------------------------- -; void __stdcall CRemotingServices__DispatchInterfaceCall() -ifdef FEATURE_REMOTING -_CRemotingServices__DispatchInterfaceCall@0 proc public - ; push MethodDesc* passed in eax by precode and forward to the worker - push eax - - ; NOTE: At this point the stack looks like - ; - ; esp---> saved MethodDesc of Interface method - ; return addr of calling function - ; - mov eax, [ecx + TransparentProxyObject___stubData] - call [ecx + TransparentProxyObject___stub] -ifdef _DEBUG - nop ; Mark this as a special call site that can directly - ; call managed code -endif - test eax, eax - jnz CtxMismatch - jmp _InContextTPQuickDispatchAsmStub@0 - -CtxMismatch: - pop eax ; restore MethodDesc * - jmp _TransparentProxyStub_CrossContext@0 ; jump to slow TP stub -_CRemotingServices__DispatchInterfaceCall@0 endp -endif ; FEATURE_REMOTING - - -;+---------------------------------------------------------------------------- -; -; Method: CRemotingServices::CallFieldGetter private -; -; Synopsis: Calls the field getter function (Object::__FieldGetter) in -; managed code by setting up the stack and calling the target -; -; -;+---------------------------------------------------------------------------- -; void __stdcall CRemotingServices__CallFieldGetter( -; MethodDesc *pMD, -; LPVOID pThis, -; LPVOID pFirst, -; LPVOID pSecond, -; LPVOID pThird) -ifdef FEATURE_REMOTING -CRemotingServices__CallFieldGetter proc stdcall public, - pMD : DWORD, - pThis : DWORD, - pFirst : DWORD, - pSecond : DWORD, - pThird : DWORD - - push [pSecond] ; push the second argument on the stack - push [pThird] ; push the third argument on the stack - - mov ecx, [pThis] ; enregister pThis, the 'this' pointer - mov edx, [pFirst] ; enregister pFirst, the first argument - - mov eax, [pMD] ; load MethodDesc of object::__FieldGetter - call _TransparentProxyStub_CrossContext@0 ; call the TP stub - - ret -CRemotingServices__CallFieldGetter endp -endif ; FEATURE_REMOTING - -;+---------------------------------------------------------------------------- -; -; Method: CRemotingServices::CallFieldSetter private -; -; Synopsis: Calls the field setter function (Object::__FieldSetter) in -; managed code by setting up the stack and calling the target -; -; -;+---------------------------------------------------------------------------- -; void __stdcall CRemotingServices__CallFieldSetter( -; MethodDesc *pMD, -; LPVOID pThis, -; LPVOID pFirst, -; LPVOID pSecond, -; LPVOID pThird) -ifdef FEATURE_REMOTING -CRemotingServices__CallFieldSetter proc stdcall public, - pMD : DWORD, - pThis : DWORD, - pFirst : DWORD, - pSecond : DWORD, - pThird : DWORD - - push [pSecond] ; push the field name (second arg) - push [pThird] ; push the object (third arg) on the stack - - mov ecx, [pThis] ; enregister pThis, the 'this' pointer - mov edx, [pFirst] ; enregister the first argument - - mov eax, [pMD] ; load MethodDesc of object::__FieldGetter - call _TransparentProxyStub_CrossContext@0 ; call the TP stub - - ret -CRemotingServices__CallFieldSetter endp -endif ; FEATURE_REMOTING - -;+---------------------------------------------------------------------------- -; -; Method: CTPMethodTable::GenericCheckForContextMatch private -; -; Synopsis: Calls the stub in the TP & returns TRUE if the contexts -; match, FALSE otherwise. -; -; Note: 1. Called during FieldSet/Get, used for proxy extensibility -; -;+---------------------------------------------------------------------------- -; BOOL __stdcall CTPMethodTable__GenericCheckForContextMatch(Object* orTP) -ifdef FEATURE_REMOTING -CTPMethodTable__GenericCheckForContextMatch proc stdcall public uses ecx, tp : DWORD - - mov ecx, [tp] - mov eax, [ecx + TransparentProxyObject___stubData] - call [ecx + TransparentProxyObject___stub] -ifdef _DEBUG - nop ; Mark this as a special call site that can directly - ; call managed code -endif - test eax, eax - mov eax, 0 - setz al - ; NOTE: In the CheckForXXXMatch stubs (for URT ctx/ Ole32 ctx) eax is - ; non-zero if contexts *do not* match & zero if they do. - ret -CTPMethodTable__GenericCheckForContextMatch endp -endif ; FEATURE_REMOTING - - ; void __stdcall JIT_ProfilerEnterLeaveTailcallStub(UINT_PTR ProfilerHandle) _JIT_ProfilerEnterLeaveTailcallStub@4 proc public ; this function must preserve all registers, including scratch @@ -2053,98 +1869,6 @@ _GenericComPlusCallStub@0 proc public _GenericComPlusCallStub@0 endp endif ; FEATURE_COMINTEROP -ifdef FEATURE_REMOTING -_TransparentProxyStub@0 proc public - ; push slot passed in eax - push eax - - ; Move into eax the stub data and call the stub - mov eax, [ecx + TransparentProxyObject___stubData] - call [ecx + TransparentProxyObject___stub] -ifdef _DEBUG - nop ; Mark this as a special call site that can directly - ; call managed code -endif - test eax, eax - jnz CtxMismatch2 - - mov eax, [ecx + TransparentProxyObject___pMT] - - push ebx ; spill EBX - - ; Convert the slot number into the code address - ; See MethodTable.h for details on vtable layout - - mov ebx, [esp + 4] ; Reload the slot - shr ebx, ASM__VTABLE_SLOTS_PER_CHUNK_LOG2 ; indirectionSlotNumber - - mov eax,[eax + ebx*4 + SIZEOF_MethodTable] - - mov ebx, [esp + 4] ; use unchanged slot from above - and ebx, ASM__VTABLE_SLOTS_PER_CHUNK-1 ; offsetInChunk - mov eax, [eax + ebx*4] - - ; At this point, eax contains the code address - - ; Restore EBX - pop ebx - - ; Remove the slot number from the stack - lea esp, [esp+4] - - jmp eax - - ; CONTEXT MISMATCH CASE, call out to the real proxy to dispatch - -CtxMismatch2: - pop eax ; restore MethodDesc * - jmp _TransparentProxyStub_CrossContext@0 ; jump to slow TP stub - -_TransparentProxyStub@0 endp - -_TransparentProxyStub_CrossContext@0 proc public - - STUB_PROLOG - - ; pTransitionBlock - mov esi, esp - - ; return value - sub esp, 3*4 ; 64-bit return value + cb stack pop - - push eax ; pMD - push esi ; pTransitionBlock - call _TransparentProxyStubWorker@8 - - pop ebx ; cbStackPop - - push eax - call _setFPReturn@12 ; pop & set the return value - - ; From here on, mustn't trash eax:edx - mov ecx, ebx ; cbStackPop - - mov ebx, [esp+6*4] ; get retaddr - mov [esp+6*4+ecx], ebx ; put it where it belongs - - STUB_EPILOG_RETURN - - add esp, ecx ; pop all the args - ret - -_TransparentProxyStub_CrossContext@0 endp - -; This method does nothing. It's just a fixed function for the debugger to put a breakpoint -; on so that it can trace a call target. -_TransparentProxyStubPatch@0 proc public - ; make sure that the basic block is unique - test eax,12 -_TransparentProxyStubPatchLabel@0: -public _TransparentProxyStubPatchLabel@0 - ret -_TransparentProxyStubPatch@0 endp - -endif ; FEATURE_REMOTING ifdef FEATURE_COMINTEROP ;-------------------------------------------------------------------------- diff --git a/src/vm/i386/cgencpu.h b/src/vm/i386/cgencpu.h index 6dc53beb92..ac239533f7 100644 --- a/src/vm/i386/cgencpu.h +++ b/src/vm/i386/cgencpu.h @@ -92,9 +92,6 @@ BOOL Runtime_Test_For_SSE2(); // Needed for PInvoke inlining in ngened images #define HAS_NDIRECT_IMPORT_PRECODE 1 -#ifdef FEATURE_REMOTING -#define HAS_REMOTING_PRECODE 1 -#endif #ifdef FEATURE_PREJIT #define HAS_FIXUP_PRECODE 1 #define HAS_FIXUP_PRECODE_CHUNKS 1 diff --git a/src/vm/i386/cgenx86.cpp b/src/vm/i386/cgenx86.cpp index 030f211496..2444fef027 100644 --- a/src/vm/i386/cgenx86.cpp +++ b/src/vm/i386/cgenx86.cpp @@ -24,9 +24,6 @@ #include "array.h" #include "jitinterface.h" #include "codeman.h" -#ifdef FEATURE_REMOTING -#include "remoting.h" -#endif #include "dbginterface.h" #include "eeprofinterfaces.h" #include "eeconfig.h" diff --git a/src/vm/i386/excepx86.cpp b/src/vm/i386/excepx86.cpp index 2997c5784f..2c863b2ec3 100644 --- a/src/vm/i386/excepx86.cpp +++ b/src/vm/i386/excepx86.cpp @@ -27,8 +27,6 @@ #include "eedbginterfaceimpl.inl" #include "dllimportcallback.h" #include "threads.h" -#ifdef FEATURE_REMOTING -#endif #include "eeconfig.h" #include "vars.hpp" #include "generics.h" diff --git a/src/vm/i386/jithelp.asm b/src/vm/i386/jithelp.asm index 9d2f6b7589..8285c42455 100644 --- a/src/vm/i386/jithelp.asm +++ b/src/vm/i386/jithelp.asm @@ -87,11 +87,6 @@ EXTERN g_GCShadowEnd:DWORD INVALIDGCVALUE equ 0CCCCCCCDh endif -ifdef FEATURE_REMOTING -EXTERN _TransparentProxyStub_CrossContext@0:PROC -EXTERN _InContextTPQuickDispatchAsmStub@0:PROC -endif - EXTERN _COMPlusEndCatch@20:PROC .686P @@ -2377,50 +2372,6 @@ _JIT_PatchedWriteBarrierLast@0 PROC ret _JIT_PatchedWriteBarrierLast@0 ENDP -;********************************************************************** -; PrecodeRemotingThunk is patched at runtime to activate it -ifdef FEATURE_REMOTING - ALIGN 16 -_PrecodeRemotingThunk@0 proc public - - ret ; This is going to be patched to "test ecx,ecx" - nop - - jz RemotingDone ; predicted not taken - - cmp dword ptr [ecx],11111111h ; This is going to be patched to address of the transparent proxy - je RemotingCheck ; predicted not taken - -RemotingDone: - ret - -RemotingCheck: - push eax ; save method desc - mov eax, dword ptr [ecx + TransparentProxyObject___stubData] - call [ecx + TransparentProxyObject___stub] - test eax, eax - jnz RemotingCtxMismatch - mov eax, [esp] - mov ax, [eax + MethodDesc_m_wFlags] - and ax, MethodDesc_mdcClassification - cmp ax, MethodDesc_mcComInterop - je ComPlusCall - pop eax ; throw away method desc - jmp RemotingDone - -RemotingCtxMismatch: - pop eax ; restore method desc - add esp, 4 ; pop return address into the precode - jmp _TransparentProxyStub_CrossContext@0 - -ComPlusCall: - pop eax ; restore method desc - mov [esp],eax ; replace return address into the precode with method desc (argument for TP stub) - jmp _InContextTPQuickDispatchAsmStub@0 - -_PrecodeRemotingThunk@0 endp -endif ; FEATURE_REMOTING - _JIT_PatchedCodeLast@0 proc public ret _JIT_PatchedCodeLast@0 endp diff --git a/src/vm/i386/jitinterfacex86.cpp b/src/vm/i386/jitinterfacex86.cpp index 01d8119c63..9af3a3ce20 100644 --- a/src/vm/i386/jitinterfacex86.cpp +++ b/src/vm/i386/jitinterfacex86.cpp @@ -16,9 +16,6 @@ #include "eeconfig.h" #include "excep.h" #include "comdelegate.h" -#ifdef FEATURE_REMOTING -#include "remoting.h" // create context bound and remote class instances -#endif #include "field.h" #include "ecall.h" #include "asmconstants.h" @@ -205,7 +202,7 @@ extern "C" __declspec(naked) Object* F_CALL_CONV JIT_IsInstanceOfClass(MethodTab STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_TRIGGERS; -#if defined(FEATURE_TYPEEQUIVALENCE) || defined(FEATURE_REMOTING) +#if defined(FEATURE_TYPEEQUIVALENCE) enum { MTEquivalenceFlags = MethodTable::public_enum_flag_HasTypeEquivalence, @@ -241,7 +238,7 @@ extern "C" __declspec(naked) Object* F_CALL_CONV JIT_IsInstanceOfClass(MethodTab jne CheckParent // Check if the instance is a proxy. -#if defined(FEATURE_TYPEEQUIVALENCE) || defined(FEATURE_REMOTING) +#if defined(FEATURE_TYPEEQUIVALENCE) mov eax, [ARGUMENT_REG2] test dword ptr [eax]MethodTable.m_dwFlags, MTEquivalenceFlags jne SlowPath @@ -251,7 +248,7 @@ extern "C" __declspec(naked) Object* F_CALL_CONV JIT_IsInstanceOfClass(MethodTab ret // Cast didn't match, so try the worker to check for the proxy/equivalence case. -#if defined(FEATURE_TYPEEQUIVALENCE) || defined(FEATURE_REMOTING) +#if defined(FEATURE_TYPEEQUIVALENCE) SlowPath: jmp JITutil_IsInstanceOfAny #endif @@ -354,37 +351,6 @@ HCIMPLEND FCDECL1(Object*, JIT_New, CORINFO_CLASS_HANDLE typeHnd_); -#ifdef FEATURE_REMOTING -HCIMPL1(Object*, JIT_NewCrossContextHelper, CORINFO_CLASS_HANDLE typeHnd_) -{ - CONTRACTL - { - FCALL_CHECK; - } - CONTRACTL_END; - - TypeHandle typeHnd(typeHnd_); - - OBJECTREF newobj = NULL; - HELPER_METHOD_FRAME_BEGIN_RET_0(); // Set up a frame - - _ASSERTE(!typeHnd.IsTypeDesc()); // we never use this helper for arrays - MethodTable *pMT = typeHnd.AsMethodTable(); - pMT->CheckRestore(); - - // Remoting services determines if the current context is appropriate - // for activation. If the current context is OK then it creates an object - // else it creates a proxy. - // Note: 3/20/03 Added fIsNewObj flag to indicate that CreateProxyOrObject - // is being called from Jit_NewObj ... the fIsCom flag is FALSE by default - - // which used to be the case before this change as well. - newobj = CRemotingServices::CreateProxyOrObject(pMT,FALSE /*fIsCom*/,TRUE/*fIsNewObj*/); - - HELPER_METHOD_FRAME_END(); - return(OBJECTREFToObject(newobj)); -} -HCIMPLEND -#endif // FEATURE_REMOTING HCIMPL1(Object*, AllocObjectWrapper, MethodTable *pMT) { @@ -408,69 +374,6 @@ HCIMPLEND // have remote activation. If not, we use the superfast allocator to // allocate the object. Otherwise, we take the slow path of allocating // the object via remoting services. -#ifdef FEATURE_REMOTING -__declspec(naked) Object* F_CALL_CONV JIT_NewCrossContext(CORINFO_CLASS_HANDLE typeHnd_) -{ - STATIC_CONTRACT_SO_TOLERANT; - STATIC_CONTRACT_THROWS; - STATIC_CONTRACT_GC_TRIGGERS; - - _asm - { - // Check if remoting has been configured - push ARGUMENT_REG1 // save registers - push ARGUMENT_REG1 - call CRemotingServices::RequiresManagedActivation - test eax, eax - // Jump to the slow path - jne SpecialOrXCtxHelper -#ifdef _DEBUG - push LL_INFO10 - push LF_GCALLOC - call LoggingOn - test eax, eax - jne AllocWithLogHelper -#endif // _DEBUG - - // if the object doesn't have a finalizer and the size is small, jump to super fast asm helper - mov ARGUMENT_REG1, [esp] - call MethodTable::CannotUseSuperFastHelper - test eax, eax - jne FastHelper - - pop ARGUMENT_REG1 - // Jump to the super fast helper - jmp dword ptr [hlpDynamicFuncTable + DYNAMIC_CORINFO_HELP_NEWSFAST * SIZE VMHELPDEF]VMHELPDEF.pfnHelper - -FastHelper: - pop ARGUMENT_REG1 - // Jump to the helper - jmp JIT_New - -SpecialOrXCtxHelper: -#ifdef FEATURE_COMINTEROP - test eax, ComObjectType - jz XCtxHelper - pop ARGUMENT_REG1 - // Jump to the helper - jmp JIT_New - -XCtxHelper: -#endif // FEATURE_COMINTEROP - - pop ARGUMENT_REG1 - // Jump to the helper - jmp JIT_NewCrossContextHelper - -#ifdef _DEBUG -AllocWithLogHelper: - pop ARGUMENT_REG1 - // Jump to the helper - jmp AllocObjectWrapper -#endif // _DEBUG - } -} -#endif // FEATURE_REMOTING /*********************************************************************/ diff --git a/src/vm/i386/stublinkerx86.cpp b/src/vm/i386/stublinkerx86.cpp index 63b9e87367..cfb5854cbb 100644 --- a/src/vm/i386/stublinkerx86.cpp +++ b/src/vm/i386/stublinkerx86.cpp @@ -26,9 +26,6 @@ #include "array.h" #include "jitinterface.h" #include "codeman.h" -#ifdef FEATURE_REMOTING -#include "remoting.h" -#endif #include "dbginterface.h" #include "eeprofinterfaces.h" #include "eeconfig.h" diff --git a/src/vm/i386/virtualcallstubcpu.hpp b/src/vm/i386/virtualcallstubcpu.hpp index 8c16854d22..67737a2d72 100644 --- a/src/vm/i386/virtualcallstubcpu.hpp +++ b/src/vm/i386/virtualcallstubcpu.hpp @@ -16,9 +16,6 @@ #ifdef DECLARE_DATA #include "asmconstants.h" -#ifdef FEATURE_REMOTING -#include "remoting.h" -#endif #endif #include <pshpack1.h> // Since we are placing code, we want byte packing of the structs @@ -539,120 +536,6 @@ __declspec (naked) void ResolveWorkerAsmStub() } } -#ifdef FEATURE_REMOTING -/* For an in-context dispatch, we will find the target. This - is the slow path, and erects a MachState structure for - creating a HelperMethodFrame - - Entry stack: - dispatch token - return address of caller to stub - - Call stack: - pointer to StubDispatchFrame - call site - dispatch token - StubDispatchFrame - GSCookie - negspace - vptr - datum - ArgumentRegisters (ecx, edx) - CalleeSavedRegisters (ebp, ebx, esi, edi) - return address of caller to stub -*/ -__declspec (naked) void InContextTPDispatchAsmStub() -{ - CANNOT_HAVE_CONTRACT; - - __asm { - // Pop dispatch token - pop eax - - // push ebp-frame - push ebp - mov ebp,esp - - // save CalleeSavedRegisters - push ebx - push esi - push edi - - // push ArgumentRegisters - push ecx - push edx - - mov esi, esp - - push eax // token - push esi // pTransitionContext - - // Make the call - call VSD_GetTargetForTPWorker - - // From here on, mustn't trash eax - - // pop ArgumentRegisters - pop edx - pop ecx - - // pop CalleeSavedRegisters - pop edi - pop esi - pop ebx - pop ebp - - // Now jump to the target - jmp eax // continue on into the method - } -} - -/* For an in-context dispatch, we will try to find the target in - the resolve cache. If this fails, we will jump to the full - version of InContextTPDispatchAsmStub - - Entry stack: - dispatch slot number of interface MD - caller return address - ECX: this object -*/ -__declspec (naked) void InContextTPQuickDispatchAsmStub() -{ - CANNOT_HAVE_CONTRACT; - - __asm { - // Spill registers - push ecx - push edx - - // Arg 2 - token - mov eax, [esp + 8] - push eax - - // Arg 1 - this - push ecx - - // Make the call - call VSD_GetTargetForTPWorkerQuick - - // Restore registers - pop edx - pop ecx - - // Test to see if we found a target - test eax, eax - jnz TargetFound - - // If no target, jump to the slow worker - jmp InContextTPDispatchAsmStub - - TargetFound: - // We got a target, so pop off the token and jump to it - add esp,4 - jmp eax - } -} -#endif // FEATURE_REMOTING /* Call the callsite back patcher. The fail stub piece of the resolver is being call too often, i.e. dispatch stubs are failing the expect MT test too often. |