summaryrefslogtreecommitdiff
path: root/src/vm/i386
diff options
context:
space:
mode:
Diffstat (limited to 'src/vm/i386')
-rw-r--r--src/vm/i386/asmconstants.h10
-rw-r--r--src/vm/i386/asmhelpers.asm276
-rw-r--r--src/vm/i386/cgencpu.h3
-rw-r--r--src/vm/i386/cgenx86.cpp3
-rw-r--r--src/vm/i386/excepx86.cpp2
-rw-r--r--src/vm/i386/jithelp.asm49
-rw-r--r--src/vm/i386/jitinterfacex86.cpp103
-rw-r--r--src/vm/i386/stublinkerx86.cpp3
-rw-r--r--src/vm/i386/virtualcallstubcpu.hpp117
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.