
> 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
shadowing is when a variable is used in an inner scope with the same name as an outer scope. many languages have strictly scoped blocks but python is not one of those languages allowing occasional mistakes like this. keyhash is used in an outer scope. i then use it as a loop variable, which changes its value in the outer scope.
gotta acknowledge here that the source paste is illegible because of all the wrapping and whitespace !
also, how is this like use of the word "shadow" in corruption? the people causing the corruption are (a) _hidden_ like the old value of the variable, where people see the one that is presented rather than the one acted and (b) cause _wrong events_ like the new value of the variable overridding its correct one
it's because shadowed objects aren't lit because light is cast on the object shadowing them instead and then they are less noticed from something else receiving the light cast on them, and so people don't include them and anything they do in their decisions as much :/
industrialized humans are rare in that we basically just cast light everywhere, with flashlights and streetlights and infrared cameras and sleeping at night and locking doors at night
most living beings just learn to see in the dark and treat incidental weirdnesses as serious each time
[OOPS OOPS ..] but anyway we are huge visual creatures! only other creatures with huge eyes have vision like we do
it's funny
y'know white people stick out like a sore thumb at night the moon glances off their skin almost like glow-in-the-dark . i like to think it relates to industrialization somehow
usually a shadowed variable would make the opposite crash -- where in the inner loop, the inner value is used as if it were the outer. here, since it's python, the crash is from the outer value being used after the inner loop has finished. [...
now i've got this: File "/home/karl3/projects/rep/rep/dict.py", line 220, in content_generator assert superidx * expansion + subidx == int.from_bytes(dbg_keyhash[:hashbytes], 'big') >> hashshift ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ AssertionError Uncaught exception. Entering post mortem debugging Running 'cont' or 'step' will restart the program > /home/karl3/projects/rep/rep/dict.py(220)content_generator() -> assert superidx * expansion + subidx == int.from_bytes(dbg_keyhash[:hashbytes], 'big') >> hashshift (Pdb) p item b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
but it's just because item is a sentinel which shouldn't hash to its index, can check for that