Rob Shearman : widl: Write pointers in write_typeformatstring_var using write_pointer_tfs.

Alexandre Julliard julliard at winehq.org
Tue Mar 16 11:49:13 CDT 2010


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

Author: Rob Shearman <robertshearman at gmail.com>
Date:   Mon Mar 15 19:29:48 2010 +0000

widl: Write pointers in write_typeformatstring_var using write_pointer_tfs.

Avoid duplicating the pointer writing code.

---

 tools/widl/typegen.c |   71 +++++++++++++++----------------------------------
 1 files changed, 22 insertions(+), 49 deletions(-)

diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c
index b0c2c20..0316531 100644
--- a/tools/widl/typegen.c
+++ b/tools/widl/typegen.c
@@ -1366,6 +1366,9 @@ static unsigned int write_simple_pointer(FILE *file, const attr_list_t *attrs, c
     unsigned char fc;
     unsigned char pointer_fc;
     const type_t *ref;
+    int in_attr = is_attr(attrs, ATTR_IN);
+    int out_attr = is_attr(attrs, ATTR_OUT);
+    unsigned char flags = RPC_FC_P_SIMPLEPOINTER;
 
     /* for historical reasons, write_simple_pointer also handled string types,
      * but no longer does. catch bad uses of the function with this check */
@@ -1380,8 +1383,12 @@ static unsigned int write_simple_pointer(FILE *file, const attr_list_t *attrs, c
     else
         fc = get_basic_fc(ref);
 
-    print_file(file, 2, "0x%02x, 0x%x,\t/* %s [simple_pointer] */\n",
-               pointer_fc, RPC_FC_P_SIMPLEPOINTER, string_of_type(pointer_fc));
+    if (out_attr && !in_attr)
+        flags |= RPC_FC_P_ONSTACK;
+
+    print_file(file, 2, "0x%02x, 0x%x,\t/* %s %s[simple_pointer] */\n",
+               pointer_fc, flags, string_of_type(pointer_fc),
+               flags & RPC_FC_P_ONSTACK ? "[allocated_on_stack] " : "");
     print_file(file, 2, "0x%02x,\t/* %s */\n", fc, string_of_type(fc));
     print_file(file, 2, "0x5c,\t/* FC_PAD */\n");
     return 4;
@@ -1395,7 +1402,8 @@ static void print_start_tfs_comment(FILE *file, type_t *t, unsigned int tfsoff)
 }
 
 static unsigned int write_pointer_tfs(FILE *file, const attr_list_t *attrs,
-                                      type_t *type, int toplevel_param,
+                                      type_t *type, unsigned int ref_offset,
+                                      int toplevel_param,
                                       unsigned int *typestring_offset)
 {
     unsigned int offset = *typestring_offset;
@@ -1412,10 +1420,10 @@ static unsigned int write_pointer_tfs(FILE *file, const attr_list_t *attrs,
                                                    toplevel_param);
         break;
     default:
-        if (ref->typestring_offset)
+        if (ref_offset)
             write_nonsimple_pointer(file, attrs, type,
                                     toplevel_param,
-                                    type_pointer_get_ref(type)->typestring_offset,
+                                    ref_offset,
                                     typestring_offset);
         break;
     }
@@ -2412,7 +2420,9 @@ static unsigned int write_struct_tfs(FILE *file, type_t *type,
                 if (is_string_type(f->attrs, ft))
                     write_string_tfs(file, f->attrs, ft, FALSE, f->name, tfsoff);
                 else
-                    write_pointer_tfs(file, f->attrs, ft, FALSE, tfsoff);
+                    write_pointer_tfs(file, f->attrs, ft,
+                                      type_pointer_get_ref(ft)->typestring_offset,
+                                      FALSE, tfsoff);
             }
             else if (type_get_type(ft) == TYPE_ARRAY && type_array_is_decl_as_ptr(ft))
             {
@@ -2794,48 +2804,11 @@ static unsigned int write_typeformatstring_var(FILE *file, int indent, const var
     case TGT_IFACE_POINTER:
         return write_ip_tfs(file, var->attrs, type, typeformat_offset);
     case TGT_POINTER:
-    {
-        type_t *ref = type_pointer_get_ref(type);
-
-        switch (typegen_detect_type(ref, NULL, TDT_ALL_TYPES))
-        {
-        /* special case for pointers to base types */
-        case TGT_BASIC:
-        case TGT_ENUM:
-        {
-            unsigned char fc;
-            size_t start_offset = *typeformat_offset;
-            int in_attr = is_attr(var->attrs, ATTR_IN);
-            int out_attr = is_attr(var->attrs, ATTR_OUT);
-
-            if (type_get_type(ref) == TYPE_ENUM)
-                fc = get_enum_fc(ref);
-            else
-                fc = get_basic_fc(ref);
-
-            print_file(file, indent, "0x%x, 0x%x,    /* %s %s[simple_pointer] */\n",
-                       get_pointer_fc(type, var->attrs, toplevel_param),
-                       (!in_attr && out_attr) ? 0x0C : 0x08,
-                       string_of_type(get_pointer_fc(type, var->attrs, toplevel_param)),
-                       (!in_attr && out_attr) ? "[allocated_on_stack] " : "");
-            print_file(file, indent, "0x%02x,    /* %s */\n",
-                       fc, string_of_type(fc));
-            print_file(file, indent, "0x5c,          /* FC_PAD */\n");
-            *typeformat_offset += 4;
-            return start_offset;
-        }
-        default:
-            break;
-        }
-
-        offset = write_typeformatstring_var(file, indent, func, ref, var,
-                                            FALSE, typeformat_offset);
-        if (file)
-            fprintf(file, "/* %2u */\n", *typeformat_offset);
-        return write_nonsimple_pointer(file, var->attrs, type,
-                                       toplevel_param,
-                                       offset, typeformat_offset);
-    }
+        offset = write_typeformatstring_var(file, indent, func,
+                                   type_pointer_get_ref(type), var,
+                                   FALSE, typeformat_offset);
+        return write_pointer_tfs(file, var->attrs, type, offset,
+                                 toplevel_param, typeformat_offset);
     case TGT_INVALID:
         break;
     }
@@ -2867,7 +2840,7 @@ static int write_embedded_types(FILE *file, const attr_list_t *attrs, type_t *ty
             retmask |= write_embedded_types(file, NULL, ref, name, TRUE, tfsoff);
 
         if (write_ptr)
-            write_pointer_tfs(file, attrs, type, FALSE, tfsoff);
+            write_pointer_tfs(file, attrs, type, type_pointer_get_ref(type)->typestring_offset, FALSE, tfsoff);
 
         retmask |= 1;
         break;




More information about the wine-cvs mailing list