| 943 | } |
| 944 | |
| 945 | dictEntry *dictNext(dictIterator *iter) |
| 946 | { |
| 947 | while (1) { |
| 948 | if (iter->entry == NULL) { |
| 949 | dictht *ht = &iter->d->ht[iter->table]; |
| 950 | if (iter->index == -1 && iter->table == 0) { |
| 951 | if (iter->safe) |
| 952 | dictPauseRehashing(iter->d); |
| 953 | else |
| 954 | iter->fingerprint = dictFingerprint(iter->d); |
| 955 | } |
| 956 | iter->index++; |
| 957 | if (iter->index >= (long) ht->size) { |
| 958 | if (dictIsRehashing(iter->d) && iter->table == 0) { |
| 959 | iter->table++; |
| 960 | iter->index = 0; |
| 961 | ht = &iter->d->ht[1]; |
| 962 | } else { |
| 963 | break; |
| 964 | } |
| 965 | } |
| 966 | iter->entry = ht->table[iter->index]; |
| 967 | } else { |
| 968 | iter->entry = iter->nextEntry; |
| 969 | } |
| 970 | if (iter->entry) { |
| 971 | /* We need to save the 'next' here, the iterator user |
| 972 | * may delete the entry we are returning. */ |
| 973 | iter->nextEntry = iter->entry->next; |
| 974 | return iter->entry; |
| 975 | } |
| 976 | } |
| 977 | return NULL; |
| 978 | } |
| 979 | |
| 980 | void dictReleaseIterator(dictIterator *iter) |
| 981 | { |
no test coverage detected