Alexandre Julliard : widl: Add some support for unencapsulated unions that need a conformance descriptor .

Alexandre Julliard julliard at winehq.org
Tue Jul 1 08:27:32 CDT 2008


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Jul  1 12:25:44 2008 +0200

widl: Add some support for unencapsulated unions that need a conformance descriptor.

---

 dlls/rpcrt4/tests/server.c   |   19 +++++++++++++++++++
 dlls/rpcrt4/tests/server.idl |    7 +++++++
 tools/widl/typegen.c         |   28 ++++++++++++++++++++++++++++
 3 files changed, 54 insertions(+), 0 deletions(-)

diff --git a/dlls/rpcrt4/tests/server.c b/dlls/rpcrt4/tests/server.c
index 69b9ba4..0bf84d5 100644
--- a/dlls/rpcrt4/tests/server.c
+++ b/dlls/rpcrt4/tests/server.c
@@ -333,6 +333,18 @@ s_square_encu(encu_t *eu)
   }
 }
 
+double
+s_square_unencu(int t, unencu_t *eu)
+{
+  switch (t)
+  {
+  case ENCU_I: return eu->i * eu->i;
+  case ENCU_F: return eu->f * eu->f;
+  default:
+    return 0.0;
+  }
+}
+
 void
 s_check_se2(se_t *s)
 {
@@ -844,6 +856,7 @@ union_tests(void)
 {
   encue_t eue;
   encu_t eu;
+  unencu_t uneu;
   sun_t su;
   int i;
 
@@ -872,6 +885,12 @@ union_tests(void)
   eu.tagged_union.f = 3.0;
   ok(square_encu(&eu) == 9.0, "RPC square_encu\n");
 
+  uneu.i = 4;
+  ok(square_unencu(ENCU_I, &uneu) == 16.0, "RPC square_unencu\n");
+
+  uneu.f = 5.0;
+  ok(square_unencu(ENCU_F, &uneu) == 25.0, "RPC square_unencu\n");
+
   eue.t = E1;
   eue.tagged_union.i1 = 8;
   ok(square_encue(&eue) == 64.0, "RPC square_encue\n");
diff --git a/dlls/rpcrt4/tests/server.idl b/dlls/rpcrt4/tests/server.idl
index 378b205..26d3373 100644
--- a/dlls/rpcrt4/tests/server.idl
+++ b/dlls/rpcrt4/tests/server.idl
@@ -195,6 +195,12 @@ cpp_quote("#endif")
   case ENCU_F: float f;
   } encu_t;
 
+  typedef [switch_type(int)] union unencu
+  {
+    [case (ENCU_I)] int i;
+    [case (ENCU_F)] float f;
+  } unencu_t;
+
   typedef enum
   {
     E1 = 23,
@@ -215,6 +221,7 @@ cpp_quote("#endif")
   } se_t;
 
   double square_encu(encu_t *eu);
+  double square_unencu(int t, [switch_is(t)] unencu_t *eu);
   int sum_parr(int *a[3]);
   int sum_pcarr([size_is(n)] int *a[], int n);
   int enum_ord(e_t e);
diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c
index f89f13f..f7a189a 100644
--- a/tools/widl/typegen.c
+++ b/tools/widl/typegen.c
@@ -2032,6 +2032,34 @@ static size_t write_union_tfs(FILE *file, type_t *type, unsigned int *tfsoff)
             error("union switch type must be an integer, char, or enum\n");
         }
     }
+    else if (is_attr(type->attrs, ATTR_SWITCHTYPE))
+    {
+        static const expr_t dummy_expr;  /* FIXME */
+        const type_t *st = get_attrp(type->attrs, ATTR_SWITCHTYPE);
+
+        switch (st->type)
+        {
+        case RPC_FC_CHAR:
+        case RPC_FC_SMALL:
+        case RPC_FC_USMALL:
+        case RPC_FC_SHORT:
+        case RPC_FC_USHORT:
+        case RPC_FC_LONG:
+        case RPC_FC_ULONG:
+        case RPC_FC_ENUM16:
+        case RPC_FC_ENUM32:
+            print_file(file, 2, "0x%x,\t/* %s */\n", type->type, string_of_type(type->type));
+            print_file(file, 2, "0x%x,\t/* Switch type= %s */\n",
+                       st->type, string_of_type(st->type));
+            *tfsoff += 2;
+            break;
+        default:
+            error("union switch type must be an integer, char, or enum\n");
+        }
+
+        *tfsoff += write_conf_or_var_desc(file, NULL, *tfsoff, st, &dummy_expr );
+    }
+
     print_file(file, 2, "NdrFcShort(0x%x),\t/* %d */\n", size, size);
     print_file(file, 2, "NdrFcShort(0x%x),\t/* %d */\n", nbranch, nbranch);
     *tfsoff += 4;




More information about the wine-cvs mailing list