fixes a critical tables bug that caused 'enlarge' to crash after 'add'

This commit is contained in:
Andreas Rumpf 2016-09-05 08:51:38 +02:00
commit 4077050a42
3 changed files with 30 additions and 11 deletions

View file

@ -35,9 +35,12 @@ proc enlarge[A, B](t: var SharedTable[A, B]) =
t.dataLen = size t.dataLen = size
swap(t.data, n) swap(t.data, n)
for i in 0..<oldSize: for i in 0..<oldSize:
if isFilled(n[i].hcode): let eh = n[i].hcode
var j = -1 - rawGetKnownHC(t, n[i].key, n[i].hcode) if isFilled(eh):
rawInsert(t, t.data, n[i].key, n[i].val, n[i].hcode, j) var j: Hash = eh and maxHash(t)
while isFilled(t.data[j].hcode):
j = nextTry(j, maxHash(t))
rawInsert(t, t.data, n[i].key, n[i].val, eh, j)
deallocShared(n) deallocShared(n)
template withLock(t, x: untyped) = template withLock(t, x: untyped) =

View file

@ -270,9 +270,12 @@ proc enlarge[A, B](t: var Table[A, B]) =
newSeq(n, len(t.data) * growthFactor) newSeq(n, len(t.data) * growthFactor)
swap(t.data, n) swap(t.data, n)
for i in countup(0, high(n)): for i in countup(0, high(n)):
if isFilled(n[i].hcode): let eh = n[i].hcode
var j = -1 - rawGetKnownHC(t, n[i].key, n[i].hcode) if isFilled(eh):
rawInsert(t, t.data, n[i].key, n[i].val, n[i].hcode, j) var j: Hash = eh and maxHash(t)
while isFilled(t.data[j].hcode):
j = nextTry(j, maxHash(t))
rawInsert(t, t.data, n[i].key, n[i].val, eh, j)
proc mgetOrPut*[A, B](t: var Table[A, B], key: A, val: B): var B = proc mgetOrPut*[A, B](t: var Table[A, B], key: A, val: B): var B =
## retrieves value at ``t[key]`` or puts ``val`` if not present, either way ## retrieves value at ``t[key]`` or puts ``val`` if not present, either way

View file

@ -0,0 +1,13 @@
discard """
output: '''done'''
"""
import tables
proc main =
var tab = newTable[string, string]()
for i in 0..1000:
tab.add "key", "value " & $i
main()
echo "done"