Alexandre Julliard : widl: Add support for exception handling in the generated proxy code.

Alexandre Julliard julliard at winehq.org
Thu Jul 3 06:35:56 CDT 2008


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Jul  3 12:59:37 2008 +0200

widl: Add support for exception handling in the generated proxy code.

---

 tools/widl/proxy.c |   59 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 59 insertions(+), 0 deletions(-)

diff --git a/tools/widl/proxy.c b/tools/widl/proxy.c
index ee8db39..60ee3c0 100644
--- a/tools/widl/proxy.c
+++ b/tools/widl/proxy.c
@@ -109,6 +109,65 @@ static void init_proxy(const statement_list_t *stmts)
   print_proxy( "\n");
   print_proxy( "#include \"%s\"\n", header_name);
   print_proxy( "\n");
+  print_proxy( "#ifndef USE_COMPILER_EXCEPTIONS\n");
+  print_proxy( "\n");
+  print_proxy( "#include \"wine/exception.h\"\n");
+  print_proxy( "#undef RpcTryExcept\n");
+  print_proxy( "#undef RpcExcept\n");
+  print_proxy( "#undef RpcEndExcept\n");
+  print_proxy( "#undef RpcExceptionCode\n");
+  print_proxy( "\n");
+  print_proxy( "struct __proxy_frame\n");
+  print_proxy( "{\n");
+  print_proxy( "    EXCEPTION_REGISTRATION_RECORD frame;\n");
+  print_proxy( "    sigjmp_buf                    jmp;\n");
+  print_proxy( "    DWORD                         code;\n");
+  print_proxy( "    MIDL_STUB_MESSAGE            *stub;\n");
+  print_proxy( "};\n");
+  print_proxy( "\n");
+  print_proxy( "static DWORD __proxy_exception_handler( EXCEPTION_RECORD *record,\n");
+  print_proxy( "                                        EXCEPTION_REGISTRATION_RECORD *frame,\n");
+  print_proxy( "                                        CONTEXT *context,\n");
+  print_proxy( "                                        EXCEPTION_REGISTRATION_RECORD **pdispatcher )\n");
+  print_proxy( "{\n");
+  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( "        return ExceptionContinueSearch;\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( "    __wine_pop_frame( frame );\n");
+  print_proxy( "    siglongjmp( proxy_frame->jmp, 1 );\n");
+  print_proxy( "}\n");
+  print_proxy( "\n");
+  print_proxy( "#define RpcTryExcept \\\n");
+  print_proxy( "    do { \\\n");
+  print_proxy( "        struct __proxy_frame __proxy_frame; \\\n");
+  print_proxy( "        __proxy_frame.frame.Handler = __proxy_exception_handler; \\\n");
+  print_proxy( "        __proxy_frame.stub = &_StubMsg; \\\n");
+  print_proxy( "        if (!sigsetjmp( __proxy_frame.jmp, 0 )) \\\n");
+  print_proxy( "        { \\\n");
+  print_proxy( "            __wine_push_frame( &__proxy_frame.frame ); \\\n");
+  print_proxy( "            {\n");
+  print_proxy( "\n");
+  print_proxy( "#define RpcExcept(expr) \\\n");
+  print_proxy( "            } \\\n");
+  print_proxy( "            __wine_pop_frame( &__proxy_frame.frame ); \\\n");
+  print_proxy( "        } \\\n");
+  print_proxy( "        else \\\n");
+  print_proxy( "        {\n");
+  print_proxy( "\n");
+  print_proxy( "#define RpcEndExcept \\\n");
+  print_proxy( "        } \\\n");
+  print_proxy( "    } while(0);\n");
+  print_proxy( "\n");
+  print_proxy( "#define RpcExceptionCode() (__proxy_frame.code)\n");
+  print_proxy( "\n");
+  print_proxy( "#endif /* USE_COMPILER_EXCEPTIONS */\n");
+  print_proxy( "\n");
   write_formatstringsdecl(proxy, indent, stmts, need_proxy);
   write_stubdescproto();
 }




More information about the wine-cvs mailing list