Small fixes to safety of hash iterator
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Thu, 14 May 2020 17:23:31 +0000 (12:23 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Thu, 14 May 2020 17:23:31 +0000 (12:23 -0500)
bh.h
onyx

diff --git a/bh.h b/bh.h
index da236743cc6bca493c6a4f59723f76e0536e601d..e0f20b2b5dd74d7fe88070b2f1df588648de9762 100644 (file)
--- a/bh.h
+++ b/bh.h
@@ -276,6 +276,10 @@ typedef struct bh_hash_iterator {
        #define bh_hash_has(T, tab, key)                (assert(sizeof(T) == sizeof(*(tab))), (bh__hash_has((ptr *) tab, sizeof(T), key)))
        #define bh_hash_get(T, tab, key)                (assert(sizeof(T) == sizeof(*(tab))), (*((T *) bh__hash_get((ptr *) tab, sizeof(T), key))))
        #define bh_hash_delete(T, tab, key)             (assert(sizeof(T) == sizeof(*(tab))), bh__hash_delete((ptr *) tab, sizeof(T), key))
+
+       #define bh_hash_iter_setup(T, tab)                      (bh__hash_iter_setup((ptr *) tab, sizeof(T)))
+       #define bh_hash_iter_key(it)                            (it.entry->key)
+       #define bh_hash_iter_value(T, it)                       (*(T *)&(it.entry->value))
 #else
        #define bh_hash_init(tab)                               bh__hash_init((ptr **) &(tab))
        #define bh_hash_free(tab)                               bh__hash_free((ptr **) &(tab))
@@ -283,11 +287,11 @@ typedef struct bh_hash_iterator {
        #define bh_hash_has(T, tab, key)                (bh__hash_has((ptr *) tab, sizeof(T), key))
        #define bh_hash_get(T, tab, key)                (*((T *) bh__hash_get((ptr *) tab, sizeof(T), key)))
        #define bh_hash_delete(T, tab, key)             (bh__hash_delete((ptr *) tab, sizeof(T), key))
-#endif
 
-#define bh_hash_iter_setup(T, tab)                     (assert(sizeof(T) == sizeof(*(tab))), bh__hash_iter_setup((ptr *) tab, sizeof(T)))
-#define bh_hash_iter_key(it)                           (it.entry->key)
-#define bh_hash_iter_value(T, it)                      (assert(sizeof(T) == it.elemsize), *(T *)&(it.entry->value))
+       #define bh_hash_iter_setup(T, tab)                      (assert(sizeof(T) == sizeof(*(tab))), bh__hash_iter_setup((ptr *) tab, sizeof(T)))
+       #define bh_hash_iter_key(it)                            (it.entry->key)
+       #define bh_hash_iter_value(T, it)                       (assert(sizeof(T) == it.elemsize), *(T *)&(it.entry->value))
+#endif
 
 b32 bh__hash_init(ptr **table);
 b32 bh__hash_free(ptr **table);
diff --git a/onyx b/onyx
index 8f837e0e1b922cc10e8a170268a9541a09eda703..413bb28fcef15e2533296e2a29fd93f2a3e4c51d 100755 (executable)
Binary files a/onyx and b/onyx differ