diff options
author | Parashurama <Rhagdamaziel@ymail.com> | 2017-06-05 13:16:30 +0200 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2017-06-05 13:16:30 +0200 |
commit | cd51628f577d35f8ba8b9a40162c7b74d1e71439 (patch) | |
tree | d146e8e8acb7f507870f00d8f247a563031562c8 | |
parent | 55c244400d303d5a7c30cc234cb062603f02c2ae (diff) | |
download | Nim-cd51628f577d35f8ba8b9a40162c7b74d1e71439.tar.gz |
fix orderedtable enlarge proc. (#5937)
This fixes issue #5917
-rw-r--r-- | lib/pure/collections/tables.nim | 7 | ||||
-rw-r--r-- | tests/stdlib/torderedtable.nim | 18 |
2 files changed, 23 insertions, 2 deletions
diff --git a/lib/pure/collections/tables.nim b/lib/pure/collections/tables.nim index 323af5a38..5b6701a12 100644 --- a/lib/pure/collections/tables.nim +++ b/lib/pure/collections/tables.nim @@ -590,8 +590,11 @@ proc enlarge[A, B](t: var OrderedTable[A, B]) = swap(t.data, n) while h >= 0: var nxt = n[h].next - if isFilled(n[h].hcode): - var j = -1 - rawGetKnownHC(t, n[h].key, n[h].hcode) + let eh = n[h].hcode + if isFilled(eh): + var j: Hash = eh and maxHash(t) + while isFilled(t.data[j].hcode): + j = nextTry(j, maxHash(t)) rawInsert(t, t.data, n[h].key, n[h].val, n[h].hcode, j) h = nxt diff --git a/tests/stdlib/torderedtable.nim b/tests/stdlib/torderedtable.nim new file mode 100644 index 000000000..91a916930 --- /dev/null +++ b/tests/stdlib/torderedtable.nim @@ -0,0 +1,18 @@ +import tables, random +var t = initOrderedTable[int,string]() + +# this tests issue #5917 +var data = newSeq[int]() +for i in 0..<1000: + var x = random(1000) + if x notin t: data.add(x) + t[x] = "meh" + +# this checks that keys are re-inserted +# in order when table is enlarged. +var i = 0 +for k, v in t: + doAssert(k == data[i]) + doAssert(v == "meh") + inc(i) + |