[PATCH v2 4/4] widl: Don't store the default pointer type in the type_t structure.
Zebediah Figura
z.figura12 at gmail.com
Sat Aug 17 20:07:08 CDT 2019
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 at 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
--
2.22.0
More information about the wine-devel
mailing list