From 143bf5aa2b533b29e28aa535d3f7c422bb4b73d0 Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Wed, 8 Jun 2011 10:47:20 +0000 Subject: [PATCH] updated qse_stx_hashobj() --- qse/lib/stx/dic.c | 24 ++++++++++++++-------- qse/lib/stx/obj.c | 52 +++++++++++++++++++++++++++++++---------------- qse/lib/stx/stx.h | 2 -- 3 files changed, 50 insertions(+), 28 deletions(-) diff --git a/qse/lib/stx/dic.c b/qse/lib/stx/dic.c index 82a0c21e..57609f21 100644 --- a/qse/lib/stx/dic.c +++ b/qse/lib/stx/dic.c @@ -47,7 +47,7 @@ static qse_word_t new_assoc ( static qse_word_t find_slot ( qse_stx_t* stx, qse_word_t dic, qse_word_t key) { - qse_word_t size, hash, index, assoc, symbol; + qse_word_t size, hash, index, assoc, sym; qse_stx_dic_t* ptr; /* ensure that dic is a system dictionary */ @@ -59,6 +59,7 @@ static qse_word_t find_slot ( /* ensure that the key is a symbol */ QSE_ASSERT (REFISIDX(stx,key)); QSE_ASSERT (OBJCLASS(stx,key) == stx->ref.class_symbol); + QSE_ASSERT (OBJTYPE(stx,key) == CHAROBJ); size = OBJSIZE (stx, dic); hash = qse_stx_hashobj (stx, key); @@ -73,18 +74,19 @@ static qse_word_t find_slot ( assoc = ptr->slot[index]; if (assoc == stx->ref.nil) break; - symbol = WORDAT (stx, assoc, QSE_STX_ASSOC_KEY); + sym = WORDAT (stx, assoc, QSE_STX_ASSOC_KEY); - QSE_ASSERT (REFISIDX(stx,symbol)); - QSE_ASSERT (OBJCLASS(stx,symbol) == stx->ref.class_symbol); + QSE_ASSERT (REFISIDX(stx,sym)); + QSE_ASSERT (OBJCLASS(stx,sym) == stx->ref.class_symbol); + QSE_ASSERT (OBJTYPE(stx,sym) == CHAROBJ); /* NOTE: * shallow comparison is enough for identity check * because a symbol can just be a key of a system dicionary */ if (qse_strxncmp( - QSE_STX_DATA(stx,key), OBJSIZE(stx,key), - QSE_STX_DATA(stx,symbol), OBJSIZE(stx,symbol)) == 0) break; + &CHARAT(stx,key,0), OBJSIZE(stx,key), + &CHARAT(stx,key,0), OBJSIZE(stx,sym)) == 0) break; /* consider tally here too */ index = index % (size - 1); @@ -93,7 +95,7 @@ static qse_word_t find_slot ( return index; } -static void grow_dic (qse_stx_t* stx, qse_word_t dic) +static qse_word_t grow_dic (qse_stx_t* stx, qse_word_t dic) { qse_word_t new, size, index, assoc; @@ -103,12 +105,14 @@ static void grow_dic (qse_stx_t* stx, qse_word_t dic) * during the bootstrapping. */ QSE_ASSERT (stx->ref.class_system_dictionary != stx->ref.nil); - QSE_ASSERT (qse_stx_classof(stx,dic) == stx->ref.class_system_dicionary); + QSE_ASSERT (REFISIDX(stx,dic)); + QSE_ASSERT (OBJCLASS(stx,dic) == stx->ref.class_system_dictionary); size = OBJSIZE(stx,dic); new = qse_stx_instantiate (stx, OBJCLASS(stx,dic), QSE_NULL, QSE_NULL, (size - 1) * 2); - WORDAT(stx,new,0) = QSE_STX_TO_SMALLINT(0); + if (new == stx->ref.nil) return stx->ref.nil; + WORDAT(stx,new,QSE_STX_DIC_TALLY) = INTTOREF (stx, 0); for (index = 1; index < size; index++) { @@ -130,6 +134,8 @@ static void grow_dic (qse_stx_t* stx, qse_word_t dic) qse_stx_object_t*, qse_uint_t ); + + return dic; } qse_word_t qse_stx_lookupdic ( diff --git a/qse/lib/stx/obj.c b/qse/lib/stx/obj.c index a56ffaf7..03edc279 100644 --- a/qse/lib/stx/obj.c +++ b/qse/lib/stx/obj.c @@ -3,7 +3,6 @@ */ #include "stx.h" -#include "mem.h" qse_word_t qse_stx_allocwordobj ( qse_stx_t* stx, const qse_word_t* data, qse_word_t nflds, @@ -197,24 +196,43 @@ qse_word_t qse_stx_hashobj (qse_stx_t* stx, qse_word_t ref) if (REFISINT(stx, ref)) { qse_word_t tmp = REFTOINT(stx, ref); - hv = qse_stx_hash (&tmp, QSE_SIZEOF(tmp)); + hv = qse_stx_hashbytes (stx, &tmp, QSE_SIZEOF(tmp)); } - else if (QSE_STX_ISCHAROBJECT(stx,ref)) + else { - /* the additional null is not taken into account */ - hv = qse_stx_hash (QSE_STX_DATA(stx,ref), - QSE_STX_SIZE(stx,ref) * QSE_SIZEOF(qse_char_t)); - } - else if (QSE_STX_ISBYTEOBJECT(stx,ref)) - { - hv = qse_stx_hash ( - QSE_STX_DATA(stx,ref), QSE_STX_SIZE(stx,ref)); - } - else - { - QSE_ASSERT (QSE_STX_ISWORDOBJECT(stx,ref)); - hv = qse_stx_hash (QSE_STX_DATA(stx,ref), - QSE_STX_SIZE(stx,ref) * QSE_SIZEOF(qse_word_t)); + switch (OBJTYPE(stx,ref)) + { + case BYTEOBJ: + hv = qse_stx_hashbytes ( + stx, + &BYTEAT(stx,ref,0), + OBJSIZE(stx,ref) + ); + break; + + case CHAROBJ: + /* the additional null is not taken into account */ + hv = qse_stx_hashbytes ( + stx, + &CHARAT(stx,ref,0), + OBJSIZE(stx,ref) * QSE_SIZEOF(qse_char_t) + ); + break; + + case WORDOBJ: + hv = qse_stx_hashbytes ( + stx, + &WORDAT(stx,ref,0), + OBJSIZE(stx,ref) * QSE_SIZEOF(qse_word_t) + ); + break; + + default: + QSE_ASSERT ( + !"This should never happen" + ); + break; + } } return hv; diff --git a/qse/lib/stx/stx.h b/qse/lib/stx/stx.h index 2d6760f5..94220c43 100644 --- a/qse/lib/stx/stx.h +++ b/qse/lib/stx/stx.h @@ -186,8 +186,6 @@ struct qse_stx_t #define QSE_STX_CHARAT(stx,ref,pos) \ (((qse_stx_charobjptr_t)QSE_STX_PTRBYREF(stx,ref))->fld[pos]) - - /* REDEFINITION DROPPING PREFIX FOR INTERNAL USE */ #define REFISINT(stx,x) QSE_STX_REFISINT(stx,x) #define INTTOREF(stx,x) QSE_STX_INTTOREF(stx,x)