Alexandre Julliard : widl: Add support for finally function in proxy methods.

Alexandre Julliard julliard at winehq.org
Tue Sep 2 08:32:47 CDT 2008


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Sat Aug 30 11:25:22 2008 +0200

widl: Add support for finally function in proxy methods.

---

 tools/widl/proxy.c |   44 ++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 40 insertions(+), 4 deletions(-)

diff --git a/tools/widl/proxy.c b/tools/widl/proxy.c
index c932b34..8f1618e 100644
--- a/tools/widl/proxy.c
+++ b/tools/widl/proxy.c
@@ -115,6 +115,9 @@ static void init_proxy(const statement_list_t *stmts)
   print_proxy( "#undef RpcTryExcept\n");
   print_proxy( "#undef RpcExcept\n");
   print_proxy( "#undef RpcEndExcept\n");
+  print_proxy( "#undef RpcTryFinally\n");
+  print_proxy( "#undef RpcFinally\n");
+  print_proxy( "#undef RpcEndFinally\n");
   print_proxy( "#undef RpcExceptionCode\n");
   print_proxy( "\n");
   print_proxy( "struct __proxy_frame\n");
@@ -123,8 +126,15 @@ static void init_proxy(const statement_list_t *stmts)
   print_proxy( "    sigjmp_buf                    jmp;\n");
   print_proxy( "    DWORD                         code;\n");
   print_proxy( "    MIDL_STUB_MESSAGE            *stub;\n");
+  print_proxy( "    void                         *this;\n");
+  print_proxy( "    int                           fullptr;\n");
   print_proxy( "};\n");
   print_proxy( "\n");
+  print_proxy("static void __proxy_finally_handler( struct __proxy_frame *frame )\n");
+  print_proxy( "{\n");
+  print_proxy( "    if (frame->fullptr) NdrFullPointerXlatFree( frame->stub->FullPtrXlatTables );\n");
+  print_proxy( "    if (frame->this) NdrProxyFreeBuffer( frame->this, frame->stub );\n" );
+  print_proxy( "}\n\n");
   print_proxy( "static DWORD __proxy_exception_handler( EXCEPTION_RECORD *record,\n");
   print_proxy( "                                        EXCEPTION_REGISTRATION_RECORD *frame,\n");
   print_proxy( "                                        CONTEXT *context,\n");
@@ -133,12 +143,17 @@ static void init_proxy(const statement_list_t *stmts)
   print_proxy( "    struct __proxy_frame *proxy_frame = (struct __proxy_frame *)frame;\n");
   print_proxy( "\n");
   print_proxy( "    if (record->ExceptionFlags & (EH_UNWINDING | EH_EXIT_UNWIND | EH_NESTED_CALL))\n");
+  print_proxy( "    {\n" );
+  print_proxy( "        if (record->ExceptionFlags & (EH_UNWINDING | EH_EXIT_UNWIND))\n");
+  print_proxy( "            __proxy_finally_handler( proxy_frame );\n");
   print_proxy( "        return ExceptionContinueSearch;\n");
+  print_proxy( "    }\n" );
   print_proxy( "    if (proxy_frame->stub->dwStubPhase == PROXY_SENDRECEIVE)\n");
   print_proxy( "        return ExceptionContinueSearch;\n");
   print_proxy( "\n");
   print_proxy( "    proxy_frame->code = record->ExceptionCode;\n");
   print_proxy( "    __wine_rtl_unwind( frame, record );\n");
+  print_proxy( "    __proxy_finally_handler( proxy_frame );\n");
   print_proxy( "    __wine_pop_frame( frame );\n");
   print_proxy( "    siglongjmp( proxy_frame->jmp, 1 );\n");
   print_proxy( "}\n");
@@ -166,6 +181,27 @@ static void init_proxy(const statement_list_t *stmts)
   print_proxy( "\n");
   print_proxy( "#define RpcExceptionCode() (__proxy_frame.code)\n");
   print_proxy( "\n");
+  print_proxy( "#define RpcTryFinallyProxy(ptr) \\\n");
+  print_proxy("    __proxy_frame.this = This; \\\n");
+  print_proxy("    __proxy_frame.fullptr = ptr;\n");
+  print_proxy( "\n");
+  print_proxy( "#define RpcFinallyProxy \\\n");
+  print_proxy("    __proxy_frame.this = 0; \\\n");
+  print_proxy("    __proxy_frame.fullptr = 0;\n");
+  print_proxy( "\n");
+  print_proxy( "#define RpcTryFinallyStub\n");
+  print_proxy( "\n");
+  print_proxy( "#define RpcFinallyStub\n");
+  print_proxy( "\n");
+  print_proxy( "#define RpcEndFinally\n");
+  print_proxy( "\n");
+  print_proxy( "#else /* USE_COMPILER_EXCEPTIONS */\n");
+  print_proxy( "\n");
+  print_proxy( "#define RpcTryFinallyProxy(ptr) RpcTryFinally\n");
+  print_proxy( "#define RpcTryFinallyStub RpcTryFinally\n");
+  print_proxy( "#define RpcFinallyProxy RpcFinally\n");
+  print_proxy( "#define RpcFinallyStub RpcFinally\n");
+  print_proxy( "\n");
   print_proxy( "#endif /* USE_COMPILER_EXCEPTIONS */\n");
   print_proxy( "\n");
   write_formatstringsdecl(proxy, indent, stmts, need_proxy);
@@ -355,7 +391,7 @@ static void gen_proxy(type_t *iface, const func_t *cur, int idx,
   print_proxy( "NdrProxyInitialize(This, &_RpcMessage, &_StubMsg, &Object_StubDesc, %d);\n", idx);
   proxy_check_pointers( cur->args );
 
-  print_proxy( "RpcTryFinally\n" );
+  print_proxy( "RpcTryFinallyProxy(%d)\n", has_full_pointer );
   print_proxy( "{\n" );
   indent++;
 
@@ -389,7 +425,7 @@ static void gen_proxy(type_t *iface, const func_t *cur, int idx,
 
   indent--;
   print_proxy( "}\n");
-  print_proxy( "RpcFinally\n" );
+  print_proxy( "RpcFinallyProxy\n" );
   print_proxy( "{\n" );
   indent++;
   if (has_full_pointer)
@@ -449,7 +485,7 @@ static void gen_stub(type_t *iface, const func_t *cur, const char *cas,
 
   write_parameters_init(proxy, indent, cur);
 
-  print_proxy("RpcTryFinally\n");
+  print_proxy("RpcTryFinallyStub\n");
   print_proxy("{\n");
   indent++;
   if (has_full_pointer)
@@ -499,7 +535,7 @@ static void gen_stub(type_t *iface, const func_t *cur, const char *cas,
 
   indent--;
   print_proxy("}\n");
-  print_proxy("RpcFinally\n");
+  print_proxy("RpcFinallyStub\n");
   print_proxy("{\n");
 
   write_remoting_arguments(proxy, indent+1, cur, PASS_OUT, PHASE_FREE);




More information about the wine-cvs mailing list