From f8a548c23c13762ce739380c4d6f530b3297e16a Mon Sep 17 00:00:00 2001 From: Tim Peters Date: Thu, 24 May 2001 16:26:40 +0000 Subject: [PATCH] dictresize(): Rebuild small tables if there are any dummies, not just if they're entirely full. Not a question of correctness, but of temporarily misplaced common sense. --- Objects/dictobject.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 11963ec1d9f..2854efcdffe 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -427,16 +427,20 @@ dictresize(dictobject *mp, int minused) is_oldtable_malloced = oldtable != mp->ma_smalltable; if (newsize == MINSIZE) { - /* Either a large table is shrinking, or we can't get any - smaller. */ + /* A large table is shrinking, or we can't get any smaller. */ newtable = mp->ma_smalltable; if (newtable == oldtable) { - if (mp->ma_fill < mp->ma_size) + if (mp->ma_fill == mp->ma_used) { + /* No dummies, so no point doing anything. */ return 0; - /* The small table is entirely full. We're not - going to resise it, but need to rebuild it - anyway to purge old dummy entries. */ - assert(mp->ma_fill > mp->ma_used); /* a dummy exists */ + } + /* We're not going to resize it, but rebuild the + table anyway to purge old dummy entries. + Subtle: This is *necessary* if fill==size, + as lookdict needs at least one virgin slot to + terminate failing searches. If fill < size, it's + merely desirable, as dummies slow searches. */ + assert(mp->ma_fill > mp->ma_used); memcpy(small_copy, oldtable, sizeof(small_copy)); oldtable = small_copy; }