Alexandre Julliard : widl: Don' t allow unions passed by value or floating point returns for interpreted functions .
Alexandre Julliard
julliard at winehq.org
Thu Jun 2 11:22:58 CDT 2011
Module: wine
Branch: master
Commit: 2db27725bfa57f2aa92372df0d29cfeb3c8dc7bf
URL: http://source.winehq.org/git/wine.git/?a=commit;h=2db27725bfa57f2aa92372df0d29cfeb3c8dc7bf
Author: Alexandre Julliard <julliard at winehq.org>
Date: Wed Jun 1 20:46:50 2011 +0200
widl: Don't allow unions passed by value or floating point returns for interpreted functions.
---
tools/widl/typegen.c | 28 +++++++++++++++++++++++++---
1 files changed, 25 insertions(+), 3 deletions(-)
diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c
index 4413713..6dcdf36 100644
--- a/tools/widl/typegen.c
+++ b/tools/widl/typegen.c
@@ -933,11 +933,33 @@ static unsigned int write_procformatstring_type(FILE *file, int indent,
int is_interpreted_func( const type_t *iface, const var_t *func )
{
const char *str;
+ const var_t *var;
+ const var_list_t *args = type_get_function_args( func->type );
const type_t *ret_type = type_function_get_rettype( func->type );
- /* return value must fit in a long_ptr for interpreted functions */
- if (type_get_type( ret_type ) == TYPE_BASIC && type_memsize( ret_type ) > pointer_size)
- return 0;
+ if (type_get_type( ret_type ) == TYPE_BASIC)
+ {
+ switch (type_basic_get_type( ret_type ))
+ {
+ case TYPE_BASIC_INT64:
+ case TYPE_BASIC_HYPER:
+ /* return value must fit in a long_ptr */
+ if (pointer_size < 8) return 0;
+ break;
+ case TYPE_BASIC_FLOAT:
+ case TYPE_BASIC_DOUBLE:
+ /* floating point values can't be returned */
+ return 0;
+ default:
+ break;
+ }
+ }
+ /* unions passed by value are not supported */
+ if (args) LIST_FOR_EACH_ENTRY( var, args, const var_t, entry )
+ if (type_get_type( var->type ) == TYPE_UNION ||
+ type_get_type( var->type ) == TYPE_ENCAPSULATED_UNION)
+ return 0;
+
if ((str = get_attrp( func->attrs, ATTR_OPTIMIZE ))) return !strcmp( str, "i" );
if ((str = get_attrp( iface->attrs, ATTR_OPTIMIZE ))) return !strcmp( str, "i" );
return 0;
More information about the wine-cvs
mailing list