aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/eval.c4
-rw-r--r--src/nvim/hashtab.c37
-rw-r--r--src/nvim/hashtab.h3
3 files changed, 14 insertions, 30 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index 249076a504..3c79600f23 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -5781,7 +5781,7 @@ static dict_T *dict_copy(dict_T *orig, int deep, int copyID)
/*
* Add item "item" to Dictionary "d".
- * Returns FAIL when out of memory and when key already exists.
+ * Returns FAIL when key already exists.
*/
int dict_add(dict_T *d, dictitem_T *item)
{
@@ -5815,7 +5815,7 @@ int dict_add_nr_str(dict_T *d, char *key, long nr, char_u *str)
/*
* Add a list entry to dictionary "d".
- * Returns FAIL when out of memory and when key already exists.
+ * Returns FAIL when key already exists.
*/
int dict_add_list(dict_T *d, char *key, list_T *list)
{
diff --git a/src/nvim/hashtab.c b/src/nvim/hashtab.c
index f8fd8f44af..85cd59f59f 100644
--- a/src/nvim/hashtab.c
+++ b/src/nvim/hashtab.c
@@ -171,7 +171,7 @@ void hash_debug_results(void)
/// in the new item (@see hashitem_T). Must not be NULL.
///
/// @return OK if success.
-/// FAIL if key already present, or out of memory.
+/// FAIL if key already present
int hash_add(hashtab_T *ht, char_u *key)
{
hash_T hash = hash_hash(key);
@@ -180,7 +180,8 @@ int hash_add(hashtab_T *ht, char_u *key)
EMSG2(_(e_intern2), "hash_add()");
return FAIL;
}
- return hash_add_item(ht, hi, key, hash);
+ hash_add_item(ht, hi, key, hash);
+ return OK;
}
/// Add item "hi" for key "key" to hashtable "ht".
@@ -190,16 +191,8 @@ int hash_add(hashtab_T *ht, char_u *key)
/// @param key Pointer to the key for the new item. The key has to be contained
/// in the new item (@see hashitem_T). Must not be NULL.
/// @param hash The precomputed hash value for the key.
-///
-/// @return OK if success.
-/// FAIL if out of memory.
-int hash_add_item(hashtab_T *ht, hashitem_T *hi, char_u *key, hash_T hash)
+void hash_add_item(hashtab_T *ht, hashitem_T *hi, char_u *key, hash_T hash)
{
- // If resizing failed before and it fails again we can't add an item.
- if (ht->ht_error && (hash_may_resize(ht, 0) == FAIL)) {
- return FAIL;
- }
-
ht->ht_used++;
if (hi->hi_key == NULL) {
ht->ht_filled++;
@@ -208,7 +201,7 @@ int hash_add_item(hashtab_T *ht, hashitem_T *hi, char_u *key, hash_T hash)
hi->hi_hash = hash;
// When the space gets low may resize the array.
- return hash_may_resize(ht, 0);
+ hash_may_resize(ht, 0);
}
/// Remove item "hi" from hashtable "ht".
@@ -250,14 +243,11 @@ void hash_unlock(hashtab_T *ht)
/// - Shrink when too much empty space.
/// - Grow when not enough empty space.
/// If non-zero, passed minitems will be used.
-///
-/// @return OK if success.
-/// FAIL if out of memory.
-static int hash_may_resize(hashtab_T *ht, size_t minitems)
+static void hash_may_resize(hashtab_T *ht, size_t minitems)
{
// Don't resize a locked table.
if (ht->ht_locked > 0) {
- return OK;
+ return;
}
#ifdef HT_DEBUG
@@ -276,7 +266,7 @@ static int hash_may_resize(hashtab_T *ht, size_t minitems)
// items are required for the lookup to decide a key isn't there.
if ((ht->ht_filled < HT_INIT_SIZE - 1)
&& (ht->ht_array == ht->ht_smallarray)) {
- return OK;
+ return;
}
// Grow or refill the array when it's more than 2/3 full (including
@@ -285,7 +275,7 @@ static int hash_may_resize(hashtab_T *ht, size_t minitems)
// at least 1/4 full (avoids repeated grow-shrink operations)
size_t oldsize = ht->ht_mask + 1;
if ((ht->ht_filled * 3 < oldsize * 2) && (ht->ht_used > oldsize / 5)) {
- return OK;
+ return;
}
if (ht->ht_used > 1000) {
@@ -309,10 +299,8 @@ static int hash_may_resize(hashtab_T *ht, size_t minitems)
while (newsize < minsize) {
// make sure it's always a power of 2
newsize <<= 1;
- if (newsize == 0) {
- // overflow
- return FAIL;
- }
+ // assert newsize didn't overflow
+ assert(newsize != 0);
}
bool newarray_is_small = newsize == HT_INIT_SIZE;
@@ -364,9 +352,6 @@ static int hash_may_resize(hashtab_T *ht, size_t minitems)
ht->ht_array = newarray;
ht->ht_mask = newmask;
ht->ht_filled = ht->ht_used;
- ht->ht_error = false;
-
- return OK;
}
/// Get the hash number for a key.
diff --git a/src/nvim/hashtab.h b/src/nvim/hashtab.h
index c268175b01..e4ad5e57fe 100644
--- a/src/nvim/hashtab.h
+++ b/src/nvim/hashtab.h
@@ -59,8 +59,6 @@ typedef struct hashtable_S {
size_t ht_used; /// number of items used
size_t ht_filled; /// number of items used or removed
int ht_locked; /// counter for hash_lock()
- bool ht_error; /// when set growing failed, can't add more
- /// items before growing works
hashitem_T *ht_array; /// points to the array, allocated when it's
/// not "ht_smallarray"
hashitem_T ht_smallarray[HT_INIT_SIZE]; /// initial array
@@ -69,4 +67,5 @@ typedef struct hashtable_S {
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "hashtab.h.generated.h"
#endif
+
#endif // NVIM_HASHTAB_H