Robert Shearman : widl: Start implementing writing of conformance/variance descriptors.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Jan 24 06:45:04 CST 2006


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

Author: Robert Shearman <rob at codeweavers.com>
Date:   Tue Jan 24 11:08:20 2006 +0100

widl: Start implementing writing of conformance/variance descriptors.

---

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

diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c
index d1ce3ca..8e23b92 100644
--- a/tools/widl/typegen.c
+++ b/tools/widl/typegen.c
@@ -42,6 +42,8 @@
 #include "widl.h"
 #include "typegen.h"
 
+static const func_t *current_func;
+
 static int print_file(FILE *file, int indent, const char *format, ...)
 {
     va_list va;
@@ -212,6 +214,86 @@ void write_procformatstring(FILE *file, 
     print_file(file, indent, "\n");
 }
 
+/* write conformance / variance descriptor */
+/* FIXME: only works for top-level variables at the moment */
+static size_t write_conf_or_var_desc(FILE *file, const func_t *func, const expr_t *expr)
+{
+    if (!file) return 4; /* optimisation for sizing pass */
+
+    if (expr->type == EXPR_IDENTIFIER)
+    {
+        if (func)
+        {
+            size_t stack_offset;
+            const var_t *var = func->args;
+            unsigned char param_type = 0;
+            const char *param_type_string = NULL;
+            const type_t *conformance_type = NULL;
+
+            while (NEXT_LINK(var)) var = NEXT_LINK(var);
+            for (stack_offset = 0; var; stack_offset += sizeof(void *), var = PREV_LINK(var))
+            {
+                if (!strcmp(var->name, expr->u.sval))
+                {
+                    conformance_type = var->type;
+                    break;
+                }
+            }
+            if (!conformance_type)
+                error("write_conf_or_var_desc: couldn't find variable %s\n",
+                    expr->u.sval);
+
+            while (type_has_ref(conformance_type))
+                conformance_type = conformance_type->ref;
+
+            switch (conformance_type->type)
+            {
+            case RPC_FC_CHAR:
+            case RPC_FC_SMALL:
+                param_type = RPC_FC_SMALL;
+                param_type_string = "FC_SMALL";
+                break;
+            case RPC_FC_BYTE:
+            case RPC_FC_USMALL:
+                param_type = RPC_FC_USMALL;
+                param_type_string = "FC_USMALL";
+                break;
+            case RPC_FC_WCHAR:
+            case RPC_FC_SHORT:
+                param_type = RPC_FC_SHORT;
+                param_type_string = "FC_SHORT";
+                break;
+            case RPC_FC_USHORT:
+                param_type = RPC_FC_USHORT;
+                param_type_string = "FC_USHORT";
+                break;
+            case RPC_FC_LONG:
+                param_type = RPC_FC_LONG;
+                param_type_string = "FC_LONG";
+                break;
+            case RPC_FC_ULONG:
+                param_type = RPC_FC_ULONG;
+                param_type_string = "FC_ULONG";
+                break;
+            default:
+                error("write_conf_or_var_desc: conformance variable type not supported 0x%x\n",
+                    conformance_type->type);
+            }
+
+            print_file(file, 2, "0x%x, /* Corr desc: parameter, %s */\n",
+                    RPC_FC_TOP_LEVEL_CONFORMANCE | param_type,
+                    param_type_string);
+            print_file(file, 2, "0x0, /* no operators */\n");
+            print_file(file, 2, "0x%x, /* x86 stack size / offset = %d */\n", stack_offset, stack_offset);
+        }
+        else
+            error("write_conf_or_var_desc: not supported for non-functions yet\n");
+    }
+    else
+        error("write_conf_or_var_desc: expression type %d\n", expr->type);
+    return 4;
+}
+
 static size_t type_memsize(const type_t *t, int ptr_level, const expr_t *array);
 
 static size_t fields_memsize(const var_t *v)
@@ -322,9 +404,11 @@ static size_t write_string_tfs(FILE *fil
             print_file(file, 2, "0x%x, /* FC_C_CSTRING */\n", RPC_FC_C_CSTRING);
         else
             print_file(file, 2, "0x%x, /* FC_C_WSTRING */\n", RPC_FC_C_WSTRING);
-        print_file(file, 2, "0x%x, /* FC_PAD */\n", RPC_FC_PAD);
+        print_file(file, 2, "0x%x, /* FC_STRING_SIZED */\n", RPC_FC_STRING_SIZED);
         typestring_size = 2;
 
+        typestring_size += write_conf_or_var_desc(file, current_func, size_is);
+
         return typestring_size;
     }
     else
@@ -335,11 +419,9 @@ static size_t write_string_tfs(FILE *fil
             print_file(file, 2, "0x%x, /* FC_C_CSTRING */\n", RPC_FC_C_CSTRING);
         else
             print_file(file, 2, "0x%x, /* FC_C_WSTRING */\n", RPC_FC_C_WSTRING);
-        print_file(file, 2, "0x%x, /* FC_STRING_SIZED */\n", RPC_FC_STRING_SIZED);
+        print_file(file, 2, "0x%x, /* FC_PAD */\n", RPC_FC_PAD);
         typestring_size = 2;
 
-        /* FIXME: write out conformance descriptor */
-
         return typestring_size;
     }
 }
@@ -428,7 +510,8 @@ static size_t write_array_tfs(FILE *file
             print_file(file, 2, "NdrFcShort(0x%x), /* %d */\n", element_size, element_size);
             typestring_size += 2;
 
-            /* FIXME: write out variance descriptor */
+            typestring_size += write_conf_or_var_desc(file, current_func, length_is);
+
             /* FIXME: write out pointer descriptor if necessary */
 
             print_file(file, 2, "0x0, /* FIXME: write out conversion data */\n");
@@ -450,7 +533,8 @@ static size_t write_array_tfs(FILE *file
             print_file(file, 2, "NdrFcShort(0x%x), /* %d */\n", element_size, element_size);
             typestring_size = 4;
 
-            /* FIXME: write out conformance descriptor */
+            typestring_size += write_conf_or_var_desc(file, current_func, size_is);
+
             /* FIXME: write out pointer descriptor if necessary */
 
             print_file(file, 2, "0x0, /* FIXME: write out conversion data */\n");
@@ -472,8 +556,9 @@ static size_t write_array_tfs(FILE *file
             print_file(file, 2, "NdrFcShort(0x%x), /* %d */\n", element_size, element_size);
             typestring_size = 4;
 
-            /* FIXME: write out conformance descriptor */
-            /* FIXME: write out variance descriptor */
+            typestring_size += write_conf_or_var_desc(file, current_func, size_is);
+            typestring_size += write_conf_or_var_desc(file, current_func, length_is);
+
             /* FIXME: write out pointer descriptor if necessary */
 
             print_file(file, 2, "0x0, /* FIXME: write out conversion data */\n");
@@ -570,6 +655,7 @@ void write_typeformatstring(FILE *file, 
         while (NEXT_LINK(func)) func = NEXT_LINK(func);
         for (; func; func = PREV_LINK(func))
         {
+            current_func = func;
             if (func->args)
             {
                 var = func->args;




More information about the wine-cvs mailing list