Alexandre Julliard : rpcrt4: Make more of the stubless proxy setup code platform-independent.

Alexandre Julliard julliard at winehq.org
Wed Jun 15 13:42:58 CDT 2011


Module: wine
Branch: master
Commit: 779a8fcddb04f19225e162aff915f8adf024f6d5
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=779a8fcddb04f19225e162aff915f8adf024f6d5

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Jun 15 12:26:03 2011 +0200

rpcrt4: Make more of the stubless proxy setup code platform-independent.

---

 dlls/rpcrt4/cproxy.c |   44 ++++++++++++++++++++++++++------------------
 1 files changed, 26 insertions(+), 18 deletions(-)

diff --git a/dlls/rpcrt4/cproxy.c b/dlls/rpcrt4/cproxy.c
index 6a73953..96dc0b5 100644
--- a/dlls/rpcrt4/cproxy.c
+++ b/dlls/rpcrt4/cproxy.c
@@ -69,7 +69,7 @@ static inline StdProxyImpl *impl_from_proxy_obj( void *iface )
     return CONTAINING_RECORD(iface, StdProxyImpl, PVtbl);
 }
 
-#if defined(__i386__)
+#ifdef __i386__
 
 #include "pshpack1.h"
 
@@ -112,6 +112,30 @@ LONG_PTR WINAPI ObjectStubless(void **args)
     return ndr_client_call(stubless->pStubDesc, fs, args + 2);
 }
 
+static inline void init_thunk( struct thunk *thunk, unsigned int index )
+{
+    thunk->mov_eax = 0xb8; /* movl $n,%eax */
+    thunk->index   = index;
+    thunk->jmp     = 0xe9; /* jmp */
+    thunk->handler = (char *)call_stubless_func - (char *)(&thunk->handler + 1);
+}
+
+#else  /* __i386__ */
+
+#warning You must implement stubless proxies for your CPU
+
+struct thunk
+{
+  DWORD index;
+};
+
+static inline void init_thunk( struct thunk *thunk, unsigned int index )
+{
+    thunk->index = index;
+}
+
+#endif  /* __i386__ */
+
 #define BLOCK_SIZE 1024
 #define MAX_BLOCKS 64  /* 64k methods should be enough for anybody */
 
@@ -126,13 +150,7 @@ static const struct thunk *allocate_block( unsigned int num )
                           MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE );
     if (!block) return NULL;
 
-    for (i = 0; i < BLOCK_SIZE; i++)
-    {
-        block[i].mov_eax = 0xb8; /* movl $n,%eax */
-        block[i].index   = BLOCK_SIZE * num + i + 3;
-        block[i].jmp     = 0xe9; /* jmp */
-        block[i].handler = (char *)call_stubless_func - (char *)(&block[i].handler + 1);
-    }
+    for (i = 0; i < BLOCK_SIZE; i++) init_thunk( &block[i], BLOCK_SIZE * num + i + 3 );
     VirtualProtect( block, BLOCK_SIZE * sizeof(*block), PAGE_EXECUTE_READ, NULL );
     prev = InterlockedCompareExchangePointer( (void **)&method_blocks[num], block, NULL );
     if (prev) /* someone beat us to it */
@@ -163,16 +181,6 @@ static BOOL fill_stubless_table( IUnknownVtbl *vtbl, DWORD num )
     return TRUE;
 }
 
-#else  /* __i386__ */
-
-static BOOL fill_stubless_table( IUnknownVtbl *vtbl, DWORD num )
-{
-    ERR("stubless proxies are not supported on this architecture\n");
-    return FALSE;
-}
-
-#endif  /* __i386__ */
-
 HRESULT StdProxy_Construct(REFIID riid,
                            LPUNKNOWN pUnkOuter,
                            const ProxyFileInfo *ProxyInfo,




More information about the wine-cvs mailing list