Robert Shearman : widl: De-reference parameters' types before deciding what to do with them.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Mar 31 13:04:52 CST 2006


Module: wine
Branch: refs/heads/master
Commit: 4edcf2de35e677f3d9eaf099e6286642f917c01e
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=4edcf2de35e677f3d9eaf099e6286642f917c01e

Author: Robert Shearman <rob at codeweavers.com>
Date:   Fri Mar 31 12:45:16 2006 +0100

widl: De-reference parameters' types before deciding what to do with them.

De-reference parameters' types before deciding what to do with them.
Also dereference string parameters since they are immediately
dispatched to write_string_tfs when the string attribute is detected
without any further processing done on them.

---

 tools/widl/typegen.c |   23 +++++++++++++++--------
 1 files changed, 15 insertions(+), 8 deletions(-)

diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c
index e58bc17..e92985c 100644
--- a/tools/widl/typegen.c
+++ b/tools/widl/typegen.c
@@ -706,6 +706,9 @@ static size_t write_string_tfs(FILE *fil
     if (!get_attrp(attrs, ATTR_SIZEIS))
         flags |= RPC_FC_P_SIMPLEPOINTER;
 
+    while (type_has_ref(type))
+        type = type->ref;
+
     if ((type->type != RPC_FC_BYTE) && (type->type != RPC_FC_CHAR) && (type->type != RPC_FC_WCHAR))
     {
         error("write_string_tfs: Unimplemented for type 0x%x of name: %s\n", type->type, name);
@@ -1425,6 +1428,7 @@ void write_remoting_arguments(FILE *file
     while (NEXT_LINK(var)) var = NEXT_LINK(var);
     for (; var; *type_offset += get_size_typeformatstring_var(var), var = PREV_LINK(var))
     {
+        const type_t *type = var->type;
         length_is = get_attrp(var->attrs, ATTR_LENGTHIS);
         size_is = get_attrp(var->attrs, ATTR_SIZEIS);
         has_length = length_is && (length_is->type != EXPR_VOID);
@@ -1453,6 +1457,9 @@ void write_remoting_arguments(FILE *file
             break;
         }
 
+        while (type_has_ref(type))
+            type = type->ref;
+
         if (is_string_type(var->attrs, var->ptr_level, var->array))
         {
             if (var->array && var->array->is_const)
@@ -1545,11 +1552,11 @@ void write_remoting_arguments(FILE *file
                        array_type, function_from_phase(phase), var->name,
                        *type_offset);
         }
-        else if (var->ptr_level == 0 && is_base_type(var->type->type))
+        else if (var->ptr_level == 0 && is_base_type(type->type))
         {
             unsigned int size;
             unsigned int alignment = 0;
-            switch (var->type->type)
+            switch (type->type)
             {
             case RPC_FC_BYTE:
             case RPC_FC_CHAR:
@@ -1586,7 +1593,7 @@ void write_remoting_arguments(FILE *file
                 continue;
 
             default:
-                error("write_remoting_arguments: Unsupported type: %s (0x%02x, ptr_level: 0)\n", var->name, var->type->type);
+                error("write_remoting_arguments: Unsupported type: %s (0x%02x, ptr_level: 0)\n", var->name, type->type);
                 size = 0;
             }
 
@@ -1623,7 +1630,7 @@ void write_remoting_arguments(FILE *file
         {
             const char *ndrtype;
 
-            switch (var->type->type)
+            switch (type->type)
             {
             case RPC_FC_STRUCT:
                 ndrtype = "SimpleStruct";
@@ -1640,7 +1647,7 @@ void write_remoting_arguments(FILE *file
                 break;
             default:
                 error("write_remoting_arguments: Unsupported type: %s (0x%02x, ptr_level: %d)\n",
-                    var->name, var->type->type, var->ptr_level);
+                    var->name, type->type, var->ptr_level);
                 ndrtype = NULL;
             }
 
@@ -1650,10 +1657,10 @@ void write_remoting_arguments(FILE *file
         }
         else
         {
-            if ((var->ptr_level == 1) && (pointer_type == RPC_FC_RP) && is_base_type(var->type->type))
+            if ((var->ptr_level == 1) && (pointer_type == RPC_FC_RP) && is_base_type(type->type))
             {
                 unsigned int size;
-                switch (var->type->type)
+                switch (type->type)
                 {
                 case RPC_FC_BYTE:
                 case RPC_FC_CHAR:
@@ -1686,7 +1693,7 @@ void write_remoting_arguments(FILE *file
                     continue;
 
                 default:
-                    error("write_remoting_arguments: Unsupported type: %s (0x%02x, ptr_level: 0)\n", var->name, var->type->type);
+                    error("write_remoting_arguments: Unsupported type: %s (0x%02x, ptr_level: 1)\n", var->name, type->type);
                     size = 0;
                 }
 




More information about the wine-cvs mailing list