mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2024-11-10 23:32:09 +00:00
Fix value hashing and comparison in switch expressions.
This commit is contained in:
parent
74e6b13aee
commit
fff4fc693e
1 changed files with 9 additions and 10 deletions
|
@ -66,25 +66,24 @@ typedef struct case_node_s {
|
||||||
struct case_node_s *left, *right;
|
struct case_node_s *left, *right;
|
||||||
} case_node_t;
|
} case_node_t;
|
||||||
|
|
||||||
static uintptr_t
|
static ex_value_t *
|
||||||
get_value (expr_t *e)
|
get_value (expr_t *e)
|
||||||
{
|
{
|
||||||
if (e->type == ex_symbol) {
|
if (e->type == ex_symbol)
|
||||||
if (e->e.symbol->s.value.type == ev_string)
|
return &e->e.symbol->s.value;
|
||||||
return (uintptr_t) e->e.symbol->s.value.v.string_val;
|
return &e->e.value;
|
||||||
return e->e.symbol->s.value.v.integer_val;
|
|
||||||
}
|
|
||||||
return e->e.value.v.integer_val;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static uintptr_t
|
static uintptr_t
|
||||||
get_hash (void *_cl, void *unused)
|
get_hash (void *_cl, void *unused)
|
||||||
{
|
{
|
||||||
case_label_t *cl = (case_label_t *) _cl;
|
case_label_t *cl = (case_label_t *) _cl;
|
||||||
|
ex_value_t *val;
|
||||||
|
|
||||||
if (!cl->value)
|
if (!cl->value)
|
||||||
return 0;
|
return 0;
|
||||||
return get_value (cl->value);
|
val = get_value (cl->value);
|
||||||
|
return Hash_Buffer (val, sizeof (*val));
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -94,7 +93,7 @@ compare (void *_cla, void *_clb, void *unused)
|
||||||
case_label_t *clb = (case_label_t *) _clb;
|
case_label_t *clb = (case_label_t *) _clb;
|
||||||
expr_t *v1 = cla->value;
|
expr_t *v1 = cla->value;
|
||||||
expr_t *v2 = clb->value;
|
expr_t *v2 = clb->value;
|
||||||
uintptr_t val1, val2;
|
ex_value_t *val1, *val2;
|
||||||
|
|
||||||
if (v1 == v2)
|
if (v1 == v2)
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -104,7 +103,7 @@ compare (void *_cla, void *_clb, void *unused)
|
||||||
return 0;
|
return 0;
|
||||||
val1 = get_value (v1);
|
val1 = get_value (v1);
|
||||||
val2 = get_value (v1);
|
val2 = get_value (v1);
|
||||||
return val1 == val2;
|
return memcmp (val1, val2, sizeof (*val1));
|
||||||
}
|
}
|
||||||
|
|
||||||
struct expr_s *
|
struct expr_s *
|
||||||
|
|
Loading…
Reference in a new issue