widl: Add new type_is_alias and type_get_real_type helper functions.
Use type_is_alias to replace cumbersome "type->kind == TKIND_ALIAS" expressions. Use type_get_real_type to simplify some code.
This commit is contained in:
parent
200ec53835
commit
cb8d3322be
|
@ -62,7 +62,7 @@ int is_ptrchain_attr(const var_t *var, enum attr_type t)
|
||||||
{
|
{
|
||||||
if (is_attr(type->attrs, t))
|
if (is_attr(type->attrs, t))
|
||||||
return 1;
|
return 1;
|
||||||
else if (type->kind == TKIND_ALIAS)
|
else if (type_is_alias(type))
|
||||||
type = type->orig;
|
type = type->orig;
|
||||||
else if (is_ptr(type))
|
else if (is_ptr(type))
|
||||||
type = type->ref;
|
type = type->ref;
|
||||||
|
@ -78,7 +78,7 @@ int is_aliaschain_attr(const type_t *type, enum attr_type attr)
|
||||||
{
|
{
|
||||||
if (is_attr(t->attrs, attr))
|
if (is_attr(t->attrs, attr))
|
||||||
return 1;
|
return 1;
|
||||||
else if (t->kind == TKIND_ALIAS)
|
else if (type_is_alias(t))
|
||||||
t = t->orig;
|
t = t->orig;
|
||||||
else return 0;
|
else return 0;
|
||||||
}
|
}
|
||||||
|
@ -185,8 +185,8 @@ static void write_enums(FILE *h, var_list_t *enums)
|
||||||
|
|
||||||
int needs_space_after(type_t *t)
|
int needs_space_after(type_t *t)
|
||||||
{
|
{
|
||||||
return (t->kind == TKIND_ALIAS
|
return (type_is_alias(t) ||
|
||||||
|| (!is_ptr(t) && (!is_conformant_array(t) || t->declarray)));
|
(!is_ptr(t) && (!is_conformant_array(t) || t->declarray)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void write_type_left(FILE *h, type_t *t, int declonly)
|
void write_type_left(FILE *h, type_t *t, int declonly)
|
||||||
|
@ -194,10 +194,10 @@ void write_type_left(FILE *h, type_t *t, int declonly)
|
||||||
if (!h) return;
|
if (!h) return;
|
||||||
|
|
||||||
if (is_attr(t->attrs, ATTR_CONST) &&
|
if (is_attr(t->attrs, ATTR_CONST) &&
|
||||||
(t->kind == TKIND_ALIAS || t->declarray || !is_ptr(t)))
|
(type_is_alias(t) || t->declarray || !is_ptr(t)))
|
||||||
fprintf(h, "const ");
|
fprintf(h, "const ");
|
||||||
|
|
||||||
if (t->kind == TKIND_ALIAS) fprintf(h, "%s", t->name);
|
if (type_is_alias(t)) fprintf(h, "%s", t->name);
|
||||||
else if (t->declarray) write_type_left(h, t->ref, declonly);
|
else if (t->declarray) write_type_left(h, t->ref, declonly);
|
||||||
else {
|
else {
|
||||||
if (t->sign > 0) fprintf(h, "signed ");
|
if (t->sign > 0) fprintf(h, "signed ");
|
||||||
|
@ -376,7 +376,7 @@ void check_for_additional_prototype_types(const var_list_t *list)
|
||||||
LIST_FOR_EACH_ENTRY( v, list, const var_t, entry )
|
LIST_FOR_EACH_ENTRY( v, list, const var_t, entry )
|
||||||
{
|
{
|
||||||
type_t *type;
|
type_t *type;
|
||||||
for (type = v->type; type; type = type->kind == TKIND_ALIAS ? type->orig : type->ref) {
|
for (type = v->type; type; type = type_is_alias(type) ? type->orig : type->ref) {
|
||||||
const char *name = type->name;
|
const char *name = type->name;
|
||||||
if (type->user_types_registered) continue;
|
if (type->user_types_registered) continue;
|
||||||
type->user_types_registered = 1;
|
type->user_types_registered = 1;
|
||||||
|
|
|
@ -1451,7 +1451,7 @@ static void set_type(var_t *v, decl_spec_t *decl_spec, const declarator_t *decl,
|
||||||
for (ptr = *pt; ptr && !ptr_attr; )
|
for (ptr = *pt; ptr && !ptr_attr; )
|
||||||
{
|
{
|
||||||
ptr_attr = get_attrv(ptr->attrs, ATTR_POINTERTYPE);
|
ptr_attr = get_attrv(ptr->attrs, ATTR_POINTERTYPE);
|
||||||
if (!ptr_attr && ptr->kind == TKIND_ALIAS)
|
if (!ptr_attr && type_is_alias(ptr))
|
||||||
ptr = ptr->orig;
|
ptr = ptr->orig;
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
|
@ -1786,7 +1786,7 @@ static void add_incomplete(type_t *t)
|
||||||
|
|
||||||
static void fix_type(type_t *t)
|
static void fix_type(type_t *t)
|
||||||
{
|
{
|
||||||
if (t->kind == TKIND_ALIAS && is_incomplete(t)) {
|
if (type_is_alias(t) && is_incomplete(t)) {
|
||||||
type_t *ot = t->orig;
|
type_t *ot = t->orig;
|
||||||
fix_type(ot);
|
fix_type(ot);
|
||||||
if (is_struct(ot->type) || is_union(ot->type))
|
if (is_struct(ot->type) || is_union(ot->type))
|
||||||
|
@ -2284,19 +2284,13 @@ static int is_allowed_conf_type(const type_t *type)
|
||||||
static int is_ptr_guid_type(const type_t *type)
|
static int is_ptr_guid_type(const type_t *type)
|
||||||
{
|
{
|
||||||
unsigned int align = 0;
|
unsigned int align = 0;
|
||||||
for (;;)
|
|
||||||
{
|
/* first, make sure it is a pointer to something */
|
||||||
if (type->kind == TKIND_ALIAS)
|
if (!is_ptr(type)) return FALSE;
|
||||||
type = type->orig;
|
|
||||||
else if (is_ptr(type))
|
/* second, make sure it is a pointer to something of size sizeof(GUID),
|
||||||
{
|
* i.e. 16 bytes */
|
||||||
type = type->ref;
|
return (type_memsize(type->ref, &align) == 16);
|
||||||
break;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
return (type_memsize(type, &align) == 16);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void check_conformance_expr_list(const char *attr_name, const var_t *arg, const type_t *container_type, expr_list_t *expr_list)
|
static void check_conformance_expr_list(const char *attr_name, const var_t *arg, const type_t *container_type, expr_list_t *expr_list)
|
||||||
|
@ -2394,7 +2388,7 @@ static void check_field_common(const type_t *container_type,
|
||||||
is_context_handle = 1;
|
is_context_handle = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (type->kind == TKIND_ALIAS)
|
if (type_is_alias(type))
|
||||||
type = type->orig;
|
type = type->orig;
|
||||||
else if (is_ptr(type) || is_array(type))
|
else if (is_ptr(type) || is_array(type))
|
||||||
type = type->ref;
|
type = type->ref;
|
||||||
|
@ -2415,9 +2409,7 @@ static void check_remoting_fields(const var_t *var, type_t *type)
|
||||||
const var_t *field;
|
const var_t *field;
|
||||||
const var_list_t *fields = NULL;
|
const var_list_t *fields = NULL;
|
||||||
|
|
||||||
/* find the real type */
|
type = type_get_real_type(type);
|
||||||
while (type->kind == TKIND_ALIAS)
|
|
||||||
type = type->orig;
|
|
||||||
|
|
||||||
if (type->checked)
|
if (type->checked)
|
||||||
return;
|
return;
|
||||||
|
@ -2456,7 +2448,7 @@ static void check_remoting_args(const var_t *func)
|
||||||
break;
|
break;
|
||||||
if (is_attr(type->attrs, ATTR_CONTEXTHANDLE))
|
if (is_attr(type->attrs, ATTR_CONTEXTHANDLE))
|
||||||
break;
|
break;
|
||||||
if (type->kind == TKIND_ALIAS)
|
if (type_is_alias(type))
|
||||||
type = type->orig;
|
type = type->orig;
|
||||||
else if (is_ptr(type))
|
else if (is_ptr(type))
|
||||||
{
|
{
|
||||||
|
|
|
@ -467,7 +467,7 @@ static type_t *get_user_type(const type_t *t, const char **pname)
|
||||||
return ut;
|
return ut;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (t->kind == TKIND_ALIAS)
|
if (type_is_alias(t))
|
||||||
t = t->orig;
|
t = t->orig;
|
||||||
else
|
else
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1005,7 +1005,7 @@ size_t type_memsize(const type_t *t, unsigned int *align)
|
||||||
{
|
{
|
||||||
size_t size = 0;
|
size_t size = 0;
|
||||||
|
|
||||||
if (t->kind == TKIND_ALIAS)
|
if (type_is_alias(t))
|
||||||
size = type_memsize(t->orig, align);
|
size = type_memsize(t->orig, align);
|
||||||
else if (t->declarray && is_conformant_array(t))
|
else if (t->declarray && is_conformant_array(t))
|
||||||
{
|
{
|
||||||
|
|
|
@ -45,6 +45,7 @@
|
||||||
#include "typelib.h"
|
#include "typelib.h"
|
||||||
#include "widltypes.h"
|
#include "widltypes.h"
|
||||||
#include "typelib_struct.h"
|
#include "typelib_struct.h"
|
||||||
|
#include "typetree.h"
|
||||||
|
|
||||||
static typelib_t *typelib;
|
static typelib_t *typelib;
|
||||||
|
|
||||||
|
@ -173,7 +174,7 @@ unsigned short get_type_vt(type_t *t)
|
||||||
if (vt) return vt;
|
if (vt) return vt;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (t->kind == TKIND_ALIAS && is_attr(t->attrs, ATTR_PUBLIC))
|
if (type_is_alias(t) && is_attr(t->attrs, ATTR_PUBLIC))
|
||||||
return VT_USERDEFINED;
|
return VT_USERDEFINED;
|
||||||
|
|
||||||
switch (t->type) {
|
switch (t->type) {
|
||||||
|
|
|
@ -135,4 +135,17 @@ static inline expr_t *type_array_get_variance(const type_t *type)
|
||||||
return type->details.array.length_is;
|
return type->details.array.length_is;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline type_t *type_get_real_type(const type_t *type)
|
||||||
|
{
|
||||||
|
if (type->kind == TKIND_ALIAS)
|
||||||
|
return type_get_real_type(type->orig);
|
||||||
|
else
|
||||||
|
return (type_t *)type;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int type_is_alias(const type_t *type)
|
||||||
|
{
|
||||||
|
return (type->kind == TKIND_ALIAS);
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* WIDL_TYPE_TREE_H */
|
#endif /* WIDL_TYPE_TREE_H */
|
||||||
|
|
|
@ -979,7 +979,7 @@ static int encode_type(
|
||||||
int typeinfo_offset;
|
int typeinfo_offset;
|
||||||
|
|
||||||
/* typedef'd types without public attribute aren't included in the typelib */
|
/* typedef'd types without public attribute aren't included in the typelib */
|
||||||
while (type->typelib_idx < 0 && type->kind == TKIND_ALIAS && !is_attr(type->attrs, ATTR_PUBLIC))
|
while (type->typelib_idx < 0 && type_is_alias(type) && !is_attr(type->attrs, ATTR_PUBLIC))
|
||||||
type = type->orig;
|
type = type->orig;
|
||||||
|
|
||||||
chat("encode_type: VT_USERDEFINED - type %p name = %s type->type %d idx %d\n", type,
|
chat("encode_type: VT_USERDEFINED - type %p name = %s type->type %d idx %d\n", type,
|
||||||
|
|
Loading…
Reference in New Issue