Alexandre Julliard : widl: Implemented __finally support in server functions.

Alexandre Julliard julliard at winehq.org
Tue Sep 16 06:54:04 CDT 2008


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Sep 15 18:03:49 2008 +0200

widl: Implemented __finally support in server functions.

---

 tools/widl/server.c |   69 ++++++++++++++++++++++++++++----------------------
 1 files changed, 39 insertions(+), 30 deletions(-)

diff --git a/tools/widl/server.c b/tools/widl/server.c
index f7c75fe..ab5a458 100644
--- a/tools/widl/server.c
+++ b/tools/widl/server.c
@@ -63,21 +63,38 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
         /* check for a defined binding handle */
         explicit_handle_var = get_explicit_handle_var(func);
 
-        print_server("void __RPC_STUB %s_%s( PRPC_MESSAGE _pRpcMessage )\n", iface->name, get_name(def));
-
-        /* write the functions body */
-        fprintf(server, "{\n");
+        print_server("struct __frame_%s_%s\n{\n", iface->name, get_name(def));
         indent++;
-        print_server( "struct __server_frame __f, * const __frame = &__f;\n" );
+        print_server("__DECL_EXCEPTION_FRAME\n");
+        print_server("MIDL_STUB_MESSAGE _StubMsg;\n");
 
         /* Declare arguments */
         declare_stub_args(server, indent, func);
 
-        print_server("RPC_STATUS _Status;\n");
-        fprintf(server, "\n");
+        indent--;
+        print_server("};\n\n");
+
+        print_server("static void __finally_%s_%s(", iface->name, get_name(def));
+        fprintf(server," struct __frame_%s_%s *__frame )\n{\n", iface->name, get_name(def));
+
+        indent++;
+        write_remoting_arguments(server, indent, func, "__frame->", PASS_OUT, PHASE_FREE);
+
+        if (has_full_pointer)
+            write_full_pointer_free(server, indent, func);
+
+        indent--;
+        print_server("}\n\n");
 
+        print_server("void __RPC_STUB %s_%s( PRPC_MESSAGE _pRpcMessage )\n", iface->name, get_name(def));
+
+        /* write the functions body */
+        fprintf(server, "{\n");
+        indent++;
+        print_server("struct __frame_%s_%s __f, * const __frame = &__f;\n", iface->name, get_name(def));
+        if (has_out_arg_or_return(func)) print_server("RPC_STATUS _Status;\n");
+        fprintf(server, "\n");
 
-        print_server("((void)(_Status));\n");
         print_server("NdrServerInitializeNew(\n");
         indent++;
         print_server("_pRpcMessage,\n");
@@ -85,13 +102,13 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
         print_server("&%s_StubDesc);\n", iface->name);
         indent--;
         fprintf(server, "\n");
-        print_server( "RpcExceptionInit( __server_filter, __server_finally );\n" );
+        print_server( "RpcExceptionInit( __server_filter, __finally_%s_%s );\n", iface->name, get_name(def));
 
-        write_parameters_init(server, indent, func, "");
+        write_parameters_init(server, indent, func, "__frame->");
 
         if (explicit_handle_var)
         {
-            print_server("%s = _pRpcMessage->Handle;\n", explicit_handle_var->name);
+            print_server("__frame->%s = _pRpcMessage->Handle;\n", explicit_handle_var->name);
             fprintf(server, "\n");
         }
 
@@ -117,7 +134,7 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
             fprintf(server, "\n");
 
             /* unmarshall arguments */
-            write_remoting_arguments(server, indent, func, "", PASS_IN, PHASE_UNMARSHAL);
+            write_remoting_arguments(server, indent, func, "__frame->", PASS_IN, PHASE_UNMARSHAL);
         }
 
         print_server("if (__frame->_StubMsg.Buffer > __frame->_StubMsg.BufferEnd)\n");
@@ -138,11 +155,11 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
         fprintf(server, "\n");
 
         /* Assign 'out' arguments */
-        assign_stub_out_args(server, indent, func, "");
+        assign_stub_out_args(server, indent, func, "__frame->");
 
         /* Call the real server function */
         if (!is_void(get_func_return_type(func)))
-            print_server("_RetVal = ");
+            print_server("__frame->_RetVal = ");
         else
             print_server("");
         fprintf(server, "%s%s", prefix_server, get_name(def));
@@ -167,11 +184,12 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
                     int is_ch_ptr = is_aliaschain_attr(var->type, ATTR_CONTEXTHANDLE) ? FALSE : TRUE;
                     print_server("(");
                     write_type_decl_left(server, var->type);
-                    fprintf(server, ")%sNDRSContextValue(%s)", is_ch_ptr ? "" : "*", var->name);
+                    fprintf(server, ")%sNDRSContextValue(__frame->%s)",
+                            is_ch_ptr ? "" : "*", var->name);
                 }
                 else
                 {
-                    print_server("%s%s", var->type->declarray ? "*" : "", get_name(var));
+                    print_server("%s__frame->%s", var->type->declarray ? "*" : "", var->name);
                 }
             }
             fprintf(server, ");\n");
@@ -184,10 +202,10 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
 
         if (has_out_arg_or_return(func))
         {
-            write_remoting_arguments(server, indent, func, "", PASS_OUT, PHASE_BUFFERSIZE);
+            write_remoting_arguments(server, indent, func, "__frame->", PASS_OUT, PHASE_BUFFERSIZE);
 
             if (!is_void(get_func_return_type(func)))
-                write_remoting_arguments(server, indent, func, "", PASS_RETURN, PHASE_BUFFERSIZE);
+                write_remoting_arguments(server, indent, func, "__frame->", PASS_RETURN, PHASE_BUFFERSIZE);
 
             print_server("_pRpcMessage->BufferLength = __frame->_StubMsg.BufferLength;\n");
             fprintf(server, "\n");
@@ -202,23 +220,18 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
         }
 
         /* marshall arguments */
-        write_remoting_arguments(server, indent, func, "", PASS_OUT, PHASE_MARSHAL);
+        write_remoting_arguments(server, indent, func, "__frame->", PASS_OUT, PHASE_MARSHAL);
 
         /* marshall the return value */
         if (!is_void(get_func_return_type(func)))
-            write_remoting_arguments(server, indent, func, "", PASS_RETURN, PHASE_MARSHAL);
+            write_remoting_arguments(server, indent, func, "__frame->", PASS_RETURN, PHASE_MARSHAL);
 
         indent--;
         print_server("}\n");
         print_server("RpcFinally\n");
         print_server("{\n");
         indent++;
-
-        write_remoting_arguments(server, indent, func, "", PASS_OUT, PHASE_FREE);
-
-        if (has_full_pointer)
-            write_full_pointer_free(server, indent, func);
-
+        print_server("__finally_%s_%s( __frame );\n", iface->name, get_name(def));
         indent--;
         print_server("}\n");
         print_server("RpcEndFinally\n");
@@ -384,10 +397,6 @@ static void init_server(void)
     print_server( "    return RPC_BAD_STUB_DATA_EXCEPTION_FILTER;\n");
     print_server( "}\n");
     print_server( "\n");
-    print_server("static void __server_finally( struct __server_frame *__frame )\n");
-    print_server( "{\n");
-    print_server( "}\n");
-    print_server( "\n");
 }
 
 




More information about the wine-cvs mailing list