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