From 338749c6541437a1f4498234a7e8ac9a9360facd Mon Sep 17 00:00:00 2001 From: Moritz Kroll Date: Fri, 20 Feb 2009 20:30:20 +0000 Subject: [PATCH] irio: Fixed symbols with same string but different type tag [r25537] --- ir/ir/irio.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/ir/ir/irio.c b/ir/ir/irio.c index 69591b648..8fa07197f 100644 --- a/ir/ir/irio.c +++ b/ir/ir/irio.c @@ -104,9 +104,12 @@ static unsigned string_hash(const char *str, int len) */ static int symbol_cmp(const void *elt, const void *key, size_t size) { + int res; const symbol_t *entry = (const symbol_t *) elt; const symbol_t *keyentry = (const symbol_t *) key; (void) size; + res = entry->typetag - keyentry->typetag; + if(res) return res; return strcmp(entry->str, keyentry->str); } @@ -133,7 +136,7 @@ static void symtbl_init(void) key.str = (s); \ key.typetag = (tt); \ key.code = (cod); \ - set_insert(symtbl, &key, sizeof(key), string_hash(s, sizeof(s)-1)) + set_insert(symtbl, &key, sizeof(key), string_hash(s, sizeof(s)-1) + tt * 17) #define INSERTENUM(tt, e) INSERT(#e, tt, e) @@ -209,12 +212,10 @@ static unsigned symbol(const char *str, typetag_t typetag) symbol_t key, *entry; key.str = str; + key.typetag = typetag; - entry = set_find(symtbl, &key, sizeof(key), string_hash(str, strlen(str))); - if (entry && entry->typetag == typetag) { - return entry->code; - } - return SYMERROR; + entry = set_find(symtbl, &key, sizeof(key), string_hash(str, strlen(str)) + typetag * 17); + return entry ? entry->code : SYMERROR; } static void *get_id(io_env_t *env, long id) -- 2.20.1