Dan Hipschman : widl: Allow is_string_type to work for typedef'd types.
Alexandre Julliard
julliard at winehq.org
Fri Feb 22 05:49:38 CST 2008
Module: wine
Branch: master
Commit: 2d7b1f18b16759a820589c6cf21d64ee19a63da5
URL: http://source.winehq.org/git/wine.git/?a=commit;h=2d7b1f18b16759a820589c6cf21d64ee19a63da5
Author: Dan Hipschman <dsh at linux.ucla.edu>
Date: Thu Feb 21 15:46:51 2008 -0800
widl: Allow is_string_type to work for typedef'd types.
---
dlls/rpcrt4/tests/server.c | 22 ++++++++++++++++++++++
dlls/rpcrt4/tests/server.idl | 13 +++++++++++++
tools/widl/header.h | 3 ++-
tools/widl/typegen.c | 9 ++++++++-
4 files changed, 45 insertions(+), 2 deletions(-)
diff --git a/dlls/rpcrt4/tests/server.c b/dlls/rpcrt4/tests/server.c
index 43c3ec2..e06e57a 100644
--- a/dlls/rpcrt4/tests/server.c
+++ b/dlls/rpcrt4/tests/server.c
@@ -93,6 +93,12 @@ s_str_length(const char *s)
}
int
+s_str_t_length(str_t s)
+{
+ return strlen(s);
+}
+
+int
s_cstr_length(const char *s, int n)
{
int len = 0;
@@ -497,6 +503,16 @@ s_sum_L1_norms(int n, vector_t *vs)
return sum;
}
+s123_t *
+s_get_s123(void)
+{
+ s123_t *s = MIDL_user_allocate(sizeof *s);
+ s->f1 = 1;
+ s->f2 = 2;
+ s->f3 = 3;
+ return s;
+}
+
str_t
s_get_filename(void)
{
@@ -693,6 +709,7 @@ basic_tests(void)
ok(x == 25, "RPC square_ref\n");
ok(str_length(string) == strlen(string), "RPC str_length\n");
+ ok(str_t_length(string) == strlen(string), "RPC str_length\n");
ok(dot_self(&a) == 59, "RPC dot_self\n");
ok(str_struct_len(&ss) == lstrlenA(string), "RPC str_struct_len\n");
@@ -959,6 +976,7 @@ pointer_tests(void)
name_t name;
void *buffer;
int *pa2;
+ s123_t *s123;
ok(test_list_length(list) == 3, "RPC test_list_length\n");
ok(square_puint(p1) == 121, "RPC square_puint\n");
@@ -1012,6 +1030,10 @@ pointer_tests(void)
pa2 = a;
ok(sum_pcarr2(4, &pa2) == 10, "RPC sum_pcarr2\n");
+
+ s123 = get_s123();
+ ok(s123->f1 == 1 && s123->f2 == 2 && s123->f3 == 3, "RPC get_s123\n");
+ MIDL_user_free(s123);
}
static int
diff --git a/dlls/rpcrt4/tests/server.idl b/dlls/rpcrt4/tests/server.idl
index ec51757..7736e14 100644
--- a/dlls/rpcrt4/tests/server.idl
+++ b/dlls/rpcrt4/tests/server.idl
@@ -82,6 +82,7 @@ cpp_quote("#endif")
void square_out(int x, [out] int *y);
void square_ref([in, out] int *x);
int str_length([string] const char *s);
+ int str_t_length(str_t s);
int cstr_length([string, size_is(n)] const char *s, int n);
int dot_self(vector_t *v);
double square_half(double x, [out] double *y);
@@ -300,6 +301,18 @@ cpp_quote("#endif")
int sum_pcarr2(int n, [size_is(, n)] int **pa);
int sum_L1_norms(int n, [size_is(n)] vector_t *vs);
+ /* Don't use this except in the get_s123 test. */
+ typedef struct
+ {
+ int f1;
+ int f2;
+ int f3;
+ } s123_t;
+
+ /* Make sure WIDL generates a type format string for a previously unseen
+ type as a return value. */
+ s123_t *get_s123(void);
+
void get_5numbers([in] int count, [out, length_is(count)] pints_t pn[5]);
void get_numbers([in] int length, [in] int size, [out, length_is(length), size_is(size)] pints_t pn[]);
str_t get_filename(void);
diff --git a/tools/widl/header.h b/tools/widl/header.h
index 41784a0..656d4b2 100644
--- a/tools/widl/header.h
+++ b/tools/widl/header.h
@@ -78,7 +78,8 @@ static inline int last_array(const type_t *type)
static inline int is_string_type(const attr_list_t *attrs, const type_t *type)
{
- return is_attr(attrs, ATTR_STRING) && (last_ptr(type) || last_array(type));
+ return ((is_attr(attrs, ATTR_STRING) || is_attr(type->attrs, ATTR_STRING))
+ && (last_ptr(type) || last_array(type)));
}
static inline int is_context_handle(const type_t *type)
diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c
index f3af935..ae23f94 100644
--- a/tools/widl/typegen.c
+++ b/tools/widl/typegen.c
@@ -2355,6 +2355,13 @@ static size_t process_tfs(FILE *file, const ifref_list_t *ifaces, type_pred_t pr
{
if (is_local(func->def->attrs)) continue;
+ if (!is_void(func->def->type))
+ update_tfsoff(func->def->type,
+ write_typeformatstring_var(
+ file, 2, NULL, func->def->type,
+ func->def, &typeformat_offset),
+ file);
+
current_func = func;
if (func->args)
LIST_FOR_EACH_ENTRY( var, func->args, const var_t, entry )
@@ -2821,7 +2828,7 @@ static void write_remoting_arg(FILE *file, int indent, const func_t *func,
fprintf(file, ";\n");
}
- if ((phase == PHASE_FREE) || (pointer_type == RPC_FC_UP))
+ if (phase == PHASE_FREE || pass == PASS_RETURN || pointer_type == RPC_FC_UP)
print_phase_function(file, indent, "Pointer", phase, var,
start_offset - (type->size_is ? 4 : 2));
else
More information about the wine-cvs
mailing list