Rob Shearman : widl: The implicit_handle attribute is allowed with a handle explicitly specified in the function parameters .

Alexandre Julliard julliard at winehq.org
Mon Apr 21 07:46:17 CDT 2008


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

Author: Rob Shearman <rob at codeweavers.com>
Date:   Sun Apr 20 22:15:24 2008 +0100

widl: The implicit_handle attribute is allowed with a handle explicitly specified in the function parameters.

In that case, that handle is used instead of the implicit handle.

Fix the check for the explicit_handle attribute being specified without
a handle being specified in the function parameters, even though issuing
an error is wrong. (Thanks to Marcus Meissner & Coverity for spotting
that the check didn't do what it was supposed to do.)

---

 tools/widl/client.c |   31 ++++++++++---------------------
 tools/widl/header.c |   19 -------------------
 tools/widl/server.c |   18 ------------------
 3 files changed, 10 insertions(+), 58 deletions(-)

diff --git a/tools/widl/client.c b/tools/widl/client.c
index eb1ade2..b3f89a7 100644
--- a/tools/widl/client.c
+++ b/tools/widl/client.c
@@ -110,22 +110,11 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
         {
             explicit_generic_handle_var = get_explicit_generic_handle_var(func);
             if (!explicit_generic_handle_var)
-                context_handle_var = get_context_handle_var(func);
-        }
-        if (explicit_handle)
-        {
-            if (!explicit_handle_var || !explicit_generic_handle_var || !context_handle_var)
             {
-                error("%s() does not define an explicit binding handle!\n", def->name);
-                return;
-            }
-        }
-        else if (implicit_handle)
-        {
-            if (explicit_handle_var)
-            {
-                error("%s() must not define a binding handle!\n", def->name);
-                return;
+                context_handle_var = get_context_handle_var(func);
+                if (!context_handle_var && explicit_handle)
+                    /* FIXME: should use automatically added IDL_handle parameter */
+                    error("explicit_handle attribute specified and %s() does not define an explicit binding handle - not implemented yet\n", def->name);
             }
         }
 
@@ -196,12 +185,7 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
             fprintf(client, ");\n\n");
         }
 
-        if (implicit_handle)
-        {
-            print_client("_Handle = %s;\n", implicit_handle);
-            fprintf(client, "\n");
-        }
-        else if (explicit_handle_var)
+        if (explicit_handle_var)
         {
             print_client("_Handle = %s;\n", explicit_handle_var->name);
             fprintf(client, "\n");
@@ -225,6 +209,11 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
             indent--;
             fprintf(client, "\n");
         }
+        else if (implicit_handle)
+        {
+            print_client("_Handle = %s;\n", implicit_handle);
+            fprintf(client, "\n");
+        }
 
         write_remoting_arguments(client, indent, func, PASS_IN, PHASE_BUFFERSIZE);
 
diff --git a/tools/widl/header.c b/tools/widl/header.c
index dcc3480..8668ce9 100644
--- a/tools/widl/header.c
+++ b/tools/widl/header.c
@@ -896,31 +896,12 @@ static void write_function_proto(const type_t *iface, const func_t *fun, const c
 
 static void write_function_protos(const type_t *iface)
 {
-  const char *implicit_handle = get_attrp(iface->attrs, ATTR_IMPLICIT_HANDLE);
-  int explicit_handle = is_attr(iface->attrs, ATTR_EXPLICIT_HANDLE);
-  const var_t* explicit_handle_var;
   const func_t *cur;
   int prefixes_differ = strcmp(prefix_client, prefix_server);
 
   if (!iface->funcs) return;
   LIST_FOR_EACH_ENTRY( cur, iface->funcs, const func_t, entry )
   {
-    var_t *def = cur->def;
-
-    /* check for a defined binding handle */
-    explicit_handle_var = get_explicit_handle_var(cur);
-    if (explicit_handle) {
-      if (!explicit_handle_var) {
-        error("%s() does not define an explicit binding handle!\n", def->name);
-        return;
-      }
-    } else if (implicit_handle) {
-      if (explicit_handle_var) {
-        error("%s() must not define a binding handle!\n", def->name);
-        return;
-      }
-    }
-
     if (prefixes_differ) {
       fprintf(header, "/* client prototype */\n");
       write_function_proto(iface, cur, prefix_client);
diff --git a/tools/widl/server.c b/tools/widl/server.c
index 2efb712..bb16c54 100644
--- a/tools/widl/server.c
+++ b/tools/widl/server.c
@@ -50,8 +50,6 @@ static void print_server(const char *format, ...)
 
 static void write_function_stubs(type_t *iface, unsigned int *proc_offset)
 {
-    char *implicit_handle = get_attrp(iface->attrs, ATTR_IMPLICIT_HANDLE);
-    int explicit_handle = is_attr(iface->attrs, ATTR_EXPLICIT_HANDLE);
     const func_t *func;
     const var_t *var;
     const var_t* explicit_handle_var;
@@ -64,22 +62,6 @@ 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);
-        if (explicit_handle)
-        {
-            if (!explicit_handle_var)
-            {
-                error("%s() does not define an explicit binding handle!\n", def->name);
-                return;
-            }
-        }
-        else if (implicit_handle)
-        {
-            if (explicit_handle_var)
-            {
-                error("%s() must not define a binding handle!\n", def->name);
-                return;
-            }
-        }
 
         fprintf(server, "void __RPC_STUB\n");
         fprintf(server, "%s_", iface->name);




More information about the wine-cvs mailing list