Module: wine Branch: master Commit: 9825ac7a1a0e2ac0088efe6ffda30000a9da2dfd URL: http://source.winehq.org/git/wine.git/?a=commit;h=9825ac7a1a0e2ac0088efe6ffd...
Author: Dan Hipschman dsh@linux.ucla.edu Date: Wed Oct 24 18:06:16 2007 -0700
widl: Fix a crash in compare_expr.
---
tools/widl/typegen.c | 25 +++++++++++++++++++++++-- 1 files changed, 23 insertions(+), 2 deletions(-)
diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c index 9dcffa7..f6d5536 100644 --- a/tools/widl/typegen.c +++ b/tools/widl/typegen.c @@ -228,6 +228,22 @@ static const char *get_context_handle_type_name(const type_t *type) return NULL; }
+/* This is actually fairly involved to implement precisely, due to the + effects attributes may have and things like that. Right now this is + only used for optimization, so just check for a very small set of + criteria that guarantee the types are equivalent; assume every thing + else is different. */ +static int compare_type(const type_t *a, const type_t *b) +{ + if (a == b + || (a->name + && b->name + && strcmp(a->name, b->name) == 0)) + return 0; + /* Ordering doesn't need to be implemented yet. */ + return 1; +} + static int compare_expr(const expr_t *a, const expr_t *b) { int ret; @@ -265,12 +281,17 @@ static int compare_expr(const expr_t *a, const expr_t *b) if (ret != 0) return ret; return compare_expr(a->u.ext, b->u.ext); + case EXPR_CAST: + ret = compare_type(a->u.tref, b->u.tref); + if (ret != 0) + return ret; + /* Fall through. */ case EXPR_NOT: case EXPR_NEG: case EXPR_PPTR: - case EXPR_CAST: - case EXPR_SIZEOF: return compare_expr(a->ref, b->ref); + case EXPR_SIZEOF: + return compare_type(a->u.tref, b->u.tref); case EXPR_VOID: return 0; }