Dan Hipschman : widl: Get rid of the typeref_t structure,
simplify code.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue May 1 07:39:30 CDT 2007
Module: wine
Branch: master
Commit: 1ecbb01617909b0ed149448afc5c8c81e75acb3b
URL: http://source.winehq.org/git/wine.git/?a=commit;h=1ecbb01617909b0ed149448afc5c8c81e75acb3b
Author: Dan Hipschman <dsh at linux.ucla.edu>
Date: Mon Apr 30 18:31:27 2007 -0700
widl: Get rid of the typeref_t structure, simplify code.
---
tools/widl/header.c | 4 +-
tools/widl/parser.y | 101 +++++++++++++-----------------------------------
tools/widl/typegen.c | 4 +-
tools/widl/widltypes.h | 8 +---
4 files changed, 32 insertions(+), 85 deletions(-)
diff --git a/tools/widl/header.c b/tools/widl/header.c
index b7fd983..faeadfb 100644
--- a/tools/widl/header.c
+++ b/tools/widl/header.c
@@ -397,13 +397,13 @@ void write_expr(FILE *h, const expr_t *e, int brackets)
break;
case EXPR_CAST:
fprintf(h, "(");
- write_type(h, e->u.tref->ref, NULL, e->u.tref->name);
+ write_type(h, e->u.tref, NULL, e->u.tref->name);
fprintf(h, ")");
write_expr(h, e->ref, 1);
break;
case EXPR_SIZEOF:
fprintf(h, "sizeof(");
- write_type(h, e->u.tref->ref, NULL, e->u.tref->name);
+ write_type(h, e->u.tref, NULL, e->u.tref->name);
fprintf(h, ")");
break;
case EXPR_SHL:
diff --git a/tools/widl/parser.y b/tools/widl/parser.y
index b757c5c..fc916d4 100644
--- a/tools/widl/parser.y
+++ b/tools/widl/parser.y
@@ -72,17 +72,14 @@ static attr_t *make_attrp(enum attr_type type, void *val);
static expr_t *make_expr(enum expr_type type);
static expr_t *make_exprl(enum expr_type type, long val);
static expr_t *make_exprs(enum expr_type type, char *val);
-static expr_t *make_exprt(enum expr_type type, typeref_t *tref, expr_t *expr);
+static expr_t *make_exprt(enum expr_type type, type_t *tref, expr_t *expr);
static expr_t *make_expr1(enum expr_type type, expr_t *expr);
static expr_t *make_expr2(enum expr_type type, expr_t *exp1, expr_t *exp2);
static expr_t *make_expr3(enum expr_type type, expr_t *expr1, expr_t *expr2, expr_t *expr3);
static type_t *make_type(unsigned char type, type_t *ref);
static expr_list_t *append_expr(expr_list_t *list, expr_t *expr);
static array_dims_t *append_array(array_dims_t *list, expr_t *expr);
-static typeref_t *make_tref(char *name, type_t *ref);
-static typeref_t *uniq_tref(typeref_t *ref);
-static type_t *type_ref(typeref_t *ref);
-static void set_type(var_t *v, typeref_t *ref, array_dims_t *arr);
+static void set_type(var_t *v, type_t *type, array_dims_t *arr);
static ifref_list_t *append_ifref(ifref_list_t *list, ifref_t *iface);
static ifref_t *make_ifref(type_t *iface);
static var_list_t *append_var(var_list_t *list, var_t *var);
@@ -90,7 +87,7 @@ static var_t *make_var(char *name);
static func_list_t *append_func(func_list_t *list, func_t *func);
static func_t *make_func(var_t *def, var_list_t *args);
static type_t *make_class(char *name);
-static type_t *make_safearray(typeref_t *tref);
+static type_t *make_safearray(type_t *type);
static type_t *make_builtin(char *name);
static type_t *make_int(int sign);
@@ -128,7 +125,6 @@ static void check_arg(var_t *arg);
expr_list_t *expr_list;
array_dims_t *array_dims;
type_t *type;
- typeref_t *tref;
var_t *var;
var_list_t *var_list;
func_t *func;
@@ -234,9 +230,9 @@ static void check_arg(var_t *arg);
%type <type> module modulehdr moduledef
%type <type> base_type int_std
%type <type> enumdef structdef uniondef
+%type <type> type
%type <ifref> coclass_int
%type <ifref_list> gbl_statements coclass_ints
-%type <tref> type
%type <var> arg field s_field case enum constdef externdef
%type <var_list> m_args no_args args fields cases enums enum_list pident_list dispint_props
%type <var> m_ident t_ident ident p_ident pident
@@ -457,13 +453,13 @@ attribute: { $$ = NULL; }
| tSOURCE { $$ = make_attr(ATTR_SOURCE); }
| tSTRING { $$ = make_attr(ATTR_STRING); }
| tSWITCHIS '(' expr ')' { $$ = make_attrp(ATTR_SWITCHIS, $3); }
- | tSWITCHTYPE '(' type ')' { $$ = make_attrp(ATTR_SWITCHTYPE, type_ref($3)); }
- | tTRANSMITAS '(' type ')' { $$ = make_attrp(ATTR_TRANSMITAS, type_ref($3)); }
+ | tSWITCHTYPE '(' type ')' { $$ = make_attrp(ATTR_SWITCHTYPE, $3); }
+ | tTRANSMITAS '(' type ')' { $$ = make_attrp(ATTR_TRANSMITAS, $3); }
| tUUID '(' aUUID ')' { $$ = make_attrp(ATTR_UUID, $3); }
| tV1ENUM { $$ = make_attr(ATTR_V1ENUM); }
| tVARARG { $$ = make_attr(ATTR_VARARG); }
| tVERSION '(' version ')' { $$ = make_attrv(ATTR_VERSION, $3); }
- | tWIREMARSHAL '(' type ')' { $$ = make_attrp(ATTR_WIREMARSHAL, type_ref($3)); }
+ | tWIREMARSHAL '(' type ')' { $$ = make_attrp(ATTR_WIREMARSHAL, $3); }
| pointer_type { $$ = make_attrv(ATTR_POINTERTYPE, $1); }
;
@@ -823,20 +819,20 @@ structdef: tSTRUCT t_ident '{' fields '}' { $$ = get_typev(RPC_FC_STRUCT, $2, ts
}
;
-type: tVOID { $$ = make_tref(NULL, duptype(find_type("void", 0), 1)); }
- | aKNOWNTYPE { $$ = make_tref($1, find_type($1, 0)); }
- | base_type { $$ = make_tref(NULL, $1); }
- | tCONST type { $$ = uniq_tref($2); $$->ref->is_const = TRUE; }
- | enumdef { $$ = make_tref(NULL, $1); }
- | tENUM aIDENTIFIER { $$ = make_tref(NULL, find_type2($2, tsENUM)); }
- | structdef { $$ = make_tref(NULL, $1); }
- | tSTRUCT aIDENTIFIER { $$ = make_tref(NULL, get_type(RPC_FC_STRUCT, $2, tsSTRUCT)); }
- | uniondef { $$ = make_tref(NULL, $1); }
- | tUNION aIDENTIFIER { $$ = make_tref(NULL, find_type2($2, tsUNION)); }
- | tSAFEARRAY '(' type ')' { $$ = make_tref(NULL, make_safearray($3)); }
+type: tVOID { $$ = duptype(find_type("void", 0), 1); }
+ | aKNOWNTYPE { $$ = find_type($1, 0); }
+ | base_type { $$ = $1; }
+ | tCONST type { $$ = duptype($2, 1); $$->is_const = TRUE; }
+ | enumdef { $$ = $1; }
+ | tENUM aIDENTIFIER { $$ = find_type2($2, tsENUM); }
+ | structdef { $$ = $1; }
+ | tSTRUCT aIDENTIFIER { $$ = get_type(RPC_FC_STRUCT, $2, tsSTRUCT); }
+ | uniondef { $$ = $1; }
+ | tUNION aIDENTIFIER { $$ = find_type2($2, tsUNION); }
+ | tSAFEARRAY '(' type ')' { $$ = make_safearray($3); }
;
-typedef: tTYPEDEF m_attributes type pident_list { reg_typedefs(type_ref($3), $4, $2);
+typedef: tTYPEDEF m_attributes type pident_list { reg_typedefs($3, $4, $2);
process_typedefs($4);
}
;
@@ -1014,7 +1010,7 @@ static expr_t *make_exprs(enum expr_type type, char *val)
return e;
}
-static expr_t *make_exprt(enum expr_type type, typeref_t *tref, expr_t *expr)
+static expr_t *make_exprt(enum expr_type type, type_t *tref, expr_t *expr)
{
expr_t *e;
e = xmalloc(sizeof(expr_t));
@@ -1024,7 +1020,7 @@ static expr_t *make_exprt(enum expr_type type, typeref_t *tref, expr_t *expr)
e->is_const = FALSE;
/* check for cast of constant expression */
if (type == EXPR_SIZEOF) {
- switch (tref->ref->type) {
+ switch (tref->type) {
case RPC_FC_BYTE:
case RPC_FC_CHAR:
case RPC_FC_SMALL:
@@ -1199,49 +1195,9 @@ static type_t *make_type(unsigned char type, type_t *ref)
return t;
}
-static typeref_t *make_tref(char *name, type_t *ref)
+static void set_type(var_t *v, type_t *type, array_dims_t *arr)
{
- typeref_t *t = xmalloc(sizeof(typeref_t));
- t->name = name;
- t->ref = ref;
- t->uniq = ref ? 0 : 1;
- return t;
-}
-
-static typeref_t *uniq_tref(typeref_t *ref)
-{
- typeref_t *t = ref;
- type_t *tp;
- if (t->uniq) return t;
-
- if (t->name)
- {
- tp = duptype(t->ref, 0);
- tp->name = t->name;
- }
- else
- tp = duptype(t->ref, 1);
-
- t->name = NULL;
- t->ref = tp;
- t->uniq = 1;
- return t;
-}
-
-static type_t *type_ref(typeref_t *ref)
-{
- type_t *t = ref->ref;
- free(ref->name);
- free(ref);
- return t;
-}
-
-static void set_type(var_t *v, typeref_t *ref, array_dims_t *arr)
-{
- v->type = ref->ref;
- v->tname = ref->name;
- ref->name = NULL;
- free(ref);
+ v->type = type;
v->array = arr;
}
@@ -1321,17 +1277,14 @@ static type_t *make_class(char *name)
return c;
}
-static type_t *make_safearray(typeref_t *tref)
+static type_t *make_safearray(type_t *type)
{
- const type_t *sa_orig = find_type("SAFEARRAY", 0);
- type_t *sa = make_type(sa_orig->type, sa_orig->ref);
+ type_t *sa = duptype(find_type("SAFEARRAY", 0), 1);
type_t *ptr;
- if (sa_orig->name)
- sa->name = strdup(sa_orig->name);
- sa->ref = type_ref(tref);
+ sa->ref = type;
ptr = make_type(RPC_FC_FP, sa);
- ptr->name = strdup("SAFEARRAY");
+ ptr->name = xstrdup("SAFEARRAY");
return ptr;
}
diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c
index d63c49a..b35a7d5 100644
--- a/tools/widl/typegen.c
+++ b/tools/widl/typegen.c
@@ -2214,13 +2214,13 @@ static void write_struct_expr(FILE *h, const expr_t *e, int brackets,
break;
case EXPR_CAST:
fprintf(h, "(");
- write_type(h, e->u.tref->ref, NULL, e->u.tref->name);
+ write_type(h, e->u.tref, NULL, e->u.tref->name);
fprintf(h, ")");
write_struct_expr(h, e->ref, 1, fields, structvar);
break;
case EXPR_SIZEOF:
fprintf(h, "sizeof(");
- write_type(h, e->u.tref->ref, NULL, e->u.tref->name);
+ write_type(h, e->u.tref, NULL, e->u.tref->name);
fprintf(h, ")");
break;
case EXPR_SHL:
diff --git a/tools/widl/widltypes.h b/tools/widl/widltypes.h
index 29ebd5e..8cb1320 100644
--- a/tools/widl/widltypes.h
+++ b/tools/widl/widltypes.h
@@ -186,7 +186,7 @@ struct _expr_t {
long lval;
const char *sval;
const expr_t *ext;
- const typeref_t *tref;
+ type_t *tref;
} u;
const expr_t *ext2;
int is_const;
@@ -210,12 +210,6 @@ struct _type_t {
int typelib_idx;
};
-struct _typeref_t {
- char *name;
- type_t *ref;
- int uniq;
-};
-
struct _var_t {
char *name;
int ptr_level;
More information about the wine-cvs
mailing list