2009/1/10 Michael Karcher <wine(a)mkarcher.dialup.fu-berlin.de>:
This matches midl behaviour. In
void test1([out,size_is(x)] char str[], [in] int x); void test2([size_is(x), out] char* str, [in] int x);
the parameter to test1 is not NULL-checked, but the one to test2 is. --- tools/widl/client.c | 2 +- tools/widl/proxy.c | 15 ++++++++++----- tools/widl/widltypes.h | 1 + 3 files changed, 12 insertions(+), 6 deletions(-)
diff --git a/tools/widl/client.c b/tools/widl/client.c index a23e298..0b10eb6 100644 --- a/tools/widl/client.c +++ b/tools/widl/client.c @@ -59,7 +59,7 @@ static void check_pointers(const var_t *func)
LIST_FOR_EACH_ENTRY( var, type_get_function_args(func->type), const var_t, entry ) { - if (is_var_ptr(var) && cant_be_null(var)) + if (is_var_declptr(var) && cant_be_null(var)) { print_client("if (!%s)\n", var->name); print_client("{\n"); diff --git a/tools/widl/proxy.c b/tools/widl/proxy.c index bb16b72..ce07ddc 100644 --- a/tools/widl/proxy.c +++ b/tools/widl/proxy.c @@ -150,6 +150,11 @@ int is_var_ptr(const var_t *v) return is_ptr(v->type); }
+int is_var_declptr(const var_t *v) +{ + return is_declptr(v->type); +} +
Again, this function doesn't seem to improve readability of the code. I would just move the checking of the type of v into cant_be_null.
int cant_be_null(const var_t *v) { /* Search backwards for the most recent pointer attribute. */ @@ -164,10 +169,10 @@ int cant_be_null(const var_t *v) if (is_user_type(type)) return 0;
- if (!attrs && is_ptr(type)) + if (!attrs && is_declptr(type)) { attrs = type->attrs; - type = type_pointer_get_ref(type); + type = get_deref_type(type); }
while (attrs) @@ -180,7 +185,7 @@ int cant_be_null(const var_t *v) if (t == RPC_FC_RP) return 1;
- if (is_ptr(type)) + if (is_declptr(type)) { if (type->type == RPC_FC_FP || type->type == RPC_FC_OP || @@ -188,7 +193,7 @@ int cant_be_null(const var_t *v) return 0;
attrs = type->attrs; - type = type_pointer_get_ref(type); + type = get_deref_type(type); } else attrs = NULL;
It would be simpler if you just did: if (is_ptr(type)) fc = type->type; else { <loop looking for pointer type> } return fc == RPC_FC_RP; Note: there appears to be a bug in the current code where it walks pointers looking for the pointer attribute, instead of walking just aliases, so that should probably be fixed too. -- Rob Shearman