Jacek Caban : widl: Write type string for serialized types.

Alexandre Julliard julliard at winehq.org
Fri Nov 9 14:12:16 CST 2018


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Nov  9 13:51:10 2018 +0100

widl: Write type string for serialized types.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 tools/widl/typegen.c | 55 +++++++++++++++++++++++++++++++++++++++-------------
 1 file changed, 42 insertions(+), 13 deletions(-)

diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c
index 8b23c63..27ba60f 100644
--- a/tools/widl/typegen.c
+++ b/tools/widl/typegen.c
@@ -3680,25 +3680,54 @@ static int write_embedded_types(FILE *file, const attr_list_t *attrs, type_t *ty
 
 static void process_tfs_iface(type_t *iface, FILE *file, int indent, unsigned int *offset)
 {
-    const statement_t *stmt_func;
+    const statement_list_t *stmts = type_iface_get_stmts(iface);
+    const statement_t *stmt;
     var_t *var;
 
     current_iface = iface;
-    STATEMENTS_FOR_EACH_FUNC( stmt_func, type_iface_get_stmts(iface) )
+    if (stmts) LIST_FOR_EACH_ENTRY( stmt, stmts, statement_t, entry )
     {
-        const var_t *func = stmt_func->u.var;
-        current_func = func;
-        if (is_local(func->attrs)) continue;
+        switch(stmt->type)
+        {
+        case STMT_DECLARATION:
+        {
+            const var_t *func = stmt->u.var;
+
+            if(stmt->u.var->stgclass != STG_NONE
+               || type_get_type_detect_alias(stmt->u.var->type) != TYPE_FUNCTION)
+                continue;
 
-        var = type_function_get_retval(func->type);
-        if (!is_void(var->type))
-            var->typestring_offset = write_type_tfs( file, 2, func->attrs, var->type, func->name,
-                                                     TYPE_CONTEXT_PARAM, offset);
+            current_func = func;
+            if (is_local(func->attrs)) continue;
 
-        if (type_get_function_args(func->type))
-            LIST_FOR_EACH_ENTRY( var, type_get_function_args(func->type), var_t, entry )
-                var->typestring_offset = write_type_tfs( file, 2, var->attrs, var->type, var->name,
-                                                         TYPE_CONTEXT_TOPLEVELPARAM, offset );
+            var = type_function_get_retval(func->type);
+            if (!is_void(var->type))
+                var->typestring_offset = write_type_tfs( file, 2, func->attrs, var->type, func->name,
+                                                         TYPE_CONTEXT_PARAM, offset);
+
+            if (type_get_function_args(func->type))
+                LIST_FOR_EACH_ENTRY( var, type_get_function_args(func->type), var_t, entry )
+                    var->typestring_offset = write_type_tfs( file, 2, var->attrs, var->type, var->name,
+                                                             TYPE_CONTEXT_TOPLEVELPARAM, offset );
+            break;
+
+        }
+        case STMT_TYPEDEF:
+        {
+            const type_list_t *type_entry;
+            for (type_entry = stmt->u.type_list; type_entry; type_entry = type_entry->next)
+            {
+                if (is_attr(type_entry->type->attrs, ATTR_ENCODE)
+                    || is_attr(type_entry->type->attrs, ATTR_DECODE))
+                    type_entry->type->typestring_offset = write_type_tfs( file, 2,
+                            type_entry->type->attrs, type_entry->type, type_entry->type->name,
+                            TYPE_CONTEXT_CONTAINER, offset);
+            }
+            break;
+        }
+        default:
+            break;
+        }
     }
 }
 




More information about the wine-cvs mailing list