This fixes type format string generation for the following IDL:
typedef int *intp; [pointer_default(ref)] interface IRef { void a(intp *a); } [pointer_default(unique)] interface IUnique { void b(intp *a); }
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- tools/widl/expr.c | 6 +++--- tools/widl/parser.h | 6 ------ tools/widl/parser.y | 39 +++++++++++++++------------------------ tools/widl/typegen.c | 9 +++++---- tools/widl/typetree.c | 7 ++----- tools/widl/typetree.h | 19 ++----------------- tools/widl/widltypes.h | 2 -- 7 files changed, 27 insertions(+), 61 deletions(-)
diff --git a/tools/widl/expr.c b/tools/widl/expr.c index 0b345f3f6a..d1ee599a39 100644 --- a/tools/widl/expr.c +++ b/tools/widl/expr.c @@ -521,11 +521,11 @@ static struct expression_type resolve_expression(const struct expr_loc *expr_loc break; case EXPR_STRLIT: result.is_temporary = TRUE; - result.type = type_new_pointer(FC_UP, type_new_int(TYPE_BASIC_CHAR, 0)); + result.type = type_new_pointer(type_new_int(TYPE_BASIC_CHAR, 0)); break; case EXPR_WSTRLIT: result.is_temporary = TRUE; - result.type = type_new_pointer(FC_UP, type_new_int(TYPE_BASIC_WCHAR, 0)); + result.type = type_new_pointer(type_new_int(TYPE_BASIC_WCHAR, 0)); break; case EXPR_CHARCONST: result.is_temporary = TRUE; @@ -575,7 +575,7 @@ static struct expression_type resolve_expression(const struct expr_loc *expr_loc expr_loc->attr ? expr_loc->attr : ""); result.is_variable = FALSE; result.is_temporary = TRUE; - result.type = type_new_pointer(FC_UP, result.type); + result.type = type_new_pointer(result.type); break; case EXPR_PPTR: result = resolve_expression(expr_loc, cont_type, e->ref); diff --git a/tools/widl/parser.h b/tools/widl/parser.h index f48cacc005..a67b160d48 100644 --- a/tools/widl/parser.h +++ b/tools/widl/parser.h @@ -21,12 +21,6 @@ #ifndef __WIDL_PARSER_H #define __WIDL_PARSER_H
-typedef struct -{ - type_t *interface; - unsigned char old_pointer_default; -} interface_info_t; - int parser_parse(void);
extern FILE *parser_in; diff --git a/tools/widl/parser.y b/tools/widl/parser.y index f6d0886abe..afbe2b1799 100644 --- a/tools/widl/parser.y +++ b/tools/widl/parser.y @@ -38,8 +38,6 @@ #include "expr.h" #include "typetree.h"
-static unsigned char pointer_default = FC_UP; - typedef struct list typelist_t; struct typenode { type_t *type; @@ -154,7 +152,6 @@ static typelib_t *current_typelib; UUID *uuid; unsigned int num; double dbl; - interface_info_t ifinfo; typelib_t *typelib; struct _import_t *import; struct _decl_spec_t *declspec; @@ -268,7 +265,7 @@ static typelib_t *current_typelib; %type <str_list> str_list %type <expr> m_expr expr expr_const expr_int_const array m_bitfield %type <expr_list> m_exprs /* exprs expr_list */ expr_list_int_const -%type <ifinfo> interfacehdr +%type <type> interfacehdr %type <stgclass> storage_cls_spec %type <type_qualifier> type_qualifier m_type_qual_list %type <function_specifier> function_specifier @@ -896,10 +893,7 @@ interface: tINTERFACE aIDENTIFIER { $$ = get_type(TYPE_INTERFACE, $2, current_n | tINTERFACE aKNOWNTYPE { $$ = get_type(TYPE_INTERFACE, $2, current_namespace, 0); } ;
-interfacehdr: attributes interface { $$.interface = $2; - $$.old_pointer_default = pointer_default; - if (is_attr($1, ATTR_POINTERDEFAULT)) - pointer_default = get_attrv($1, ATTR_POINTERDEFAULT); +interfacehdr: attributes interface { $$ = $2; check_def($2); $2->attrs = check_iface_attrs($2->name, $1); $2->defined = TRUE; @@ -907,20 +901,18 @@ interfacehdr: attributes interface { $$.interface = $2; ;
interfacedef: interfacehdr inherit - '{' int_statements '}' semicolon_opt { $$ = $1.interface; + '{' int_statements '}' semicolon_opt { $$ = $1; if($$ == $2) error_loc("Interface can't inherit from itself\n"); type_interface_define($$, $2, $4); check_async_uuid($$); - pointer_default = $1.old_pointer_default; } /* MIDL is able to import the definition of a base class from inside the * definition of a derived class, I'll try to support it with this rule */ | interfacehdr ':' aIDENTIFIER '{' import int_statements '}' - semicolon_opt { $$ = $1.interface; + semicolon_opt { $$ = $1; type_interface_define($$, find_type_or_error2($3, 0), $6); - pointer_default = $1.old_pointer_default; } | dispinterfacedef semicolon_opt { $$ = $1; } ; @@ -980,7 +972,7 @@ decl_spec_no_type:
declarator: '*' m_type_qual_list declarator %prec PPTR - { $$ = $3; append_chain_type($$, type_new_pointer(pointer_default, NULL), $2); } + { $$ = $3; append_chain_type($$, type_new_pointer(NULL), $2); } | callconv declarator { $$ = $2; append_chain_callconv($$->type, $1); } | direct_declarator ; @@ -995,7 +987,7 @@ direct_declarator: /* abstract declarator */ abstract_declarator: '*' m_type_qual_list m_abstract_declarator %prec PPTR - { $$ = $3; append_chain_type($$, type_new_pointer(pointer_default, NULL), $2); } + { $$ = $3; append_chain_type($$, type_new_pointer(NULL), $2); } | callconv m_abstract_declarator { $$ = $2; append_chain_callconv($$->type, $1); } | abstract_direct_declarator ; @@ -1003,7 +995,7 @@ abstract_declarator: /* abstract declarator without accepting direct declarator */ abstract_declarator_no_direct: '*' m_type_qual_list m_any_declarator %prec PPTR - { $$ = $3; append_chain_type($$, type_new_pointer(pointer_default, NULL), $2); } + { $$ = $3; append_chain_type($$, type_new_pointer(NULL), $2); } | callconv m_any_declarator { $$ = $2; append_chain_callconv($$->type, $1); } ;
@@ -1030,7 +1022,7 @@ abstract_direct_declarator: /* abstract or non-abstract declarator */ any_declarator: '*' m_type_qual_list m_any_declarator %prec PPTR - { $$ = $3; append_chain_type($$, type_new_pointer(pointer_default, NULL), $2); } + { $$ = $3; append_chain_type($$, type_new_pointer(NULL), $2); } | callconv m_any_declarator { $$ = $2; append_chain_callconv($$->type, $1); } | any_direct_declarator ; @@ -1038,7 +1030,7 @@ any_declarator: /* abstract or non-abstract declarator without accepting direct declarator */ any_declarator_no_direct: '*' m_type_qual_list m_any_declarator %prec PPTR - { $$ = $3; append_chain_type($$, type_new_pointer(pointer_default, NULL), $2); } + { $$ = $3; append_chain_type($$, type_new_pointer(NULL), $2); } | callconv m_any_declarator { $$ = $2; append_chain_callconv($$->type, $1); } ;
@@ -1378,7 +1370,7 @@ static void append_array(declarator_t *decl, expr_t *expr) /* An array is always a reference pointer unless explicitly marked otherwise * (regardless of what the default pointer attribute is). */ array = type_new_array(NULL, NULL, FALSE, expr->is_const ? expr->cval : 0, - expr->is_const ? NULL : expr, NULL, FC_RP); + expr->is_const ? NULL : expr, NULL);
append_chain_type(decl, array, 0); } @@ -1579,7 +1571,7 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, declarator warning_loc_info(&v->loc_info, "%s: pointer attribute applied to interface " "pointer type has no effect\n", v->name); - if (!ptr_attr && top && type_pointer_get_default_fc(v->declspec.type) != FC_RP) + if (!ptr_attr && top) { /* FIXME: this is a horrible hack to cope with the issue that we * store an offset to the typeformat string in the type object, but @@ -1643,11 +1635,11 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, declarator else *ptype = type_new_array((*ptype)->name, type_array_get_element(*ptype), FALSE, - 0, dim, NULL, FC_RP); + 0, dim, NULL); } else if (is_ptr(*ptype)) *ptype = type_new_array((*ptype)->name, type_pointer_get_ref(*ptype), TRUE, - 0, dim, NULL, pointer_default); + 0, dim, NULL); else error_loc("%s: size_is attribute applied to illegal type\n", v->name); } @@ -1671,8 +1663,7 @@ static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, declarator type_array_get_element(*ptype), type_array_is_decl_as_ptr(*ptype), type_array_get_dim(*ptype), - type_array_get_conformance(*ptype), - dim, type_array_get_ptr_default_fc(*ptype)); + type_array_get_conformance(*ptype), dim); } else error_loc("%s: length_is attribute applied to illegal type\n", v->name); @@ -1798,7 +1789,7 @@ static type_t *make_safearray(type_t *type) { decl_spec_t ds = {.type = type}; ds.type = type_new_alias(&ds, "SAFEARRAY"); - return type_new_array(NULL, &ds, TRUE, 0, NULL, NULL, FC_RP); + return type_new_array(NULL, &ds, TRUE, 0, NULL, NULL); }
static typelib_t *make_library(const char *name, const attr_list_t *attrs) diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c index 2e4045154f..1ad3e63c6a 100644 --- a/tools/widl/typegen.c +++ b/tools/widl/typegen.c @@ -276,10 +276,11 @@ unsigned char get_pointer_fc(const type_t *type, const attr_list_t *attrs, int t
if (toplevel_param) return FC_RP; - else if (is_ptr(type)) - return type_pointer_get_default_fc(type); - else - return type_array_get_ptr_default_fc(type); + + if ((pointer_type = get_attrv(current_iface->attrs, ATTR_POINTERDEFAULT))) + return pointer_type; + + return FC_UP; }
static unsigned char get_pointer_fc_context( const type_t *type, const attr_list_t *attrs, diff --git a/tools/widl/typetree.c b/tools/widl/typetree.c index 37555be478..a066125b16 100644 --- a/tools/widl/typetree.c +++ b/tools/widl/typetree.c @@ -176,10 +176,9 @@ type_t *type_new_function(var_list_t *args) return t; }
-type_t *type_new_pointer(unsigned char pointer_default, type_t *ref) +type_t *type_new_pointer(type_t *ref) { type_t *t = make_type(TYPE_POINTER); - t->details.pointer.def_fc = pointer_default; t->details.pointer.ref.type = ref; return t; } @@ -218,8 +217,7 @@ type_t *type_new_coclass(char *name)
type_t *type_new_array(const char *name, const decl_spec_t *element, int declptr, - unsigned int dim, expr_t *size_is, expr_t *length_is, - unsigned char ptr_default_fc) + unsigned int dim, expr_t *size_is, expr_t *length_is) { type_t *t = make_type(TYPE_ARRAY); if (name) t->name = xstrdup(name); @@ -231,7 +229,6 @@ type_t *type_new_array(const char *name, const decl_spec_t *element, int declptr t->details.array.dim = dim; if (element) t->details.array.elem = *element; - t->details.array.ptr_def_fc = ptr_default_fc; return t; }
diff --git a/tools/widl/typetree.h b/tools/widl/typetree.h index ce5e835dfd..f025f25e59 100644 --- a/tools/widl/typetree.h +++ b/tools/widl/typetree.h @@ -30,12 +30,11 @@ enum name_type { };
type_t *type_new_function(var_list_t *args); -type_t *type_new_pointer(unsigned char pointer_default, type_t *ref); +type_t *type_new_pointer(type_t *ref); type_t *type_new_alias(const decl_spec_t *t, const char *name); type_t *type_new_module(char *name); type_t *type_new_array(const char *name, const decl_spec_t *element, int declptr, - unsigned int dim, expr_t *size_is, expr_t *length_is, - unsigned char ptr_default_fc); + unsigned int dim, expr_t *size_is, expr_t *length_is); type_t *type_new_basic(enum type_basic_type basic_type); type_t *type_new_int(enum type_basic_type basic_type, int sign); type_t *type_new_void(void); @@ -295,13 +294,6 @@ static inline int type_array_is_decl_as_ptr(const type_t *type) return type->details.array.declptr; }
-static inline unsigned char type_array_get_ptr_default_fc(const type_t *type) -{ - type = type_get_real_type(type); - assert(type_get_type(type) == TYPE_ARRAY); - return type->details.array.ptr_def_fc; -} - static inline int type_is_alias(const type_t *type) { return type->type_type == TYPE_ALIAS; @@ -338,13 +330,6 @@ static inline type_t *type_pointer_get_ref_type(const type_t *type) return type_pointer_get_ref(type)->type; }
-static inline unsigned char type_pointer_get_default_fc(const type_t *type) -{ - type = type_get_real_type(type); - assert(type_get_type(type) == TYPE_POINTER); - return type->details.pointer.def_fc; -} - static inline type_t *type_bitfield_get_field(const type_t *type) { type = type_get_real_type(type); diff --git a/tools/widl/widltypes.h b/tools/widl/widltypes.h index c217c5960f..3886360bd4 100644 --- a/tools/widl/widltypes.h +++ b/tools/widl/widltypes.h @@ -374,7 +374,6 @@ struct array_details expr_t *length_is; struct _decl_spec_t elem; unsigned int dim; - unsigned char ptr_def_fc; unsigned char declptr; /* if declared as a pointer */ unsigned short ptr_tfsoff; /* offset of pointer definition for declptr */ }; @@ -393,7 +392,6 @@ struct basic_details struct pointer_details { struct _decl_spec_t ref; - unsigned char def_fc; };
struct bitfield_details