
here's the crash now: Traceback (most recent call last): File "/nix/store/f2krmq3iv5nibcvn4rw7nrnrciqprdkh-python3-3.12.9/lib/python3.12/pdb.py", line 1960, in main pdb._run(target) File "/nix/store/f2krmq3iv5nibcvn4rw7nrnrciqprdkh-python3-3.12.9/lib/python3.12/pdb.py", line 1754, in _run self.run(target.code) File "/nix/store/f2krmq3iv5nibcvn4rw7nrnrciqprdkh-python3-3.12.9/lib/python3.12/bdb.py", line 627, in run exec(cmd, globals, locals) File "/home/karl3/projects/rep/rep/dict.py", line 394, in <module> doc.update([[val,val]]) File "/home/karl3/projects/rep/rep/dict.py", line 349, in update super().update(keyhashitems()) File "/home/karl3/projects/rep/rep/dict.py", line 164, in update assert int.from_bytes(keyhash[:hashbytes], 'big') >> hashshift == newidx ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ AssertionError for keyhash, item in keyhashitems: assert item != self._sentinel byteidx = int.from_bytes(keyhash[:hashbytes], 'big') newidx = byteidx >> hashshift if self._capacity > 0: # this block checks for collision with previous stored values if capacity > self._capacity: superidx = int.from_bytes(keyhash[:self._hashbytes], 'big') >> self._hashshift else: superidx = newidx place = self.array[superidx] if place != self._sentinel: collision = self._key(place) if collision != keyhash: assert superidx == int.from_bytes(collision[:self._hashbytes], 'big') >> self._hashshift updates[newidx] = [collision, place, False] # this separated approach to checking for collisions allows for accepting # batched data that ends up containing hash collisions solely within itself placing = updates.get(newidx) if placing is not None: collision, place, is_new = placing while newidx == int.from_bytes(collision[:hashbytes], 'big') >> hashshift: capacity <<= 1 expansion <<= 1 #spread += 1 #hashbits = self._hashbits + spread hashbits += 1 hashbytes = (hashbits+7) >> 3 hashshift = (hashbytes << 3) - hashbits byteidx = int.from_bytes(keyhash[:hashbytes], 'big') newidx = byteidx >> hashshift assert capacity == (1 << hashbits) new_updates = {} for keyhash, item, is_new in updates.values(): if is_new: newnewidx = int.from_bytes(keyhash[:hashbytes], 'big') >> hashshift assert newnewidx not in new_updates new_updates[newnewidx] = [keyhash, item, True] updates = new_updates assert newidx not in updates assert int.from_bytes(keyhash[:hashbytes], 'big') >> hashshift == newidx updates[newidx] = [keyhash, item, True] it looks like the problem is that keyhash is shadowed in the loop at the end :D