Dan Hipschman : widl: Handle pointers fields that point to structures.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon May 14 10:52:31 CDT 2007
Module: wine
Branch: master
Commit: d9c120490fbea62f5696ed99c7f4d8390f9dfef4
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d9c120490fbea62f5696ed99c7f4d8390f9dfef4
Author: Dan Hipschman <dsh at linux.ucla.edu>
Date: Fri May 11 17:27:40 2007 -0700
widl: Handle pointers fields that point to structures.
---
dlls/rpcrt4/tests/server.c | 9 +++++++++
dlls/rpcrt4/tests/server.idl | 7 +++++++
tools/widl/typegen.c | 9 +++++++--
3 files changed, 23 insertions(+), 2 deletions(-)
diff --git a/dlls/rpcrt4/tests/server.c b/dlls/rpcrt4/tests/server.c
index 0086b97..8fd107b 100644
--- a/dlls/rpcrt4/tests/server.c
+++ b/dlls/rpcrt4/tests/server.c
@@ -126,6 +126,12 @@ s_ptypes_sum(ptypes_t *pt)
return *pt->pc + *pt->ps + *pt->pl + *pt->pf + *pt->pd;
}
+int
+s_dot_pvectors(pvectors_t *p)
+{
+ return p->pu->x * (*p->pv)->x + p->pu->y * (*p->pv)->y + p->pu->z * (*p->pv)->z;
+}
+
void
s_stop(void)
{
@@ -167,6 +173,8 @@ basic_tests(void)
static char string[] = "I am a string";
static int f[5] = {1, 3, 0, -2, -4};
static vector_t a = {1, 3, 7};
+ static vector_t vec1 = {4, -2, 1}, vec2 = {-5, 2, 3}, *pvec2 = &vec2;
+ static pvectors_t pvecs = {&vec1, &pvec2};
pints_t pints;
ptypes_t ptypes;
int i1, i2, i3, *pi2, *pi3, **ppi3;
@@ -231,6 +239,7 @@ basic_tests(void)
ptypes.pd = &u;
ok(ptypes_sum(&ptypes) == 33.0, "RPC ptypes_sum\n");
+ ok(dot_pvectors(&pvecs) == -21, "RPC dot_pvectors\n");
ok(sum_fixed_array(f) == -2, "RPC sum_fixed_array\n");
}
diff --git a/dlls/rpcrt4/tests/server.idl b/dlls/rpcrt4/tests/server.idl
index 4830e8c..e087f1e 100644
--- a/dlls/rpcrt4/tests/server.idl
+++ b/dlls/rpcrt4/tests/server.idl
@@ -47,6 +47,12 @@ interface IServer
double *pd;
} ptypes_t;
+ typedef struct
+ {
+ vector_t *pu;
+ vector_t **pv;
+ } pvectors_t;
+
int int_return(void);
int square(int x);
int sum(int x, int y);
@@ -60,5 +66,6 @@ interface IServer
int sum_fixed_array(int a[5]);
int pints_sum(pints_t *pints);
double ptypes_sum(ptypes_t *ptypes);
+ int dot_pvectors(pvectors_t *pvectors);
void stop(void);
}
diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c
index 3bd133b..d2597b3 100644
--- a/tools/widl/typegen.c
+++ b/tools/widl/typegen.c
@@ -675,8 +675,10 @@ static size_t write_nonsimple_pointer(FILE *file, const type_t *type, size_t off
{
short absoff = type->ref->typestring_offset;
short reloff = absoff - (offset + 2);
- print_file(file, 2, "0x%02x, 0x10,\t/* %s */\n",
- type->type, string_of_type(type->type));
+ int ptr_attr = is_ptr(type->ref) ? 0x10 : 0x0;
+
+ print_file(file, 2, "0x%02x, 0x%x,\t/* %s */\n",
+ type->type, ptr_attr, string_of_type(type->type));
print_file(file, 2, "NdrFcShort(0x%hx),\t/* Offset= %hd (%hd) */\n",
reloff, reloff, absoff);
return 4;
@@ -1207,6 +1209,7 @@ static size_t write_struct_tfs(FILE *file, type_t *type,
write_pointers(file, NULL, type, NULL, 0, typestring_offset);
start_offset = *typestring_offset;
+ type->typestring_offset = start_offset;
if (type->type == RPC_FC_STRUCT)
WRITE_FCTYPE(file, FC_STRUCT, *typestring_offset);
else
@@ -1249,6 +1252,7 @@ static size_t write_struct_tfs(FILE *file, type_t *type,
write_pointers(file, NULL, type, NULL, 0, typestring_offset);
start_offset = *typestring_offset;
+ type->typestring_offset = start_offset;
if (type->type == RPC_FC_CSTRUCT)
WRITE_FCTYPE(file, FC_CSTRUCT, *typestring_offset);
else
@@ -1300,6 +1304,7 @@ static size_t write_struct_tfs(FILE *file, type_t *type,
has_pointers = write_pointers(file, NULL, type, NULL, 0, typestring_offset);
start_offset = *typestring_offset;
+ type->typestring_offset = start_offset;
WRITE_FCTYPE(file, FC_CVSTRUCT, *typestring_offset);
/* alignment */
print_file(file, 2, "0x%02x,\n", align - 1);
More information about the wine-cvs
mailing list