diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2017-05-15 20:28:25 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2017-05-15 20:28:25 -0700 |
commit | f43feacabc378cbbf31beea28f41f1cb9483f4b6 (patch) | |
tree | d6317f816808cad72df2e856583c85c342ee787b | |
parent | e87568a3d43593d53c1d294e4f42f46232877855 (diff) | |
download | txr-f43feacabc378cbbf31beea28f41f1cb9483f4b6.tar.gz txr-f43feacabc378cbbf31beea28f41f1cb9483f4b6.tar.bz2 txr-f43feacabc378cbbf31beea28f41f1cb9483f4b6.zip |
bugfix: use proper hashing for cptr.
Since cptr objects are equal if their handles are equal, they
must have a hashing function over the handle rather than over
their own address.
* lib.c (cobj_handle_hash_op): New function.
(cptr_ops): Use cobj_handle_hash_op instead of
cobj_eq_hash_op.
* lib.h (cobj_handle_hash_op): Declared.
* sysif.c (cptr_dl_ops): Use cobj_handle_hash_op instead of
cobj_eq_hash_op.
-rw-r--r-- | lib.c | 8 | ||||
-rw-r--r-- | lib.h | 1 | ||||
-rw-r--r-- | sysif.c | 2 |
3 files changed, 9 insertions, 2 deletions
@@ -7389,12 +7389,18 @@ val cobj_equal_handle_op(val left, val right) return (left->co.handle == right->co.handle) ? t : nil; } +cnum cobj_handle_hash_op(val obj, int *count) +{ + mem_t *handle = obj->co.handle; + return cobj_eq_hash_op(coerce(val, handle), count); +} + static struct cobj_ops cptr_ops = { cobj_equal_handle_op, cobj_print_op, cobj_destroy_stub_op, cobj_mark_op, - cobj_eq_hash_op + cobj_handle_hash_op }; val cptr(mem_t *ptr) @@ -258,6 +258,7 @@ void cobj_destroy_stub_op(val); void cobj_destroy_free_op(val); void cobj_mark_op(val); cnum cobj_eq_hash_op(val, int *); +cnum cobj_handle_hash_op(val, int *); struct env { obj_common; @@ -1470,7 +1470,7 @@ static struct cobj_ops cptr_dl_ops = { cobj_print_op, cptr_dl_destroy_op, cobj_mark_op, - cobj_eq_hash_op + cobj_handle_hash_op }; static val dlopen_wrap(val name, val flags) |