From 2d7b1f18b16759a820589c6cf21d64ee19a63da5 Mon Sep 17 00:00:00 2001 From: Dan Hipschman Date: Thu, 21 Feb 2008 15:46:51 -0800 Subject: [PATCH] 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 43c3ec2cd11..e06e57a4ce0 100644 --- a/dlls/rpcrt4/tests/server.c +++ b/dlls/rpcrt4/tests/server.c @@ -92,6 +92,12 @@ s_str_length(const char *s) return strlen(s); } +int +s_str_t_length(str_t s) +{ + return strlen(s); +} + int s_cstr_length(const char *s, int n) { @@ -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 ec517572dc3..7736e1441a7 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 41784a0b152..656d4b2597b 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 f3af93571b6..ae23f94df1d 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