diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1996-11-18 11:48:44 -0200 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1996-11-18 11:48:44 -0200 |
| commit | 62e1a4c84d9075e27e5bcde20151f8545f9ab731 (patch) | |
| tree | fc43e108a65ba1b88688e473e0374617b5222fb6 | |
| parent | 81411e8913a5aabd0c58926c7a399e1a6de4fe90 (diff) | |
| download | lua-62e1a4c84d9075e27e5bcde20151f8545f9ab731.tar.gz lua-62e1a4c84d9075e27e5bcde20151f8545f9ab731.tar.bz2 lua-62e1a4c84d9075e27e5bcde20151f8545f9ab731.zip | |
BUG: problems with negative indexes
| -rw-r--r-- | hash.c | 40 |
1 files changed, 21 insertions, 19 deletions
| @@ -3,7 +3,7 @@ | |||
| 3 | ** hash manager for lua | 3 | ** hash manager for lua |
| 4 | */ | 4 | */ |
| 5 | 5 | ||
| 6 | char *rcs_hash="$Id: hash.c,v 2.30 1996/05/06 14:30:27 roberto Exp roberto $"; | 6 | char *rcs_hash="$Id: hash.c,v 2.31 1996/07/12 20:00:26 roberto Exp roberto $"; |
| 7 | 7 | ||
| 8 | 8 | ||
| 9 | #include "mem.h" | 9 | #include "mem.h" |
| @@ -48,24 +48,26 @@ int luaI_redimension (int nhash) | |||
| 48 | 48 | ||
| 49 | static int hashindex (Hash *t, Object *ref) /* hash function */ | 49 | static int hashindex (Hash *t, Object *ref) /* hash function */ |
| 50 | { | 50 | { |
| 51 | switch (tag(ref)) | 51 | long int h; |
| 52 | { | 52 | switch (tag(ref)) { |
| 53 | case LUA_T_NIL: | 53 | case LUA_T_NIL: |
| 54 | lua_error ("unexpected type to index table"); | 54 | lua_error ("unexpected type to index table"); |
| 55 | return -1; /* UNREACHEABLE */ | 55 | h = 0; /* UNREACHEABLE */ |
| 56 | case LUA_T_NUMBER: | 56 | case LUA_T_NUMBER: |
| 57 | return (((int)nvalue(ref))%nhash(t)); | 57 | h = (long int)nvalue(ref); break; |
| 58 | case LUA_T_STRING: | 58 | case LUA_T_STRING: |
| 59 | return (int)((tsvalue(ref)->hash)%nhash(t)); /* make it a valid index */ | 59 | h = tsvalue(ref)->hash; break; |
| 60 | case LUA_T_FUNCTION: | 60 | case LUA_T_FUNCTION: |
| 61 | return (((IntPoint)ref->value.tf)%nhash(t)); | 61 | h = (IntPoint)ref->value.tf; break; |
| 62 | case LUA_T_CFUNCTION: | 62 | case LUA_T_CFUNCTION: |
| 63 | return (((IntPoint)fvalue(ref))%nhash(t)); | 63 | h = (IntPoint)fvalue(ref); break; |
| 64 | case LUA_T_ARRAY: | 64 | case LUA_T_ARRAY: |
| 65 | return (((IntPoint)avalue(ref))%nhash(t)); | 65 | h = (IntPoint)avalue(ref); break; |
| 66 | default: /* user data */ | 66 | default: /* user data */ |
| 67 | return (((IntPoint)uvalue(ref))%nhash(t)); | 67 | h = (IntPoint)uvalue(ref); break; |
| 68 | } | 68 | } |
| 69 | if (h < 0) h = -h; | ||
| 70 | return h%nhash(t); /* make it a valid index */ | ||
| 69 | } | 71 | } |
| 70 | 72 | ||
| 71 | int lua_equalObj (Object *t1, Object *t2) | 73 | int lua_equalObj (Object *t1, Object *t2) |
