| 587 | } |
| 588 | |
| 589 | dictEntry *dictNext(dictIterator *iter) |
| 590 | { |
| 591 | while (1) { |
| 592 | if (iter->entry == NULL) { |
| 593 | dictht *ht = &iter->d->ht[iter->table]; |
| 594 | if (iter->index == -1 && iter->table == 0) { |
| 595 | if (iter->safe) |
| 596 | dictPauseRehashing(iter->d); |
| 597 | else |
| 598 | iter->fingerprint = dictFingerprint(iter->d); |
| 599 | } |
| 600 | iter->index++; |
| 601 | if (iter->index >= (long) ht->size) { |
| 602 | if (dictIsRehashing(iter->d) && iter->table == 0) { |
| 603 | iter->table++; |
| 604 | iter->index = 0; |
| 605 | ht = &iter->d->ht[1]; |
| 606 | } else { |
| 607 | break; |
| 608 | } |
| 609 | } |
| 610 | iter->entry = ht->table[iter->index]; |
| 611 | } else { |
| 612 | iter->entry = iter->nextEntry; |
| 613 | } |
| 614 | if (iter->entry) { |
| 615 | /* We need to save the 'next' here, the iterator user |
| 616 | * may delete the entry we are returning. */ |
| 617 | iter->nextEntry = iter->entry->next; |
| 618 | return iter->entry; |
| 619 | } |
| 620 | } |
| 621 | return NULL; |
| 622 | } |
| 623 | |
| 624 | void dictReleaseIterator(dictIterator *iter) |
| 625 | { |
no test coverage detected