Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix #14971 OrderedTable del and pop are slow #14995

Closed
wants to merge 3 commits into from
Closed

Fix #14971 OrderedTable del and pop are slow #14995

wants to merge 3 commits into from

Conversation

hashbackup
Copy link

  • OrderedTable deletes were O(n),now are O(1)
  • singly-linked list changed to doubly-linked
  • new table is no longer created on del
  • uses about 40% less memory if del is used
  • uses 8 bytes more per entry for back link
  • added itemMoved callback when backshifting after delete
  • itemMoved is a no-op on all but OrderedTable
  • for OrderedTable, itemMoved adjusts the linked list
  • added new tests
  • modified delImplIdx to maybe be clearer

* OrderedTable deletes were O(n),now are O(1)
* singly-linked list changed to doubly-linked
* new table is no longer created on del
* uses about 40% less memory if del is used
* uses 8 bytes more per entry for back link
* added itemMoved callback when backshifting after delete
* itemMoved is a no-op on all but OrderedTable
* for OrderedTable, itemMoved adjusts the linked list
* added new tests
* modified delImplIdx to maybe be clearer
@hashbackup
Copy link
Author

hashbackup commented Jul 15, 2020

Notes about the change

Existing OrderedTable

  • O(n) to delete 1 item
  • takes 0.001s to add 100K items
  • takes 60s to del 100K items
  • other modules take 0.01-0.04s to delete 100K items
  • doubles memory use after 1 delete

Possible solutions

1. Existing code is problematic because
of backshifting on delete in Table - a generally
good thing, but not for how OT was designed.

a) keep existing slow code, document that it's slow
b) disable deletes to avoid performance issues
c) switch to doubly-linked list, adjust it when
backshifting on deletes in Table (chosen)

Pros:

  • changes more confined to del
  • existing Table code is fastest to create tables
  • no external dependencies
  • new design is faster than alternatives

Cons:

  • uses more memory than CompactDict
  • space increase objections because of compiler / JSON

2. LruCache uses a doubly-linked list design not
affected by backshifting.

Pros:

  • small amount of code: < 100 lines
  • takes 0.003s to delete 100K items vs 60s for existing
  • uses Nim Table and DoublyLinkedList
  • scales well (linearly)
  • smaller than existing OT if deletes are used

Cons:

  • 15x slower to create 100K item table: .02s vs .0013s
  • 30% larger than existing if deletes are never used

3. CompactDict based on Python dict

Pros:

  • smallest storage per item
  • 40% smaller than existing if no deletes
  • 60% smaller than existing with deletes
  • scales well (linearly)
  • deletes are 2x faster than inserts
  • maintains order when deleting

Cons:

  • 300 lines of unique code
  • does not use existing Table code
  • random probe sequence is not cache friendly
  • 7x slower to create 100K item table: .0071s vs .0013s

4. OLTab by @c-blake http://github.com/c-blake/adix

Pros:

  • scales linearly
  • drop-in compatible with Nim's tables, like Compactdict
  • 7 per-table options to control capacity, max probe depth, min free slots, growth factor
  • detailed statistics for users to understand performance

Cons:

  • lots of new code if it is added to stdlib instead of replacing some existing table code
  • does not guarantee to maintain order on deletes

Performance scaling for new OrderedTable and alternatives
The performance tests below create a large insert-ordered table[int, int] then delete every item added. Times are in seconds

Type Items Time Ratio MB Ratio
OrderedTable 1M 0.23 84
OrderedTable 2M 0.48 2.1 168 2
OrderedTable 4M 0.97 2 336 2
OrderedTable 8M 1.96 2 672 2
LruCache 1M 0.40 100
LruCache 2M 0.82 2 199 2
LruCache 4M 1.64 2 397 2
LruCache 8M 3.42 2.1 793 2
Compact 1M 0.25 52
Compact 2M 0.60 2.4 116 2.2
Compact 4M 1.24 2 238 2
Compact 8M 2.74 2.2 396 1.6
OLTab 1M 0.27 65
OLTab 2M 0.55 2 130 2
OLtab 4M 1.04 1.9 242 1.9
OLtab 8M 2.7 2.6 517 2.1

Performance comparison by # items

Type Items Time MB
OrderedTable 1M 0.23 84
LruCache 0.40 100
Compact 0.25 52
OLTab 0.27 65
OrderedTable 2M 0.48 168
LruCache 0.82 199
Compact 0.60 116
OLTab 0.55 130
OrderedTable 4M 0.97 336
LruCache 1.64 397
Compact 1.24 238
OLtab 1.04 242
OrderedTable 8M 1.96 672
LruCache 3.42 793
Compact 2.74 396
OLtab 2.7 517

@Araq
Copy link
Member

Araq commented Jul 16, 2020

Sorry, -1 from me.

del is clearly documented as O(N) and most code out there does not call del at all. In fact, deletion is generally much more uncommon than insertions. So in the end for most programs the 8 bytes per entry are worse than the hypothetical O(N) vs O(1) for an uncommon operation. This is espcially troublesome as json.nim uses OrderedTable in its implementation and many applications nowadays process enormous amounts of JSON.

I would really prefer to see a Python-like compact table implementation instead.

@hashbackup
Copy link
Author

Background on how this PR came about:

tiny_sqlite recently added a small 100-item cache for prepared statements, using OrderedDict as a fifo. Python uses an LRU cache. So as an experiment I made a quick hack to simulate LRU: on a successful hit to the OrderedDict cache, it deleted the item and re-inserted it. It worked, but increased runtime from 16s to 22s for 7M queries. Using LruCache instead, runtime was about 16.3s, so the tiny_sqlite author added LruCache to tiny_sqlite. With the OrderedDict changes in this PR, tiny_sqlite runtime is 16.3s, like LruCache.

I'm curious myself about how these different hash tables compare when creating lots of smaller tables and will post test results today.

@hashbackup
Copy link
Author

hashbackup commented Jul 16, 2020

This test creates a small 1K-entry table 1M times to see how different dict/table implementations perform. No deletes. Compiler is 1.3 with --gc:arc unless otherwise listed.

when defined(compact):
  import compactdict
when defined(lru):
  import lrucache
else:
  import tables
import times

const
  loops = 1_000_000
  els = 1000

var t0 = cpuTime()

for j in 0 ..< loops:
  when defined(table):
    var ot = initTable[int, int](els)
  when defined(ordered):
    var ot = initOrderedTable[int, int](els)
  when defined(lru):
    var ot = newLruCache[int, int](els)
  when defined(compact):
    var ot = initDict[int, int](els)

  for i in 0 ..< els:
    ot[i] = i

echo "Time: ", cpuTime() - t0

See note at the end on how table sizes were computed.

Type Time Memory Options
Table 13.5s 53305
Ordered 14.6s 69708
Ordered (PR) 16.9s 86094
LruCache 90.7s 102105
Compact 38s 8267 had to disable =destroy=
OLTab 21.5s 8270 1024 slots
OLTab 17.3s 12366 2048 slots

I'm not exactly sure what to make of these results; here are my thoughts:

The existing OrderedTable is 31% larger than Table. This makes sense because Table has 2 integers per entry, OT has 3 (the link for ordering). This PR adds a back link to each entry so is 25% larger than the existing OT and 16% slower since it has to update 2 links instead of just 1. One possibility is to use 1/2/4/8-byte integers for the link fields, saving space but limiting the number of items.

The LruCache results are puzzling because it is very simple and uses Nim's Table and DoublyLinkedList. From what I can tell there is no big initialization step when a new LruCache is created, and while LruCache was 2x slower than OrderedTable in large table tests, I can't explain why it is 5x slower in a small table test. Maybe @jackhftang can shed some light on this. OrderedTable has a good design in that the list is embedded in the hash table entries. So to add a new item, there is a memory access to store the item in the table, plus two to update the list. LruCache's DoublyLinkedListlist is not part of the table, which helps explaining why it is 2x slower, but doesn't explain 5x for the small table test.

In large table tests, Compactdict did very well on memory usage and while slower than Nim's tables, it wasn't by a lot. In the large table test with 1M items, it had the same runtime as OrderedTable but used less memory. But in the small table test, Compactdict at 38s is 2x as slow as OrderedTable. I haven't reviewed the Compactdict code; it may be slow to create new tables, explaining the difference between small and large table tests. I had to disable =destroy= or it SEGV'd. It also didn't work well with --gc:arc, using 8G of RAM, ie, nothing ever got freed I think. It certainly creates small dictionaries for this test.

OLTab from @c-blake creates very small tables like Compactdict but is much faster and doesn't have problems with --gc:arc. Combined with being actively involved here, it would be better IMO to use his OLTab for a compact table vs Compactdict. I will try to add large table test results for OLTab. A couple of outstanding questions: 1) does OLTab support duplicate keys, and do we care if it doesn't? 2) does it maintain order over deletes? (Python's compactdict does, not sure about Nim Compactdict)

Small table sizes: because these tables are small, it doesn't work to use OS RSS numbers. Instead, a separate test was run that creates 10K tables and stores them in an array. The OS RSS is collected, 640000 is subtracted (minimal Nim program), 160000 is subtracted for the array, then divide by 10K.

@c-blake
Copy link
Contributor

c-blake commented Jul 16, 2020

I did a compact, insertion-ordered table over at https://github.com/c-blake/adix/blob/master/adix/olset.nim. The first 250 lines are the algorithm, the last part is more the Nim stdlib sets/tables like API. It could be simpler, but it does both Robin Hood and regular linear probing on the "hash table part". It could also be more optimized as mentioned in some comments there.

I agree if we also provide a CompactTable then it matters much less whether every operation on OrderedTable is efficient, as long as that is clearly documented. Maybe emphasizing O(n) *per call* in the documentation would be more clear?

Undiscussed so far, but related to @Araq's complaint about most client code not using deletion, is whether insertion order needs to be maintained once deletions are in the mix. The doubly linked list approach of course lets one do that since order is completely independent of the hash layout. However, the "easy" way to have an efficient delete in the "compact"-style is to swap the delete victim with the very end of the dense seq (updating the "hash part") and then just shrink that seq by 1. This maintains density of the dense seq, but disrupts the order of that dense seq relative to insert order. While keeping that order is possible with complexity like "holes" or other contortions, that may also be a "software contract not worth signing". Or maybe it is? I'd prefer not to "sign it" without strong motivation, personally.

Another related but wholly distinct question is whether OrderedSet or CompactSet would be useful. The way I structured my stuff in adix, I get tables from sets very easily and just doing the full Cartesian Product is easy, but I think that layering is a little slower than how, say, CritBitTree works with its optionally void generic "value" parameter (of course that only has string keys which is slightly different).

@hashbackup
Copy link
Author

Another difference I should mention: the old OT code deleted all duplicates of a key. The new code only deletes the first item with that key and a loop is needed to delete all duplicates. This was changed for 2 reasons:

  • the regular hash table only deletes one item per call
  • deleting duplicates slows down every successful delete because you have to do another search to see if there's a duplicate

Duplicates in a hash table are not a great idea, but I think they are used in the compiler. It may be that special tables for the compiler, JSON, etc. would make sense, with OrderedTable having good all-around performance for general use but maybe not as fast or small as more specialized tables for specialized uses where deletes never occur, table sizes are limited, dups are allowed, etc.

@c-blake
Copy link
Contributor

c-blake commented Jul 16, 2020

In the past, others have found stdlib's multi-key semantics (e.g. nim-lang/RFCs#200) confusing. I agree having OrderedTable just like Table except that "batch vs single" delete is kind of a landmine/footgun. It looks like that could be fixed with a simple break or similar, though.

The way OrderedTable.del is written now is barely better than some impl-unaware start from scratch and insert all key != deleteTarget. The current way doesn't allocate another block of memory/have to do hash-pathway lookups. I guess that's something.

It's surprising enough that if we don't do something like this PR then the documentation should really hammer the reader over the head with the fact..Italics/emphasis/really spelled out. This PR shows there is nothing preventing efficiency in principle. Most people just "assume" that in a fast language that the efficient thing will be done, not that a general purpose OrderedTable will have operations whose efficiency is held hostage to memory optimization for special use cases in JSON operations. So, if we go that way, to overcome that strong assumption, more explanation than "O(n) complexity" is needed, IMO. But I will stop repeating myself on this.

Another possibility is using 4 byte pointers instead of 8 byte pointers so the double links take up the same space. That would limit us to 4 GiEntry OrderedTable, but that may be plenty. Or a maybe a new generic parameter to set the integer size of links defaulting to 4, so only super-size-er code needs to alter it?

Also/or maybe @hashbackup should do some JSON benchmarking with his version? That extra 8 bytes per slot could be pretty small in a JSON context with all the string data flying around. Cache sizes and the timing impact may all vary, but the memory impact should be pretty similar across deployment platforms.

Just trying to provide constructive feedback. I think CompactTable is probably the best way to go to maintan insertion order as long as we don't promise any such order with del ops in the mix.

@hashbackup
Copy link
Author

I updated the memory sizes on the 2nd set of tests for small tables and added OLTab from c-blake's adix collection.

@Araq
Copy link
Member

Araq commented Jul 16, 2020

While keeping that order is possible with complexity like "holes" or other contortions, that may also be a "software contract not worth signing". Or maybe it is? I'd prefer not to "sign it" without strong motivation, personally.

This is a good point and Python's del is order preserving, making it O(N) too. (!!!)

@hashbackup
Copy link
Author

I don't understand this:

This is a good point and Python's del is order preserving, making it O(N) too. (!!!)

If you look at #14971, Python adds and deletes 100K items from an ordered dictionary in 0.08s, whereas it takes OrderedTable 60s to do the same thing. Ie, the existing OrderedTable is 750x slower than Python @ 100K items and becomes quickly unusable above that. The existing OT is O(n) to delete one item; it's O(m*n) to delete m items. Python is nothing like this.

@Araq
Copy link
Member

Araq commented Jul 16, 2020

He, good point. I stand corrected. Should study its source code.

@hashbackup hashbackup marked this pull request as draft July 16, 2020 17:47
@planetis-m
Copy link
Contributor

Python does the "fast"del function where it replaces the hole with the last item.

@hashbackup
Copy link
Author

hashbackup commented Jul 16, 2020

I've been messing with the table code to see about changing links to different sizes. I noticed there is a sort function for OrderedTables that reorders items by key rather than insertion order and that would have to be updated for this PR. Changed it to a draft.

@c-blake
Copy link
Contributor

c-blake commented Jul 16, 2020

In CPython Objects/dictobject.c:delitem_common, deletion puts a tombstone (DKIX_DUMMY) into the index part and just a "hole" into the dense sequence (NULL key/val). The location of said hole is not registered anywhere. So, wasted space/sparsity in the dense array part of the two-level structure must grow without bound (unless they do some O(nEntries) re-org, such as when there are too many tombstones, for example).

It seems kind of a stretched argument to me to say that wasted space (and time iterating) is better than permuting the order during deletes..unless as I've already mentioned, there is an important algorithm that needs this kind of mouthful property of "insert order, ignoring deletes along the way except to remove the items". Of course, my alternative is a little bit of a mouthful, too, "insertion ordered unless you delete in which case all bets are off". ;-)

To make these claims less abstract, here:

import time

d = dict()

t0 = time.time()
for i in range(10_000_000): d[i] = 2
print(time.time() - t0, "to build")

t0 = time.time()
sum = 0
for i in range(10_000_000): pass #XXX this should be `i in d.keys()`
print(time.time() - t0, "to iterate")

t0 = time.time()
for i in range(10_000_000):
    if i % 1000 != 0: del d[i] # delete 99.9%
print(time.time() - t0, "to delete 99.9%")

t0 = time.time()
sum = 0
for k in d.keys(): pass
dt = time.time() - t0
print(dt, "to iterate over 0.1%")
print(dt*1000, "implied time to iterate w/hostile keys")

I get these results:

1.0783791542053223 to build
0.3181750774383545 to iterate
1.3579120635986328 to delete 99.9%
0.010917901992797852 to iterate over 0.1%
10.917901992797852 implied time to iterate w/hostile keys

Instead of multiplying by 1000, I could also have calculated the amortized "time per iteration" by dividing by len(d). but the answer is the same - 10.918/0.318 = 34x slower than you might expect for that post-delete iteration. Other Python slowness probably masks some of the algorithmic problem here (as well as the fact that memory latency limits are worse than memory bandwidth).

I also don't see any "counter" of the DKIX_DUMMY tombstones..only "used slots". So, I doubt they do the right thing there which is to rehash into a fresh table of the appropriate size. They may block an infinite loop from an almost-all-tombstone table, but I doubt they block performance degradation, the way done in glib hash tables, for example. It's a suboptimal hash table implementation in several ways not something to be imitated, IMO.

@hashbackup
Copy link
Author

I'm confused again. It happens! :-) When you did this:

for i in range(10_000_000): pass
print(time.time() - t0, "to iterate")

I thought it was going to be so you could subtract out Python's null loop iteration time. Did you mean to do for k in d.keys(): pass after building the table?

@c-blake
Copy link
Contributor

c-blake commented Jul 16, 2020

Apologies I started from a sum += d[i] benchmark that I reduced to simply pass. Anyway, the effect is the same, but worse. Changing that time to iterate loop to for i in d.keys(): pass gives:

1.06075119972229 to build
0.22281384468078613 to iterate
1.3322453498840332 to delete 99.9%
0.010533809661865234 to iterate over 0.1%
10.533809661865234 implied time to iterate w/hostile keys

So, now it's 10.5338/0.2228 = 47x slower than you might expect, not 34x.

@c-blake
Copy link
Contributor

c-blake commented Jul 16, 2020

Anyway, the point was "What's more important? Iteration performance or insertion-order with deletes in the mix?" Beats me. Python tilts one way, but we could tilt the other, unless someone gives strong reasons why with deletes in the mix pure insertion order is what you really need. And, of course, all that extra space is not just iteration performance. It's memory occupancy, fitting in caches, and performance on other table operations as well, as with the tombstone stuff.

@c-blake
Copy link
Contributor

c-blake commented Jul 16, 2020

Another issue with "just copying" Python stuff is that they have sentinel valus (NULL) for objs and Nim does not. So, while they can mark the deleted dense seq entry NULL, a Nim version would need a bit vector adding memory, indirection, and complexity (or some equivalent equally complex thing).

@Clyybber
Copy link
Contributor

Clyybber commented Jul 16, 2020

One simple thing we could do to alleviate the added memory usage is to make prev and next int32 and make them relative indices. scratch that, better to have a hard limit than fail randomly

@hashbackup
Copy link
Author

hashbackup commented Jul 16, 2020

@Clyybber I'm looking at that now. The typing is not always consistent in tables.nim: there needs to be a distinction (I think) between hash codes and hash indexes aka slot numbers, and they're kinda jumbled up right now. They are already indexes, not pointers. I don't quite get what you mean about relative. There is no spatial relationship between items in a hash table, and in fact, the point is to get items evenly distributed over the entire table. If we could have 1/2/4/8-byte prev/next pointers and do a table resize at 256/64K/4B entries, that might be interesting.

This is just my opinion, but if a data structure says it maintains insertion order, I think it should do that without caveats. So if deletes are going to get it out of order, and probably only some deletes will do that, then it shouldn't support deletes at all.

Likewise, if 100K items can be inserted into a data structure in 1/1000th of a second, I don't think it's reasonable for it to take 60s to delete them.

IMO, stdlib services should be well-rounded in all areas that they support. It looks good in documentation to say that a table supports deletes, and people generally expect that functionality for a table/dict and would find it odd for it to be missing, but it should also be documented that for 100K items, those deletes are 60000x slower than inserts, and it gets much much worse if the table is bigger.

Again, just my opinion, but to me, balanced performance in all areas of function, with reasonable CPU time and memory usage, are more important than having a race car for 2 features but the car blows up if you use the 3rd feature.

@c-blake
Copy link
Contributor

c-blake commented Jul 16, 2020

My guess is that @hashbackup hasn't yet learned about seq.delete { and also won't like it. ;-) }

We could also provide a separate CompactTable.delete proc the same way seq has a "fast del" but "slow delete" with the latter being O(n) for both seq and CompactTable. Indeed, the proc for OrderedTable deletes should arguably always have been called delete instead of del to be consistent with the seq pattern.

I don't think available but slow deletes are bad as long as they're very clearly documented and there is compensating performance argument like inserts are faster, iteration is faster, memory is less, etc. There are not too many "perfectly balanced" data structures out there...

@hashbackup
Copy link
Author

I do get that a sequential data structure like an array or list / seq is going to be slower deleting items (or copying over them) at the beginning rather than the end. The thing that is striking to me about OrderedTable now is that it isn't just slower, it's crazy slower.

Here's a Python program that builds a list and deletes all the items from last to first:

l = []
for i in xrange(100000):
    l.append(i)
for i in xrange(100000):
    l.pop()

ms:nx jim$ /usr/bin/time -l py list.py
        0.05 real         0.04 user         0.00 sys
   8765440  maximum resident set size

Same thing but deleting items from first to last:

l = []
for i in xrange(100000):
    l.append(i)
for i in xrange(100000):
    l.pop(0)

ms:nx jim$ /usr/bin/time -l py list.py
        1.91 real         1.90 user         0.00 sys
   9027584  maximum resident set size

Sure, there is a difference in performance of 38x. But if it were like OrderedTable, a difference of 60000x, then it would take 50 minutes to delete list items from front to back. People might actually, you know, complain about that.

I'm going to bow out on this one. I enjoy programming, but trying to get consensus on this seems like it will be difficult, and honestly, I don't care enough about the fate of OrderedTable to put in this much non-programming effort.

@hashbackup hashbackup closed this Jul 16, 2020
@hashbackup
Copy link
Author

Updated "Notes about the change" to include large table test results for OLTab and Pros/Cons

@hashbackup
Copy link
Author

@Clyybber I did some work on separating hash code and hash index types, to allow using smaller integers for either/both. Needed about 25 changes to tables, tableimpl, hashes, hashcommon. It compiles and runs, but incorrectly.

It might make sense to reduce all of these to int32, because that would allow 2B items to be hashed, which is quite a lot. A new 64-bit version like HugeTable could be added for >2B items.

The existing code uses hash code 0 as an "empty slot" marker, so when a key hashes to zero, it gets changed to a random constant. I changed the constant to 3 to handle tiny tables < 256 elements.

It also uses negative indexes for first/last/prev/next as "null" pointers. Negative indexes are a problem because they cut the available slots by half, ie, you'd have to use int16 instead of uint16, so can only store 32767 items instead of 65535. Like 0 is a reserved hash code, we also need a reserved hash index to act like null. I'd suggest high(HashIdx), because there is already a rule that LP tables always need at least one empty slot for unsuccesful searches to terminate. This could be handled along with zero as a reserved hash code and changed to 5/7/whatever. Then high(HashIdx) can be used as a "null" for the list.

The other problem with these changes is that other table implementations like sharedTable and even LemonBoy's Compactdict, import and use some of these table procedures. They will no longer compile without changes. I've proven that with Compactdict: it only works if types Hash and HashIdx (new) are int. I don't know if tableimpl was supposed to be public or not, but there ya go.

If these changes worked I'd commit them to this branch for posterity in case anyone wanted to take up the torch later and run them through the GH gauntlet. But there are problems and I'm not planning to continue with them.

rawGet & friends also return negative numbers to indicate the key isn't present and encode the target slot as a negative integer. These would have to be changed to return a tuple: the unsigned slot and a bool for exists vs missing.

I have a diff for these changes. If anyone wants it shoot me an email.

@hashbackup
Copy link
Author

hashbackup commented Jul 17, 2020

Apologies to @c-blake, the numbers for large table OLTab were wrong because of table changes in my directory. New numbers are posted and OLTab looks very competitive and creates tables smaller than everything except Compactdict. In a side-by-side test of these two, running all 4 tests one after another and including iterating over 1% of the table after 99% of items were deleted, OLTab takes 4.57s and uses 642M while Compactdict takes 4.59s and uses 455M of RAM.

However, Compactdict did not do very well in the small 1000-item table test whereas OLTab did, and Compactdict has some --gc:arc problem that OLTab doesn't.

@hashbackup
Copy link
Author

hashbackup commented Jul 18, 2020

There's a JSON benchmark at https://github.com/kostya/benchmarks#json, the first result in a Google search for nim json benchmark. Since it was mentioned as a concern, I was curious how much OrderedTable affected a JSON benchmark. In this benchmark, the maximum items added to a table is 4 and json.nim creates tables with this size.

The rankings on this page are sorted by CPU time and memory use is not given much, if any, importance. The C++ json-c test uses 1.6G, has an energy rating of 36, and is shown higher than the Haskell test, which uses only 9.58M and also has an energy rating of 36.

Profiling with the original OT shows this at the top:

total executions of each stack trace:
Entry: 1/148 Calls: 271/1642 = 16.50% [sum: 271; 271/1642 = 16.50%]
parsejson.nim: parseNumber 288/1642 = 17.54%
parsejson.nim: getTok 855/1642 = 52.07%
parsejson.nim: eat 454/1642 = 27.65%
json.nim: parseJson 1454/1642 = 88.55%

The first time the table module shows up is here:

Entry: 18/148 Calls: 18/1642 = 1.10% [sum: 1051; 1051/1642 = 64.01%]
refs_v2.nim: nimDecRefIsLast 144/1642 = 8.77%
tables.nim: rawInsert 25/1642 = 1.52%
tables.nim: []= 141/1642 = 8.59%
json.nim: []= 141/1642 = 8.59%
json.nim: parseJson 1454/1642 = 88.55%

Test results with different tables:

  • existing OrderedTable

s:orig jim$ /usr/bin/time -l ./test
(x: 0.5004211581104818, y: 0.4996713815680409, z: 0.500270481798719)
3.05 real 2.53 user 0.50 sys
1341800448 maximum resident set size

  • new OrderedTable

ms:orig jim$ /usr/bin/time -l ./test
(x: 0.5004211581104818, y: 0.4996713815680409, z: 0.500270481798719)
3.15 real 2.58 user 0.56 sys
1480757248 maximum resident set size

  • new OrderedTable
  • int32 hash code and index (max 2B entries)

ms:json jim$ /usr/bin/time -l ./test
(x: 0.5004211581104818, y: 0.4996713815680409, z: 0.500270481798719)
2.66 real 2.31 user 0.34 sys
875466752 maximum resident set size

  • new OrderedTable
  • int8 hash code and index (max 128 entries)

ms:json jim$ /usr/bin/time -l ./test
(x: 0.5004211581104818, y: 0.4996713815680409, z: 0.500270481798719)
2.60 real 2.28 user 0.31 sys
787873792 maximum resident set size

ms:oltab jim$ /usr/bin/time -l ./test
(x: 0.5004211581104818, y: 0.4996713815680409, z: 0.500270481798719)
2.88 real 2.47 user 0.40 sys
1007480832 maximum resident set size

Profiling with the int32 hash code and index, the first mention of tables shows:

Entry: 19/151 Calls: 19/1593 = 1.19% [sum: 1035; 1035/1593 = 64.97%]
hashes.nim: murmurHash 49/1593 = 3.08%
hashes.nim: hash 68/1593 = 4.27%
tables.nim: rawGet 120/1593 = 7.53%
tables.nim: []= 164/1593 = 10.30%
json.nim: []= 164/1593 = 10.30%
json.nim: parseJson 1414/1593 = 88.76%

No idea why the tests I ran use more memory than the tests they published, unless it's a platform thing.

At least for this benchmark, a better ranking for Nim is going to need faster parsing (89% of time), and the table code isn't much of a factor.

@hashbackup
Copy link
Author

hashbackup commented Jul 20, 2020

The reason the first 2 tests are using more memory than posted on the benchmark site is because of the recent rightSize change. json.nim is creating tables with 4, which is getting modified to 4*3/2 + 4 = 10 -> 16. This is sort of a special case because the tables are so tiny - 4 entries each, so there are 12 entries wasted, ie, 75%. I don't understand the +4 part, except if 1 is passed for a table size, 1*3/2 would be 1, which isn't big enough to insert 1 item (need a vacant slot). So I could understand + 1 there. That also would have created 8-slot tables vs 16.

Changing json.nim to pass 2 instead of 4 gives 2*3/2 + 4 = 7 -> 8, so only 50% wasted (and 1 vacant slot is always necessary for search misses). Somebody might want to change that in json.nim, or change the +4 to something lower in hashcommon.nim

@c-blake
Copy link
Contributor

c-blake commented Jul 20, 2020

NOTE: if anyone changes that new slotsNeeded to be more tiny table friendly, be sure to check it is still the proper kind of inverse-mustRehash.

@hashbackup
Copy link
Author

hashbackup commented Jul 22, 2020

An easy way to get smaller (but slower) ordered tables is to use a higher load factor. There's no way to do that today, but an option loadFactor could be added to initOrderedTable and others. Here are some figures with the earlier 8M test and OrderedTable with the added back link:

Type Items Time MB
OrderedTable LF=66% 8M 1.96 672
OrderedTable LF=96% 3.04 336
OrderedTable LF=96% int32 links 3.17 269
LruCache 3.42 793
Compact LF=66% 2.74 396
Compact LF=96% 7.14 367
OLtab LF=66% 2.7 517
OLtab LF=96% 6.14 416
OLtab LF=96% robinHood=true 4.64 416

Edit: add robinHood=true time and noting that there are no misses in this test. I'll try to look into the space issue. Not sure how to do it inside Nim.

@c-blake
Copy link
Contributor

c-blake commented Jul 22, 2020

You probably want to pass robinHood=true to the initOLTab call if you are also passing a numer/denom targeted at 96%. (Separate times for hit & miss searches are also informative since they tend to be quite different.)

@c-blake
Copy link
Contributor

c-blake commented Jul 22, 2020

Also, there are remaining optimizations that can be done in OLTab both in space, via my sequint.nim module, and time via saving 7 bits of hash code side-by-side with the index.

That said, I'm also not sure why it would be using as much space as it is in your results table compared to other tables. The space is in a pair of seqs rather than one seq with 8B bigger elements, but otherwise it should be less space by about 4B * len(the hash table part). Could be memory allocator padding. Might be useful to use Nim's internal accounting of space used here if there is one separate from total allocation from the OS...

@hashbackup
Copy link
Author

hashbackup commented Jul 23, 2020

I took a look at Compactdict today. Didn't realize how simple it is. But that also causes problems with entries not being reused. If the "populate table, delete all items" test is looped a few times, it looks like this for Compactdict vs OrderedTable (with --gc:arc):

ms:work1 jim$ /usr/bin/time -l ./comptable2
len = 8000000, maxmem=465354752, seconds to create table: 1.622628
Seconds to delete table: 1.112567
len = 8000000, maxmem=658292736, seconds to create table: 2.278949
Seconds to delete table: 1.014376
len = 8000000, maxmem=748470272, seconds to create table: 2.094339
Seconds to delete table: 1.009979999999999
len = 8000000, maxmem=748470272, seconds to create table: 2.053436000000001
Seconds to delete table: 1.013033
len = 8000000, maxmem=748474368, seconds to create table: 2.063143
Seconds to delete table: 1.013413
       15.37 real        15.08 user         0.28 sys
 746242048  maximum resident set size


ms:work1 jim$ /usr/bin/time -l ./ordtable2
len = 8000000, maxmem=688394240, seconds to create table: 0.57785
Seconds to delete table: 0.9042819999999999
len = 0
len = 8000000, maxmem=688394240, seconds to create table: 0.5671719999999998
Seconds to delete table: 0.9041450000000002
len = 0
len = 8000000, maxmem=688394240, seconds to create table: 0.5663990000000001
Seconds to delete table: 0.9038050000000002
len = 0
len = 8000000, maxmem=688394240, seconds to create table: 0.5664249999999997
Seconds to delete table: 0.9050409999999998
len = 0
len = 8000000, maxmem=688394240, seconds to create table: 0.5659830000000001
Seconds to delete table: 0.9118060000000003
len = 0
        7.71 real         7.49 user         0.21 sys
 671670272  maximum resident set size

It's even worse for Compactdict if only half of the items are deleted: 2x slower and uses 66% more memory. For OrderedTable, it's faster with no memory increase:

ms:work1 jim$ /usr/bin/time -l ./comptable3
len = 8000000, maxmem=465354752, seconds to create table: 1.470346
Seconds to delete table: 0.4403750000000002
len = 8000000, maxmem=824299520, seconds to create table: 2.663436
Seconds to delete table: 0.7054840000000002
len = 8000000, maxmem=954322944, seconds to create table: 1.673875
Seconds to delete table: 1.253536
len = 8000000, maxmem=954322944, seconds to create table: 1.870457
Seconds to delete table: 1.38885
len = 8000000, maxmem=1151455232, seconds to create table: 2.505291999999999
Seconds to delete table: 1.751953
       15.88 real        15.46 user         0.40 sys
1115672576  maximum resident set size


ms:work1 jim$ /usr/bin/time -l ./ordtable3
len = 8000000, maxmem=688394240, seconds to create table: 0.575
Seconds to delete table: 0.4436239999999999
len = 4000000
len = 8000000, maxmem=688394240, seconds to create table: 0.5042720000000001
Seconds to delete table: 0.4963829999999998
len = 4000000
len = 8000000, maxmem=688394240, seconds to create table: 0.545007
Seconds to delete table: 0.4962599999999999
len = 4000000
len = 8000000, maxmem=688394240, seconds to create table: 0.5445980000000001
Seconds to delete table: 0.5002570000000004
len = 4000000
len = 8000000, maxmem=688394240, seconds to create table: 0.547193
Seconds to delete table: 0.4711119999999998
len = 4000000
        5.47 real         5.24 user         0.22 sys
 671690752  maximum resident set size

OLTab scales well on these tests. First is populating table and deleting all items 5x, 2nd is only deleting half of the items, also 5x:

ms:nx jim$ /usr/bin/time -l ./oltable2
initsize = 8388608
resize!
resize!
len = 8000000, maxmem=524816384, seconds to create table: 1.402532
Seconds to delete table: 1.213329
len = 0 cap = 16777216
len = 8000000, maxmem=524816384, seconds to create table: 0.7864359999999997
Seconds to delete table: 1.208817
len = 0 cap = 16777216
len = 8000000, maxmem=524816384, seconds to create table: 0.7875629999999996
Seconds to delete table: 1.209598000000001
len = 0 cap = 16777216
len = 8000000, maxmem=524816384, seconds to create table: 0.7289789999999998
Seconds to delete table: 1.204859
len = 0 cap = 16777216
len = 8000000, maxmem=524816384, seconds to create table: 0.7859240000000014
Seconds to delete table: 1.158434
len = 0 cap = 16777216
       10.62 real        10.41 user         0.19 sys
 516493312  maximum resident set size


ms:nx jim$ /usr/bin/time -l ./oltable3
initsize = 8388608
resize!
resize!
len = 8000000, maxmem=524816384, seconds to create table: 1.370501
Seconds to delete table: 0.6712990000000003
len = 4000000 cap = 16777216
len = 8000000, maxmem=524816384, seconds to create table: 0.9627829999999999
Seconds to delete table: 0.682404
len = 4000000 cap = 16777216
len = 8000000, maxmem=524816384, seconds to create table: 0.9624570000000001
Seconds to delete table: 0.6837550000000006
len = 4000000 cap = 16777216
len = 8000000, maxmem=524816384, seconds to create table: 0.9629490000000001
Seconds to delete table: 0.7126869999999998
len = 4000000 cap = 16777216
len = 8000000, maxmem=524816384, seconds to create table: 1.074509
Seconds to delete table: 0.7521380000000004
len = 4000000 cap = 16777216
        8.96 real         8.77 user         0.17 sys
 516505600  maximum resident set size

We're still trying to figure out why OLTab is using more memory than it seems like it should.

@hashbackup
Copy link
Author

It turns out that adding -d:useMalloc makes a lot of these tests use less memory, include OLTab, which goes down by about half. Compactdict uses less too for the 5-loop test deleting half the table, like 8xxMB instead of 1.1GB. And with -d:useMalloc, there are differences between platforms because they use different system mallocs.

I think some of these numbers are useful to understand relative behavior, but wouldn't count on any of them in an absolute sense without re-running tests with -d:useMalloc (and --gc:arc).

@hashbackup
Copy link
Author

CountTable has the same delete problem as OrderedTable, where it deletes an item by rebuilding the table. Anytime a key's count is set to 0, it is considered a delete and causes a table rebuild.

Here's a test of 1M items with current code. It had to be killed after about a minute:

ms:nx jim$ /usr/bin/time -l ./bigtable
Seconds to create 1M item table: 0.09395299999999999
Seconds to iterate whole table: 0.002224000000000004 sum 499999500000
^CSIGINT: Interrupted by Ctrl-C.
       56.14 real        46.52 user         9.61 sys
  67657728  maximum resident set size

Here's the same test with remove() modified to zero a key's count if it is non-zero using the backshift algorithm in Tables and OrderedTables:

ms:work1 jim$ /usr/bin/time -l ./bigtable
Seconds to create 1M item table: 0.07650999999999999 len 999999
Seconds to iterate whole table: 0.002146000000000009 sum 499999500000
Seconds to delete 99% of table: 0.07521600000000001 len 9999
Seconds to iterate 1% of table: 0.002167999999999976 ideal is 2.146000000000009e-05 sum 4999500000

Seconds to create 2M item table: 0.155319 len 1999999
Seconds to iterate whole table: 0.004138000000000031 sum 1999999000000
Seconds to delete 99% of table: 0.158007 len 19999
Seconds to iterate 1% of table: 0.004251999999999978 ideal is 4.138000000000031e-05 sum 19999000000

Seconds to create 4M item table: 0.328422 len 3999999
Seconds to iterate whole table: 0.00802500000000006 sum 7999998000000
Seconds to delete 99% of table: 0.3280680000000001 len 39999
Seconds to iterate 1% of table: 0.007995999999999892 ideal is 8.02500000000006e-05 sum 79998000000

Seconds to create 8M item table: 0.665389 len 7999999
Seconds to iterate whole table: 0.01601000000000008 sum 31999996000000
Seconds to delete 99% of table: 0.6669400000000001 len 79999
Seconds to iterate 1% of table: 0.01594700000000016 ideal is 0.0001601000000000008 sum 319996000000

        2.57 real         2.36 user         0.19 sys
 369668096  maximum resident set size

The new remove() is (firstTry can be replaced by the old code):

proc remove[A](t: var CountTable[A], key: A) =
  var i = rawGet(t, key)
  if i < 0: return
  dec(t.counter)
  var j = i
  block outer:         # KnuthV3 Algo6.4R adapted for i=i+1 instead of i=i-1
    while true:        # The correctness of this depends on (h+1) in nextTry,
      while true:      # though may be adaptable to other simple sequences.
        i = nextTry(i, t)                 # increment mod table size
        if t.data[i].val == 0:            # end of collision cluster; So all done
          break outer
        let r = firstTry(hash(t.data[i].key), t)  # "home" location of key@i
        if not ((i >= r and r > j) or (r > j and j > i) or (j > i and i >= r)):
          break
      when defined(js):
        t.data[j] = t.data[i]
      else:
        t.data[j] = move(t.data[i]) # data[i] will be overwritten or marked empty
      itemMoved(t, j)
      j = i
  t.data[j].key = default(typeof(t.data[j].key))
  t.data[j].val = default(typeof(t.data[j].val))

@c-blake
Copy link
Contributor

c-blake commented Jul 27, 2020

While one can nitpick about double link requirements in OrderedTable, I see no reason not to just use the regular backshift delete algo in CountTable. No idea how often it is needed.

Since maybe concrete examples may be helpful, one application area might be a histogram over a moving window of data. This is like a moving average, but where you retain the whole distribution as some datum leaves the window and another enters. Moving windows are helpful in the world when dealing with non-stationary statistical processes since they have well-defined finite "memory". Now, any operation on the whole distribution would also be O(n) on the CountTable. So, if such were done once per window, this delete improvement would be "only" a 2x speed-up on the entire "update-report" operation. 2x with no downside alone seems worthwhile, but it could be much more than a 2x speed-up. Some loop over the data could be just "reserving the right" to do a whole-distribution thing without actually doing it for every single data point, doing things in some "controlled thinning of data" way.

One might say, people with this application area can use Table.mgetOrPut and inc or dec to get what they need. A little proc taking a var count and a handle to the Table could even be used to optimize the decrement-and/or-delete operation to just 1 hash lookup unless decrement takes you to delete, in which case 2. So, users with a need like the above paragraph are not completely out of luck with the stdlib.

That said, to the extent we have a CountTable in the stdlib, I see no reason why this one operation should be unnecessarily very slow, forcing users into this more awkward regular Table solution. Just documenting CountTable.del as O(n) as we do now without mentioning the perhaps non-obvious-in-context Table solution might also make such users feel that they had no stdlib solution at all. Meanwhile, documenting it by saying "if you need del efficiency use Table" just sounds lame/lazy, and that has poor project optics. So, I think the best way out is just fixing CountTable.del along the lines @hashbackup mentions with a backshift delete algo. Coding-wise, not sure if here is a way to re-org/re-use the same actual code, but that seems more nice-to-have than necessary.

@Araq
Copy link
Member

Araq commented Jul 27, 2020

IMHO CountTable.del is a victim of the "silly consistency axiom". A CountTable is for counting items. Want to delete an item? Use something else instead, that's not covered by "counting". Want to set an item to -100 of its current value? That's not counting either.

CountTable.del exists for "consistency" with Table.del but at this point "consistency" became a shallow argument in favor of everything. But ymmv.

@c-blake
Copy link
Contributor

c-blake commented Jul 27, 2020

In English NounTable is probably more common than VerbTable. So, I always read that as a "table of counts". Decrementing a count always seemed as appropriate to provide, though admittedly less common than incrementing.

However, even taken as a verb, "counting down" happens (in Nim, even!) as well as "counting up" and even has first-class mention in your iterator countup|countdown.

Your -100 also feels wrong. Sometimes you count up/down are somethingElse.lens, for example. The oldest proc inc(TCountTable) I can find took a val = 1, but using your strict ideas about "counting", "counting up by val" is also not "counting". So, it would seem even your own first conception of counting was more permissive than your present idea.

So, I don't know why you think one should only count up and only count by 1. It is certainly not directly implied by the name and more restrictive than other uses of "countFoo" in Nim. I don't know German. Maybe there is some kind of lost in translation thing happening.

Once you can count down, delete becomes a natural end-state thing, not weird. It's an open addressed, linear probed hash table. So, delete like usual for such seems the right thing to do, and it seems like @hashbackup is offering. Or deprecating both OrderedTable.del|pop and CountTable.del|pop. The latter might be pre-1.0 thinking, but that didn't save proc add. ;-) Retaining slow O(n) ops when there is no compensating "another op is smaller/faster" argument seems the worst of both worlds - both user-unfriendly and bad marketing, efficiency-wise, and in a high profile module like tables. I would say if you are not going to deprecate then we should encourage @hashbackup to do a PR for CountTable, as well as relaxing the Positive constraint on inc and maybe even providing dec. It's conceivable this should be an RFC since there seems to be some semantic disagreement.

@hashbackup
Copy link
Author

hashbackup commented Jul 27, 2020

I think having a very narrow definition of what counting is, is fine, and if del is not part of that, then it should be deprecated rather than have its current bizarre (to me at least) behavior.

An important related point is that CountTable allows setting a counter to a specific value. I don't know if that's inside your definition of counting or not. If it is not, then that also should be deprecated, because when a counter is set to 0, that forces either a) a table rebuild like today, or b) a backshift. If the counter value is simply set to 0, it breaks future searches for any collisions that follow it. I know, because I naively tried it. :-)

I don't think tables need to all have the same operations. It's nice, but not necessary. But whatever operations are provided, should be performant. Isn't that Nim's #1 priority? What impression do you think it leaves a new user about Nim if they see documented functions that, when executed, give crazy performance profiles that no other language (that I've ever seen) has?

I won't be doing a PR for any of this. I'm over the arguing / justifying / defending it. It's interesting for me to work on and I'm glad to contribute the code, but I won't go through the PR process with you guys. Too much stress / hassle. Sorry, it gets a -1 from me. :-)

@c-blake
Copy link
Contributor

c-blake commented Jul 27, 2020

If it's just a matter of who does it, I can do a CountTable backshift delete PR. @hashbackup is right that if we don't do it, more than what I mentioned should probably be deprecated. It's a bit of work, though. So, if it will be outright rejected on semantics then it doesn't make sense to do it.

@Araq
Copy link
Member

Araq commented Jul 28, 2020

If it's just a matter of who does it, I can do a CountTable backshift delete PR

Oh yes please. :-)

@hashbackup
Copy link
Author

Here's the test program I've been using, if it's helpful:

when defined(compact):
  import compactdict
when defined(lru):
  import lrucache
when defined(oltab):
  import adix/adix/oltab
else:
  import tables
import times


proc runtest(els: int) =

  when defined(table):
    var ot = initTable[int, int](els)
  when defined(ordered):
    var ot = initOrderedTable[int, int](els)
  when defined(count):
    var ot = initCountTable[int](els)
  when defined(lru):
    var ot = newLruCache[int, int](els)
  when defined(compact):
    var ot = initDict[int, int](els)
  when defined(oltab):
    var ot = initOLtab[int, int](els)

  var t0 = cpuTime()
  for i in 0 ..< els:
    ot[i] = i
  echo "Seconds to create ", els div 1_000_000, "M item table: ", cpuTime() - t0, " len ", len(ot)

  var twhole = cpuTime()
  var sum = 0
  for k, v in ot.pairs:
    sum += v
  twhole = cpuTime() - twhole
  echo "Seconds to iterate whole table: ", twhole, " sum ", sum

  t0 = cpuTime()
  for i in 0 ..< els:
    if i mod 100 != 0: ot.del(i)
  echo "Seconds to delete 99% of table: ", cpuTime() - t0, " len ", len(ot)

  sum = 0
  var t1 = cpuTime()
  for k, v in ot.pairs:
    sum += v
  t1 = cpuTime() - t1
  echo "Seconds to iterate 1% of table: ", t1, " ideal is ", twhole/100, " sum ", sum
  echo ""


for els in @[1_000_000, 2_000_000, 4_000_000, 8_000_000]:
  runtest(els)

c-blake added a commit to c-blake/Nim that referenced this pull request Jul 28, 2020
request.  This can be conceived as an alternate, more capable resolution of
  nim-lang#12200
than
  nim-lang#12208

The code re-org idea here is to upgrade tablimpl.nim:`delImpl`/`delImplIdx`
to abstract client code conventions for cell emptiness & cell hashing via
three new template arguments - `makeEmpty`, `cellEmpty`, `cellHash` which
all take a single integer argument and clear a cell, test if clear or
produce the hash of the key stored at that index in `.data[]`.

Then we update the 3 call sites (`Table`, `CountTable`, `SharedTable`) of
`delImpl`/`delImplIdx` by defining define those arguments just before the
first invocation as non-exported templates.

Because `CountTable` does not save hash() outputs as `.hcode`, it needs a
new tableimpl.nim:`delImplNoHCode` which simply in-lines the hash search
when no `.hcode` field is available for "prefix compare" acceleration.
It is conceivable this new template could be used by future variants, such
as one optimized for integer keys where `hash()` and `==` are fast and
`.hcode` is both wasted space & time (though a small change to interfaces
there for a sentinel key meaning "empty" is needed for maximum efficiency).

We also eliminate the old O(n) `proc remove(CountTable...)` in favor of
simply invoking the new `delImpl*` templates and take care to correctly
handle the case where `val` is either zero for non-existent keys in `inc`
or evolves to zero over time in `[]=` or `inc`.

The only user-visible changes from the +-42 delta here are speed, iteration
order post deletes, and relaxing the `Positive` constraint on `val` in
`proc inc` again, as indicated in the `changelog.md` entry.
Araq pushed a commit that referenced this pull request Jul 28, 2020
request.  This can be conceived as an alternate, more capable resolution of
  #12200
than
  #12208

The code re-org idea here is to upgrade tablimpl.nim:`delImpl`/`delImplIdx`
to abstract client code conventions for cell emptiness & cell hashing via
three new template arguments - `makeEmpty`, `cellEmpty`, `cellHash` which
all take a single integer argument and clear a cell, test if clear or
produce the hash of the key stored at that index in `.data[]`.

Then we update the 3 call sites (`Table`, `CountTable`, `SharedTable`) of
`delImpl`/`delImplIdx` by defining define those arguments just before the
first invocation as non-exported templates.

Because `CountTable` does not save hash() outputs as `.hcode`, it needs a
new tableimpl.nim:`delImplNoHCode` which simply in-lines the hash search
when no `.hcode` field is available for "prefix compare" acceleration.
It is conceivable this new template could be used by future variants, such
as one optimized for integer keys where `hash()` and `==` are fast and
`.hcode` is both wasted space & time (though a small change to interfaces
there for a sentinel key meaning "empty" is needed for maximum efficiency).

We also eliminate the old O(n) `proc remove(CountTable...)` in favor of
simply invoking the new `delImpl*` templates and take care to correctly
handle the case where `val` is either zero for non-existent keys in `inc`
or evolves to zero over time in `[]=` or `inc`.

The only user-visible changes from the +-42 delta here are speed, iteration
order post deletes, and relaxing the `Positive` constraint on `val` in
`proc inc` again, as indicated in the `changelog.md` entry.
narimiran pushed a commit that referenced this pull request Jul 29, 2020
request.  This can be conceived as an alternate, more capable resolution of
  #12200
than
  #12208

The code re-org idea here is to upgrade tablimpl.nim:`delImpl`/`delImplIdx`
to abstract client code conventions for cell emptiness & cell hashing via
three new template arguments - `makeEmpty`, `cellEmpty`, `cellHash` which
all take a single integer argument and clear a cell, test if clear or
produce the hash of the key stored at that index in `.data[]`.

Then we update the 3 call sites (`Table`, `CountTable`, `SharedTable`) of
`delImpl`/`delImplIdx` by defining define those arguments just before the
first invocation as non-exported templates.

Because `CountTable` does not save hash() outputs as `.hcode`, it needs a
new tableimpl.nim:`delImplNoHCode` which simply in-lines the hash search
when no `.hcode` field is available for "prefix compare" acceleration.
It is conceivable this new template could be used by future variants, such
as one optimized for integer keys where `hash()` and `==` are fast and
`.hcode` is both wasted space & time (though a small change to interfaces
there for a sentinel key meaning "empty" is needed for maximum efficiency).

We also eliminate the old O(n) `proc remove(CountTable...)` in favor of
simply invoking the new `delImpl*` templates and take care to correctly
handle the case where `val` is either zero for non-existent keys in `inc`
or evolves to zero over time in `[]=` or `inc`.

The only user-visible changes from the +-42 delta here are speed, iteration
order post deletes, and relaxing the `Positive` constraint on `val` in
`proc inc` again, as indicated in the `changelog.md` entry.

(cherry picked from commit b2a1944)
@hashbackup hashbackup deleted the hashbackup-orderedtable-del branch August 3, 2020 04:35
clrpackages pushed a commit to clearlinux-pkgs/nim that referenced this pull request Oct 6, 2020
3n-k1 (1):
      [backport] Fix style issues in lib/, tools/, and testament/. Fixes #12687. (#12754)

Alex Mitchell (1):
      Update events.nim (#12803)

Alexander Ivanov (2):
      Fixes semCustomPragma when nkSym (#12414) [backport]
      sourcemaps for the JS codegen (#7508)

Andrea Ferretti (1):
      Fix #13573 and #13574 (#13575)

Andreas Rumpf (165):
      fixes the --verbosity:2 regression [backport]
      updated the contributing.rst guidelines
      fixes #12294 [backport]
      fixes #12281 [backport]
      fixes #12264 [backport] (#12302)
      fixes #12240 [backport] (#12308)
      fixes #12336 [backport]
      fixes #12291 [backport] (#12338)
      minor optimization for asynchttpserver.nim
      use system.move instead of system.shallowCopy if the GC mode requires it
      VM: no special casing for big endian machines; refs #9690 [backport] (#12364)
      render typeof as typeof
      fixes #12323 [backport]
      fixes #12315 [backport]; refs #12314 (#12385)
      fixes #12366 [backport] (#12393)
      fixes a koch regression that made 'koch boot --listcmd' not work anymore [backport] (#12400)
      minor improvements for htmlgen.nim
      [backport] add back a check that got accidentically removed; fixes #12379 (#12444)
      Revert "Fixes #12187 (#12321)" (#12447)
      fixes #12420 [backport] (#12456)
      fixes #12310 [backport] (#12470)
      VM: fixes most ran-out-registers problems [backport] (#12485)
      fixes #12491 [backport]
      VM: fixes register leaks [backport] (#12510)
      minor improvements
      development version should be 1.1.0 so that version checking can work properly
      fixes #12502
      some progress on bug #12443
      proof that refcounting can handle Nim's async (#12533)
      [backport] fix #12528, fix #12525: incorrect generic type resolution for default values (#12538)
      --gc:destructors now means Nim uses pure refcounting (#12557)
      better testing for nimcrypto; re-enable chronos testing (#12560)
      improve codegen quality for --gc:destructors
      make renderIds work again
      --gc:destructors: simple closures work
      fixes #12577 [backport] (#12584)
      newruntime: only check for dangling refs when 'owned ref T' support is enabled
      --os:ios needs to imply defined(macosx) [backport] (#12585)
      implement the --useVersion emulation feature
      remove deprecated procs (#12535)
      error message: Nim calls it 'proc'
      osproc needs 'import linux' for -d:useClone
      pragmas.nim: tiny code formatting
      bugfix that enables the 'since' template [backport]
      added 'since' template for further stdlib additions
      make parsexml compatible with --gc:destructors/newruntime
      --gc:destructors improvements (#12626)
      .cursor implementation (#12637)
      fixes #12644
      make tests green again
      ARC: solves phase ordering problems (#12654)
      ARC: fixes leaking new() statement (#12665)
      fixes and changes the recently introduced 'alignas' to be 'align' (#12666)
      attempt to add valgrind support to the CIs and testament (#12646)
      ARC: closure bugfixes (#12677)
      fixes #12612 [backport] (#12681)
      more arc improvements (#12690)
      conversions to unsigned numbers are not checked anymore; implements /… (#12688) [backport]
      fixes #12670 [backport] (#12693)
      added the --asm command line option for inspection of the produced assember code (#12699)
      implemented a new localPassc pragma (#12706)
      fixes #11863   multipart data need $ (#12707)
      more fixes for --cpu:avr [backport] (#12748)
      VM: improvements for var T/addr (#12667); fixes #12489
      better support for PROGMEM like annotations for lets/vars; fixes #12216 (#12799)
      ARC related bugfixes and refactorings (#12781)
      feature dracula themed doc (#12816)
      completes #12799, fixes #12216 (#12870)
      ARC: yet another bugfix (#12871)
      ARC: fixes cycle detection and move the .cursor attribute into closures (#12872)
      fixes #12148 [backport] (#12888)
      fixes #12874 (#12890)
      fixes #12885 [backport] (#12895)
      ARC: cycle detector (#12823)
      fixes #12899 (#12921)
      minor refactorings
      fixes #12965 (#12991)
      --exception:goto switch for deterministic exception handling (#12977)
      fixes #12978 (#13012)
      fixes #12961 (#13019)
      fixes #12956 (#13020)
      fixes #12964 (#13027)
      take the one good idea from --os:standalone and enable it via -d:StandaloneHeapSize (#13077)
      fixes an asyncftpclient bug; refs #13096 [backport]
      more arc features (#13098)
      fixes #13122 (#13126)
      fixes #13112 (#13127)
      fixes #13119 (#13128)
      fixes #13105 (#13138)
      fixes #10665 (#13141) [backport]
      fixes #13104 [backport] (#13142)
      fixes #9674 [backport] (#13143)
      ARC: misc bugfixes (#13156)
      ARC works for async on Windows (#13179)
      fixes #13110 (#13197)
      fixes a critical times.nim bug reported on IRC [backport] (#13216)
      make goto based exceptions available for 'nim cpp' (#13244)
      fixes #13219 (#13272)
      TlSF Alloctor: use less memory for --gc:arc (#13280)
      make monotimes have zero overhead if you don't use it (#13338) [backport]
      fixes #13269 (#13344)
      fixes #13314 (#13372)
      fixes #13378 [backport] (#13392)
      Revert "remove dead code test_nimhcr_integration.(bat,sh) (#13388)" (#13396)
      fixes #13457 (#13458)
      added operateOn to sugar.nim to give Nim the chaining mechanism it de… (#13092)
      std/compilesettings implementation (#13584)
      sink parameter inference for types that have destructors (#13544)
      fix #13579 joinPath("/foo/", "../a") is now /a (#13586)
      fixes #5170 (#13589)
      Removed simpleGetOrDefault (#13590)
      fixes #13605 (#13611)
      fixes #13596 (#13612)
      fixes #13599 (#13614)
      fixes #13436 (#13615)
      catchable defects (#13626)
      fixes #13661 (#13664) [backport]
      fixes #13654
      updated builds.sr.ht script according to their email (#13669)
      rewritten goto based exception handling; much cleaner implementation;… (#13677)
      fixes #13671 [backport] (#13678)
      fixes #13622 (#13679)
      new feature: --staticBoundChecks:on to enforce static array index checking (#10965)
      arc optimizations (#13325)
      enable --tlsEmulation:on for --gc:arc (#13685)
      gc.rst that doesn't lie (#13686)
      added a switch -d:nimEmulateOverflowChecks for broken or old GCC versions (#13692)
      fixes #13691 (#13694)
      cycle breaker (#13593)
      fixes #13698 (#13706)
      Revert "fix #13417 (#13712)" (#13728)
      fixes #13722 (#13729)
      fixes #13763 (#13777)
      '.push raises: []' now also affects proc types (#13776)
      macros for proc types, macros for types (#13778)
      DrNim (Nim compiler with Z3 integration) (#13743)
      revert stdlib changes which are not required anymore
      fixes #13782 (#13834)
      renamed new std/pragmas.nim to std/byaddr.nim (#13844)
      make bootstrapping more robust for people who have Nim inside /usr/bin (#13855)
      fixes #14052 [backport:1.2] (#14055)
      fixes #14079 [backport:1.2] (#14163)
      fixes #14054 [backport:1.2] (#14061)
      fixes #13986 [backport:1.2] (#14173)
      fixes #13698 [backport:1.2] (#14175)
      arc: do not unload globals when building a library [backport:1.2] (#14180)
      destructors: don't produce stupid code for 'cast' (#14208) [backport:1.2]
      fixes #14209 [backport:1.2] (#14213)
      fixes #13104 [backport]
      fixes #13998 [backport:1.2]
      fixes #14126 [backport:1.2] (#14390)
      specialize genericReset (#14398)
      manual.rst: updates [backport] (#14445)
      fixes #14495 [backport:1.2] (#14496)
      fixes #14498 [backport:1.2] (#14503)
      warn about observerable stores but don't prevent them for 1.2.2 [backport:1.2]; refs https://github.com/nim-lang/RFCs/issues/230 (#14510)
      fixes #14514 [backport:1.2] (#14533)
      more precise analysis about 'observable stores' [backport:1.2] (#14582)
      optimized wrapWords; fixes #14579 (#14606) [backport:1.2]
      fixes #14458 [backport:1.2] (#14756)
      fixes #14240 [backport:1.2] (#14757)
      enforce browsers.nim only handles URLs [backport] (#15045)
      fixes #15044 [backport:1.2]
      fixes #15038 [backport:1.2]
      fixes #14616 [backport:1.2] (#15109)

Andrew Owen (1):
      [backport] Fix typo in docs (#12356) [ci skip]

Andrew Smith (1):
      Updated the code example in the os module to use better grammar. (#12328)

Andrey Makarov (3):
      fix nimgrep color on posix #7591 (#12288)
      nimgrep improvements (#12779)
      fix 3 minor bugs in joinPath (see #13455) (#13462) [backport]

Andrii Riabushenko (5):
      fixes #12989
      Revert "fixes #12989"
      fixes #13195
      revert last commit
      Revert "fixes #13195"

Andy Davidoff (11):
      tweaked for clarity after editing to fix a typo (#12473)
      export nim.cfg parser (#12602)
      add --clearNimblePath; fixes #12601 (#12609)
      restore --define:key:val in nim.cfg and fix #12367 (#12611)
      replace some runtime repr in stdlib for gc:arc (#12716)
      add a StringTable.clear that requires no mode specification (#12853)
      fixes disruptek/nimph#102 multi-level nim.cfg use (#13001) [backport]
      fix crash due to errant symbols in nim.cfg (#13073) [backport]
      surgical fix for #13319 (#13604)
      fix .deprecated. object typedef crash (#13643)
      add error for missing commandLineParams (#13719)

Anthon van der Neut (1):
      [backport] fix broken link to non-existing c2nim manual html, fixes #12537 [ci skip] (#12544)

Antonis (2):
      fix closure env check
      better error message

Araq (99):
      fixes #12279 [backport]
      fixes #12298
      different fix for #12279 [backport]
      JS: gensym is stricter for 'this'; refs #12246 [backport]
      fixes #12244 [backport]
      refactoring: --newruntime consists of 3 different switches
      refactoring: use the new strings and seqs when optSeqDestructors is active
      first implementation of the new --seqsv2 switch
      ast.nim: slightly better documentation
      fixes a regression that caused that Nim devel cannot compile 1.0 anymore
      fixes a regression that caused that Nim devel cannot compile 1.0 anymore
      destructors.rst: added a missing 'var' to the motivating example
      fixes #12547 [backport]
      expr -> untyped
      async: use $ and not repr in debug mode
      inhibit silly warning about moving closure environments for performance
      --gc:destructors: bugfixes
      async: cleaner solution that avoids GC_ref on strings which doesn't exist for --gc:arc
      gc:arc: support GC_ref/unref for ref T
      ARC: use the new .cursor annotation for 'up' pointers
      ARC: handle closures like tuples consistently
      ARC: closure inside object constructor now works
      thavlak.nim test: improved the code style
      more thavlak.nim improvements
      more thavlak.nim improvements
      thavlak.nim: more idiomatic code
      ARC: yet another silly bugfix
      ARC: another critical bugfix; temporary tuples we introduce for tuple unpackaging are not owning the data
      ARC: ported the GC tests over to --gc:arc
      test suite: rename tests containing 'fail' for easier search in logs
      fixes a flaky test for the realtime GC
      ARC: implemented a simple cycle detector
      fixes #12488 [backport]
      fixes #11727 [backport]
      fixes #12766
      fixes #12669
      fixes #12798 [backport]
      docs: tiny style improvements
      added guidelines for evolving Nim's stdlib
      fixes a bug that kept sugar.collect from working with for loop macros [backport]
      fixes #12826
      fixes a regression
      a better bugfix
      fixes a test case
      fixes a silly regression
      fixes the distros.nim regression
      ported channels to ARC
      ported osproc.nim to ARC
      ported re.nim to ARC
      ARC: default to a shared heap with --threads:on
      osproc: fixes regression
      fixes another regression
      fixes #13032
      reprjs: style changes
      fixes #12996
      fixes #13072; no test case because it will be added later with more exception handling related bugfixes
      fixes #13070
      fixes #13157
      ARC: remove unnecessary code
      ARC: optimize complete object constructors to use nimNewObjUninit
      make nre compile with --gc:arc
      contributing.rst: Add a special rule for 'outplace'-like features
      fixes #13444
      ARC hotfix; proper destruction of seqs and strings after a move
      hotfix: make --useVersion:1.0 work
      fixes #13607
      fixes #12757
      fixes #13519
      fixes #13240
      fixes async regression
      disable chronos testing for now
      disable nimgame2 for now
      minor code style changes
      minor code style change
      fixes #13646
      fixes #13645
      rename sfAlwaysReturn to sfNeverRaises
      fixes a bug for 'dup' and 'with'; they can now handle nested statement lists that can result from macros
      fixes hash(HashSet) which was wrong as it didn't respect tombstones; refs #13649
      removed .gitattributes as it only causes trouble for me
      make 'nim check' more robust for illdefined constants
      fight the code bloat in base64.nim
      threadpool.nim: allow control over MaxThreadPoolSize and MaxDistinguishedThread; refs #10584
      typo
      Windows API callbacks cannot raise exceptions
      better error messages for Nim's effect system
      trees.nim: compare floating points by their bitpatterns because NaN comparisions are always false (WORST design in the history of computing!)
      disable even more of scope based destruction handling; fixes #13709
      trees.nim: compare floating points by their bitpatterns because NaN comparisions are always false (WORST design in the history of computing!)
      hotfix: make 'nim doc nimhcr' work on all platforms
      use nimEmulateOverflowChecks for ARM/ARM64
      encodeMIME should be encodeMime by our coding guidelines
      updated the changelog
      added an .assert pragma and mentioned the pragmas in the changelog
      return types must not be Natural for reasons I won't outline here
      fixes another silly arc/orc bug [backport:1.2]
      fixes #14159 [backport:1.2]
      fixes #14718 [backport]
      fixes #15056 [backport]

Arne Döring (31):
      fix #12332 (#12402) [backport]
      refactor illegal iterator assignment detection (#12212)
      Refactor json macro (#12391)
      fix #12426 (#12462)
      fixes #12453 (#12475)
      no html comments in issue template [skip ci] (#12496)
      fixes #12514 (#12520) [backport]
      integer literal documentation [ci skip] (#12513)
      Extent json.to testing to VM, add workrounds for VM bugs. (#12493)
      introduce csize_t instead of fixing csize (#12497)
      fix conversions to uint in varints.nim (#12564)
      backtick and export marker handling in `eqIdent` (#12574)
      fix #12597 (#12604)
      implemented alignas pragma (#12643)
      fix regression in align (#12680)
      delete list comprehension (#12392)
      fix in tests/js/tconsole (#12709)
      fix #12740 (#12774)
      add $nimeq for gdb (#12909)
      printing float values will have one more digit. (#13276) [backport]
      fix #13255 (#13275) [backport]
      fix bug in int128 (#13403)
      fix #13479 (#13503)
      Remove dead magics (#13551)
      fix operators containing percent for VM usage (#13536)
      add expectIdent to macros (#12778)
      allow category nimble-packages to test a single package (#13576)
      fix #13720 (#13721)
      fixes #13715 (#13716)
      fix #13417 (#13712)
      fix typos and deprecation warnings for tconvariancerules.nim (#13772)

Artem V L (3):
      Docstring refined for the getSectionValue() (#12478) [backport]
      '#' value parcing is explained (disambiguated) (#12476)
      splitPath() behavior synchronized with splitFile() (#12481)

BinHong Lee (2):
      Add `--git.devel` option to the documentation
      Allow `-o` option for `buildIndex` (#13037) [backport]

Brent Pedersen (1):
      testament/important_packages dont run hts (#13052)

Brian Wignall (1):
      [backport] Fix spelling typos (#12755)

Bung (4):
      add pqserverVersion,pqconnectionNeedsPassword,pqconnectionUsedPassword (#13060)
      fix #9771 (#14357)
      fix #14534 (#15060) [backport]
      fixes #14189 (#15080) [backport]

Chris Heller (1):
      Check pqntuples > 0 in getValue. Fixes #12973 (#12974)

Christian Ulrich (1):
      introduce getPeerCertificates, fixes #13299 (#13650)

Clyybber (33):
      Fixes #10514 (#12268)
      More of StringStream now works at compile time (#12284)
      Refactor injectdestructors (#12295)
      Fixes #12187 (#12321)
      Fixes #12379 (#12591) [backport]
      Implemented outplace differently (#12599)
      Cosmetic compiler cleanup (#12718)
      Fix #12812
      Cleanup leftovers of #12911(#12916)
      system.reset is no longer magic (#12937)
      Continue #13002 (#13021)
      Cleanup DFA (#13173)
      Fix docs (#13176)
      Fix docs for subdirs too (#13180)
      Tiny since cleanup (#13286)
      Fix capture for object types (#13315)
      Make build_all.sh more portable and a bit simpler (#13308)
      build_all.sh update (#13320)
      expectLen now shows the length that we got (#13387)
      capture macro now accepts variables of different types (#13356)
      Remove testutils (#13435) [backport]
      Only print the link command when listCmd is active; fix docs (#13603)
      Make listCmd honor hint:cc:off (#13606)
      Fix #13633
      Amend fix for #13633 (#13636)
      Change order of forwarded koch boot command line options, so as to be able to overwrite the nimcache location (#13637)
      Fix vm.nim for --gc:arc (#13741)
      Small typo (#13824)
      Fix #13889 with testcase (#13896) [backport]
      Fix the DFA for "unstructured controlflow" (#14263)
      New "ping-pong" DFA (#14322)
      Fix #14269 (#14286)
      Fix #14911 (#14922) [backport]

D-Nice (1):
      [backport] fix #11440, add docs to isNil for seq types needing nilseq (#13234) [ci skip]

Danil Yarantsev (2):
      Fix some typos in the manual [backport] (#14399)
      Change severity of template instantiation message [backport] (#14526)

David Krause (1):
      fix documentation of `$`*(dt: DateTime) (#12660)

Dean Eigenmann (1):
      feature/count (#13837)

Dominik Picheta (5):
      Change future version number in changelog
      Fixes ambiguity errors when evaluating Nimble files. (#12674) [backport]
      Revert broken asynchttpserver FutureStream additions.
      Fixes issues with dynamic loading OpenSSL. Fixes #13903. (#13919) [backport]
      [Backport] Fixes callbacks being dropped on Linux/macOS/BSD. (#15012)

Elliot Waite (2):
      Removing the mention of using `discard` for block comments (#12837) [backport]
      Add a 32x32 favicon (#12856)

Emery Hemingway (1):
      Implement NixOS distro check (#12914)

Endeg (1):
      Fix #12242, replacing ":" with "@c" in packages [backport] (#12265)

Euan (7):
      #12389: Check working directory for getAppFilename() (#12390)
      Fix #12135 and #12109 (#12137)
      #12103 - CI for FreeBSD (#12179)
      Fix typo for literal `[` (#13243)
      __stderrp and friends are only on FreeBSD & DragonFlyBSD. (#13735)
      `import macros` rather than `import std/macros`. (#13762)
      #13806 - getApplFreebsd might lose data (#13807)

Federico Ceratto (8):
      Fix spellings (#12277) [backport]
      Expose some layouter elements, improve readme (#12361)
      Refactor closeEmitter to make it more modular (#12365)
      [backport] Add link to posix_utils.html - related to #10723 (#12509)
      [backport] Add links to packaging and distro pages (#12603) [ci skip]
      Add link to posix_utils.html in posix.nim (#13111)
      Add link to packaging.html (#13194)
      SSL certificate verify GitHub action (#13697)

Fredrik Høisæther Rasch (2):
      Quote nim executable before executing. (#13316) [backport]
      Make vccexe parse response files (#13329)

Gampol T (2):
      documented behaviour of recv on bufferd socket (#12374)
      fixes #12319 - change exception handling for finish.exe (#12413)

Ganesh Viswanathan (1):
      Fix #9405 - cfg and nims run in sync

Hayden (1):
      Detect Ubuntu by checking release() and uname() (#13704)

Henrique Dias (3):
      Option to allow the request body to be processed outside the asynchttpserver library. (#13147)
      Added a basic example how to handle a Post request. (#13339)
      Fix to asynchttpserver form data/body broken with #13147 (#13394)

Hideki Okamoto (1):
      Fixes #12010; Add the description for "cc" option into --fullhelp (#12350)

Hiroki Noda (2):
      Thread attributes should be destroyed using the pthread_attr_destroy() (#13293)
      Add EPOLLEXCLUSIVE (#13718)

Huy Doan (1):
      Fix telebot test failed, closes ba0f3/telebot.nim#49 [ref #13812] (#13814)

Ico Doornekamp (13):
      Fixed #12337, leaking pipe after gorge (#12339)
      added cpuTime to VM (#12346)
      Refactored VM registerlayout. The size and location of the registers in (#12775)
      Increased TInstr field sizes: allow long jumps and 65535 VM registers (#12777)
      Auto-initialize deques (#12879)
      Use '__noinline' instead of 'noinline' for N_NOINLINE gcc attribute, this prevents clashes with systems where 'noinline' might be already defined (#13089)
      Added 'ansic' os support for minimal (embedded) targets (#13088)
      Remove obsolete code from osalloc (#13158)
      Removed lib/system/allocators.nim. seqs_v2 and strs_v2 now uses allocShared0. (#13190)
      Updated 'nim for embedded systems' section to use --os:any and --gc:arc (#13237)
      Cleaned up mmdisp.nim, moved implementations into lib/system/mm/ (#13254)
      Fixed codegen for constant cstring with --gc:arc (#13326)
      Improved assertion error messages on usage of JsonNode iterators on wrong kinds (#13389)

Jack Tang (2):
      index out of bounds exception when data is empty (#12428)
      Allow customize Host header

Jae Yang (1):
      Fixes #14110 (#14111)

Jairo (2):
      Add "origin" to window.location (#13251)
      scrollTop must be settable (#13263)

Jasper Jenkins (18):
      remove nimnomagic64 (#12243)
      Macro docs additions (#12270)
      ungeneric unsigned ops (#12230)
      make addQuoted work on nimscript (#12717) [backport]
      [backport] always set `fileInfoIdx.isKnownFile` (#12773)
      fix nimsuggest deprecation warnings (#12772)
      Better case coverage error message for alias and range enum (#12913)
      case coverage error message for `char` (#12948)
      fix enumtostr crash for enum-range (#13035)
      fix rtti sizeof for varargs in global scope (#13125) [backport]
      fix tsizeof3 for aarch64 (#13169)
      make case-object transitions explicit, make unknownLineInfo a const, replace a few magic numbers with consts (#13170)
      fix range[enum] type conversion (#13204) [backport]
      fix sets of scoped imported enums (#13666)
      add nnkMacroDef to RoutineNodes (#13676)
      fix when statements in inheritable generic objects (#13667) [backport]
      fix nimpretty warning (#13700)
      fix nimsuggest warning (#13699)

Jjp137 (13):
      threadpool: fix link in docs [ci skip] (#12258) [backport]
      Fix many broken links
      Prefer relative links for Nim documentation
      koch.rst: remove link to nonexistent section
      manual.rst: remove unintended link
      asyncstreams: replace unintended link with emphasis
      Fix word wrapping
      sequtils: replace deprecated 'random' call within example (#12515) [backport]
      Remove sentences referring to the graphics module (#12522)
      colors: fix 'mix' template and make most examples runnable (#12532) [backport]
      Remove a stray file (#12697)
      lib.rst: add a link for jsconsole [backport] (#13383)
      parsecsv: fix '\0' being displayed as '0' in docs (#15086) [backport]

Joey (3):
      Make gdb script work on mac and linux; add windows gdb script (#13453)
      Fix gdb scripts (#13658)
      Revert �#13658 for nim-gdb.bat. Fixes #13705 (#13707)

John Paul Adrian Glaubitz (1):
      Add build support for Linux/hppa (#12271)

Juan Carlos (32):
      Improve jsconsole adding the rest of the stable api as documented on the standard at https://developer.mozilla.org/docs/Web/API/Console (#12440)
      Fix #10804 (#12438)
      Fixes #10824 (#12437)
      Improve htmlgen (#12452)
      Add no-ident for GCC when -d:release (#12454)
      Fixes #8802 (#12439)
      [backport] Documentation Math module  (#12460)
      Improve Math.Trunc code emit on JS, had weird whitespaces and indents (#12549)
      JS improve indent (#12581)
      Fix htmlgen html lang (#12668) [backport]
      Improve head comment on JS (#12548)
      httpclient, maxredirects to Natural, newHttpClient/newAsyncHttpClient add headers argument instead of hardcoded empty (#13207)
      [backport] Documentation Fix #12251 (#13226) [ci skip]
      Add browsers.osOpen (#12901)
      Documentation staticRead maximum file size limits (#13485)
      Nimpretty Fix negative indent breaks code (#13580)
      Add isValidFilename (#13561)
      Documentation GC (#13109)
      Clean 1 old deprecated empty file (#13696)
      Remove 2 old deprecated files (#13702)
      Add Base64 safe (#13672)
      Fix #13631 (#13789)
      Add Documentation (#13811)
      Fix a 'See XXX' on documentation, clean out (#13820)
      Tiny fix on browsers.openDefaultBrowser (#13818)
      Documentation, add more examples (#13825)
      Add browsers.openDefaultBrowser without URL, implements IETF RFC-6694 Section-3 (#13835)
      Documentation and Code Style inotify (#13836)
      Deprecate when declared(echo):echo (#13840)
      Deprecate DCE:on (#13839)
      Jsconsole update (#12448)
      Deprecate PHP (#13838)

Judd (3):
      allow random module to be used in standalone: (#12617)
      introduce capture macro (#12712)
      update documentation for `closureScope` and `capture` (#12886)

Kamanji (1):
      Rst parser respect `:start-after:` and `:end-before:` in `include` directive (#12972)

Kartik Saranathan (1):
      fix typo (#13660) [ci skip]

Kaushal Modi (9):
      [backport] Add docs to better distinguish among getProjectPath, getCurrentDir and currentSourcePath (#12565)
      Make sequtils.zip return seq of anonymous tuples (#12575)
      [backport] Make all parseutils examples auto-checking (#13238)
      Add `sequtils.unzip` to complement `sequtils.zip` (#13429)
      [backport] tut1: Update the proc overloading examples (#13497) [skip ci]
      xmltree: Make indentation consistent with any num of children nodes (#13482)
      unicode.split: Fix the splitting when a Rune separator is used [backport] (#13629)
      Document that proc named fooTask is created for every foo task [backport] (#14187)
      Fail quickly if re or nre module is attempted to be compiled with js [backport] (#14341)

KeepCoolWithCoolidge (1):
      Fixes classify function to detect subnormal floating points (#12836)

Kevin (1):
      added cstrutils (#12858) [backport]

Khronos (1):
      Fix vertical tab in JSON. (#13399)

King Eca (1):
      Fixes stackoverflow links in readme (#12963) [backport]

Krzysztof Majk (1):
      remove unused import (#12900)

Lee Matos (1):
      Update advopt.txt to include link to nim cache docs (#13464)

Leorize (5):
      azure-pipelines: add pipelines for linux, mac and win
      testament: add azure integration
      azure: disable failing tests
      gitattributes: fix tests for windows
      workflows/ci: disable

Mamy Ratsimbazafy (2):
      csize_t changes: pinToCpu didn't compile (#12725)
      The whole options module should be inline (#14417) [backport:1.2]

Manav (1):
      Fixed non-working examples in Manual: Exception Handling (#13424)

Mark (3):
      deviated -> derived (#12845) [backport]
      deviated -> derived (#12846) [backport]
      Manual update: custom exceptions (#12847) [backport]

Mathias Stearn (1):
      Explicitly state that trailing underscores are banned (#12257)

Mera (1):
      [backport] Fix typo and improve in code-block of 'lib/pure/parseutils.nim' (#13231) [ci skip]

Milan (1):
      [backport] times/getClockStr(): fix mistake in doc (#13229) [ci skip]

Miran (40):
      [backport] bundle nimpretty on Windows (#12358)
      [backport] fix #12418, fix `random.randomize` on JS backend (#12432)
      fixes #11764, faster hashing of (u)int (#12407)
      [backport] fix type's case in random.nim (#12445)
      fix deprecation warnings related to Int128 (#12474)
      [backport] fix #12395 (#12590)
      fix #8242, fix #12586: fix 'formatFloat' with 'precision = 0' (#12592)
      fix #12519: introduce OrderedTable.take, CountTable.del, CountTable.take (#12600)
      remove two asserts in int128.nim (#12648) [backport]
      increase the timeout for 'tasyncclosestall' (#12744)
      clean up deprecated stuff and unused imports in tests (#13059)
      System cleanup, part 1 (#13069)
      [backport] fix #12813, fix #13079 (#13099)
      System cleanup, part 2 (#13155)
      style fix: change 'JS' to 'js' to make it consistent (#13168)
      Idxmin & idxmax, continuation (#13208)
      [backport] -d:danger should imply -d:release (#13336)
      testament: introduce 'matrix' for testing multiple options (#13343)
      [backport] remove 'CountTable.mget' (#13355)
      fix #6736: templates in unittest now show actual value (#13354)
      fixes #3339 by documenting the limitations of case-statement (#13366)
      remove outplace version of 'merge' for CountTables (#13377)
      add ggplotnim to important_packages (#13206)
      add more files to the ignore list, hopefully fixes nightlies on windows (#13474)
      docgen: don't create compiler's docs + cleanup (#13509)
      important_packages: change the order of arguments in the template (#13577)
      fix #13531 by adding a test (#13581)
      fix #12508, unaligned access on sparc64 (#13594)
      fix #13310, Deque misbehaves on VM (#13625)
      rename `lenTuple` and `lenVarargs` (#13639)
      add `move` to `tables` to prevent warnings when compiled with `--gc:arc` (#13684)
      fix #13731, ambiguous repr of pointers (#13732)
      fix deprecations and other warnings (#13748)
      bump copyright year to 2020 (#13753)
      faster CIs (#13803)
      make fuzzy search a bit less fuzzy (#13996) [backport:1.2]
      [backport] fix #14748, move gdb files to other section of installer.ini (#14772)
      fix #14082, don't crash on incorrectly formatted input (#14977) [backport]
      fix several newline problems (#15028) [backend]
      asyncftpclient.nim - don't assume a sufficiend line length (#14973)

Neelesh Chandola (4):
      Fixed objects being erroneously zeroed out before object construction (#12814) [backport]
      Fixes #12832 (#12842) [backport]
      Assigning template to var/let/const gives a proper error (#12851)
      Support cross compiling from host to host (#12859)

Nindaleth (2):
      fix a few dead links and a missing sentence in documentation (#12387)
      fix several typos in documentation and comments (#12553)

Nな人(N na hito) (1):
      Update LICENSE (#13421)

Oscar Nihlgård (4):
      Fix compiler crash caused by top level return (#12501)
      Fix jsgen bug with uninitialized seq (#12500) [backport]
      Fix JS bug in std/monotimes (#12499) [backport]
      Fix sequtils.delete bug with out of bounds indexes (#12506)

PMunch (3):
      Fix for 16 bit platforms (#12760) [backend]
      Fix AVR target to define ints properly (#12817)
      Add signatures object to jsondoc for routine types (#13530)

Paul Tan (1):
      guards.nim:sameTree(): handle uint literals correctly (#12483) [backport]

Pierre-Jean Grenier (1):
      fix httpclient.lastModified bad pattern in parsing (#12698)

RSDuck (1):
      Fix #12785 (#12943)

Ray Imber (11):
      Locks modules should give a compile error when threads are not enabled. (#12231)
      Test + fix for epoll and kqueue selector modules to properly unregister
      Additional fix for User key unregister in the KQueue backend
      lowered the number of events in the test because some CI's have an extremely low FD limit
      Documentation improvements around the db interface (#12362)
      Fix io slector unregister for windows as well.
      Fix drain to correctly take into account hasPendingOperations and the timeout value
      Remove unnecessary change to ioselectors_kqueue.nim found by @cheatfate.
      fixes based on code review by @dom96
      Updated the changelog
      Update changelog.md based on feedback from Dom96

Ridho Pratama (2):
      Fixed sizeOf to sizeof (#12347)
      renderer letAux fix only for octal literal (#12343)

Rory O’Kane (3):
      docs: say that `nil` can be used as a value (#13756)
      [skip ci] docs: reword Part 3 link to communicate that it exists (#13755)
      [ci skip] docs: make the syntax for generics easy to look up (#13754)

Sam Wang (1):
      Added fix for handling TaintedStrings in streams and httpclient (#12969)

Siegfried Ehret (1):
      Fix typo (#13015) [backport]

Simon Krauter (1):
      parsecfg: retain CRLF line breaks, fixes #12970 (#12971)

Solitude (1):
      Fix code style errors (#12545)

Teashrock (1):
      Deleted misplaced separator (#13085) [backport]

Timothee Cour (124):
      fixes #12330 (#12331)
      fixes #12663 staticRead now creates a dependency for rebuilds (#12731) [backport]
      [minor] fix doc for $(Time) (#12795) [backport]
      osx: support nanosecond resolution for file stat (eg getLastModificationTime) (#12794)
      VM: allow ptr setting ptr fields (#12825)
      fix json regression D20191212T144944 (#12902) [backport]
      allow typed/untyped in magic procs (#12911)
      fix cmdline bugs affecting nimBetterRun correctness (#12933) [backport]
      fix #12919 tasyncclosestall flaky: Address already in use (#12934)
      fixes #12735 on osx, call dsymutil for debug builds (#12931)
      lenVarargs: number of varargs elements (#12907)
      [ci skip] docfix .. < => ..< (#12981) [backport]
      fix #12985 {.push.} now does not apply to generic instantiations (#12986)
      VM: support importc var, ptr/pointer types, cast int <=> ptr/pointer (#12877)
      [cleanup] remove disabled (and obsolete) ttypetraits; rename ttypetraits2 => ttypetraits (#13041)
      --styleCheck:hint now works (#13055)
      [easy] --hint:link:on now shows link cmd instead of nothing (#13056)
      make SuccessX show project file + output file (#13043)
      remove all remaining warnings when build nim (with -d:nimHasLibFFI) (#13084)
      typetraits: fixes #6454; genericParams; added lenTuple; added tuple type get (#13064)
      VM FFI: write(stderr, msg) and fprintf(cstderr, msg) now work at CT (#13083)
      fixes #13100 nim doc now treats `export localSymbol` correctly (#13123) [backport]
      export normalizePathEnd (#13152)
      successX now correctly shows html output for `nim doc`, `nim jsondoc`; fix #13121 (#13116)
      CI fix timeout error (#13134)
      fixes #12998 nim doc regression (#13117)
      followup on #10435 : should be diff, not show (#13162)
      refs #13054 correctly handle {.exportc,dynlib.} and {.exportcpp,dynlib.}  (#13136)
      fixes #13144 (#13145)
      times: toUnixFloat, fromUnixFloat (#13044)
      maybe: allows optional chaining of field access and indexing when LHS i snil (#13023)
      fix docs + API for fieldPairs, fields (#13189)
      fix #13211 relativePath("foo", ".") (#13213)
      new os.isRelativeTo (#13212)
      VM: allow overriding MaxLoopIterations without rebuilding nim (#13233)
      kochdocs: use a glob instead of hardcoded list; generate docs for compiler/; bugfixes (#13221)
      fix lots of bugs with parentDir, refs #8734 (#13236)
      nim dump: add libpath (#13249)
      contributing docs: symbols need package prefix; changed allocStats to nimAllocStats (#13247)
      refactor htmldocs; gitignore it
      removed unused import
      fix stdout(etc) for emscripten
      csize => csize_t for sysctl
      fix critical bug discovered by #11591 (#13290) [backport]
      miscellaneous bug fixes (#13291)
      CT FFI: fix for windows; fix case transition; error msg shows more useful context (#13292)
      refs #8391 std/os now shows runtime context for raiseOSError exceptions (#13294)
      build_all.sh: building csources 5X faster thanks to make -j (#13300)
      fix #13132 tnetdial (#13318)
      enable testing -d:nimHasLibFFI mode (#13091)
      nim secret: support linenoise when available (#13328)
      fix #13150 `nim doc --project` now works reliably (#13223)
      fix #13349 regression: isNamedTuple now works with generic tuples (#13350)
      replace old problematic isNamedTuple implementation by TypeTrait isNamedTuple in dollars.nim (#13347)
      fix #13182: `proc fun(a: varargs[Foo, conv])` now can be overloaded (#13345) [backport]
      miscellaneous bug fixes (part 3) (#13304)
      Revert "printing float values will have one more digit. (#13276) [backport]" (#13363)
      testament: this now works: "testament r /abspath/to/test.nim" (#13358)
      fix `is` with generic types; fix `genericHead(Foo[T])` (#13303)
      fix #13374 `nim c -r -` now generates $nimcache/stdinfile (#13380) [backport]
      fix #9634 don't crash on execCmdEx/readLine when inside gdb/lldb (#13232)
      fix several bugs with `repr`  (#13386)
      remove dead code test_nimhcr_integration.(bat,sh) (#13388)
      fix linenoise regression (#13395)
      fix incorrect lenTuple implementation (#13423)
      [backport] pseudorandom probing for hash collision (#13418)
      make unzip faster: seq[i]=val can be 7X faster than seq.add(elem) (#13448)
      relativePath("foo", "foo") is now ".", not "" (#13452)
      only enable linenoise for -d:nimUseLinenoise (#13478)
      fix #13449 texitcode flaky on windows (#13487)
      fix #8312 --hints:off and --warnings:off now honored everywhere (#13489)
      runCI: logs now show CPU/OS/etc info to be self contained (#13486)
      fix #13455 ; joinPath(a,b) now honors trailing slashes in b (or a if b = "") (#13467)
      tables/sharedtables/intsets/etc: fix #13496, #13504, #13505; add lots of tests (#13498) [backport]
      cleanup Ordinal (#13501)
      make CI tests faster + more precise
      revert changes to tests/gc/gcleak2.nim
      CI tests run faster: save 120s in azure machines, 335s on local OSX
      save another 33s of CI for tests/gc/gcleak.nim
      correctly honor cmdline --hint:conf:on/off ; correctly show Conf hints in order
      remove isCmdLine; use passCmd1
      properly handle note override logic/verbosity/config/cmdline using modifiedyNotes, cmdlineNotes
      fixes #13543 and added times.isLeapDay (#13547)
      fix broken nim CI, disable blscurve (#13555)
      fix #13528 nimgrep --word now works better with operators (#13537)
      make genericParams support static[T] generic params (#13433)
      workaround refs #13563 freebsd CI (#13564)
      fix hintSuccess: `out` was wrong for `nim doc` without `-o` flag (#13569)
      close #12704 by adding a test (tuple codegen error) (#13592)
      `koch --nim:pathto/nim boot` and `koch boot --hint:cc:off` now work  (#13516)
      fixes #13558: toDateTime buggy on 29th, 30th and 31th of each month; breaking change: do not use `now` to compute result, was undocumented and non-sensical (#13565)
      fix #13633 fix koch boot crashing regression (#13635)
      azure-pipelines: use OSX 10.15 (was just enabled upstream) (#13546)
      fix #13218: avoid some irrelevant warnings for nim doc,rst2html,--app:lib, + other fixes (#13550)
      fix `nim doc subdir/foo` which was generating broken css; + other fixes (#13647)
      fix #13524 astToStr now works inside generics (#13681)
      fix #11458 oswalkdir (#13689)
      fix #13412 nim now recompiles for stdin input; SuccessX now configurable; can show whether it recompiled (#13506)
      fix #13538 sigmatch errors are now sorted (#13701)
      [RFC] 'walkDir' now has a new 'checkDir' flag, to mimic behaviour of other languages (#13642)
      new syntax for lvalue references: `var b {.byaddr.} = expr` (#13508)
      fix #13737 (#13738)
      distinctBase overload for values (#13746)
      [CI] fix recent freebsd systematic failure (#13788)
      fix #13730 (#13787)
      fix #13794 HashSet leak (#13800)
      stacktraces can now show custom runtime msgs per frame (#13351)
      refs #13797 (#13812)
      fix #13829 (#13831)
      fix open file leak when running --debugger:native (#13832)
      make `usage of foo is a user-defined error` more informative (#13833)
      fix last remaining warning when building nim (`intVal should be Int128`) + minor cleanups (#13841)
      std/byaddr => std/decls (#13847)
      move tinyc to a separate repo and allow installing external dependencency (eg tinyc) from koch / library code (#13850)
      fix https://github.com/timotheecour/Nim/issues/88 (#13865) [backport:1.2]
      openDefaultBrowser now works on OSX (#13892) [backport]
      fix #13902 distinct uint64 type corruption on 32-bit with borrow (#13907) [backport:1.2]
      backport nimExe from #13876 (#14024)
      fix https://github.com/nim-lang/RFCs/issues/211: `var a: DateTime` compiles and is usable (#14002) [backport:1.2]
      [ci skip] changelog conflicts are a thing of the past (#14098)
      fix nim CI; fix local testament (#14102)
      fix #14132 dsymutil should not be called on static libraries (#14133) [backport:1.2]
      fix a critical bug in windows.osproc leading to resource leaks and blocking IO [backport] (#14296)
      fix https://github.com/nim-lang/Nim/issues/14275 querySetting(nimcacheDir) works even if implicitly set (#14277)

Tomohiro (12):
      Fix how `relativePath` handle case sensitiviy (#12312) [backport]
      On windows, os.relativePath returns path as is when roots are different (#12329)
      Fix vcc linker option name (#12422)
      Fix Nim specify wrong option to vccexe when vcc.options.always is set (#12490) [backport]
      Add /nologo option when nim call cl.exe (#12524)
      [feature]strformat: add 2 'fmt' macros that use specified characters instead of '{}'  (#11748)
      Add a changelog entry related to PR #11748 [ci skip] (#12541)
      Fixes #12536 (#12568) [backport]
      Fixes #12734 (#12784)
      Fix error check code in osproc (#13090) [backport]
      Fix typo in doc/destructors.rst (#13148)
      Add sideEffect pragma to importC procs in posix, winlean and time module (#13370)

Tor Arvid Lund (1):
      [backport] doc/tut3.rst: Fix typo in Introduction (#12607) [ci skip]

UNIcodeX (1):
      [backport] Clarifies experimental / parallel example on manual.rst (#12472)

Varriount (1):
      fix nightlies builds on Windows (#13587)

Volodymyr Lashko (1):
      Fix crash in terminate handler (#12572) [backport]

Yanis Zafirópulos (1):
      added support for openArray's for `gcd` and `lcm` (#12621)

Yuriy Glukhov (1):
      Fixed yield in nkCheckedFieldExpr (#12429) [backport]

Zahary Karadjov (19):
      First steps, the compiler can boot with enforced requiresInit
      More sophistication; Allow requiresInit to be specified per-field
      Don't allow 'var x: T' for objects that require initialization
      Plug another hole: default(T) forbidden for objects requiring initialization
      Enable the requiresInit checks only for objects
      Fix tests/notnil/tnotnil_in_objconstr.nim
      Turn the warning for uninitialized (result) variables into errors
      not nil types are illegal to construct through default(T)
      Hrm, the new errors highlighted some code that seems to be broken
      More precise error messages for uninitialized fields in the presence of inheritance
      Perform nil checks during object construction and within compiles()
      Close https://github.com/nim-lang/Nim/issues/11428
      Fix https://github.com/nim-lang/Nim/issues/4907
      Fix a CI failure during koch doc
      Fix tests/parallel/tguard2.nim
      Replace tfHasRequiresInit with a more accurate mechanism
      Turn some of the errors back into warnings
      The raises list can now use expressions referencing the generic params
      Fix tests/types/tparameterizedparent0

Zed (2):
      Implement file streaming for httpclient's MultipartData (#12982)
      Fix asynchttpserver newline breaking content-length (#14565) [backport]

aguspiza (1):
      SSL_CTX_load_verify_locations parameters are reversed (#14815) [backport]

alaviss (31):
      nimsuggest: fix tcp socket leak (#12377) [backport]
      nimsuggest: fix tcp socket leak for epc backend (#12384) [backport]
      nimsuggest: add option to force finding the project file (#12409)
      nimsuggest: add a command that returns the project file (#12411)
      compiler/options: improve project file detection (#12404)
      compiler/options: only check the last folder for a candidate (#12421)
      compiler/semcall: return the correct lineinfo for nkCallStrLit (#12484)
      compiler/semtypes: improve lineinfo for exported object fields (#12495)
      compiler/suggest: add variable support to `con` (#12569)
      compiler/ccgtypes: hide exportc proc unless it has dynlib (#13199)
      Unexport even more symbols (#13214)
      testament/azure: major rewrite (#13246)
      koch: enable checks in the compiler when running CI (#13323)
      manual: documents changes regarding dynlib (#13425)
      nimsuggest: don't add CRLF to replies (#13545)
      Revert "nimsuggest: don't add CRLF to replies (#13545)" (#13597)
      azure-pipelines: walkaround issues with triggers (#13657)
      .github/workflows: new CI pipeline (#13656)
      httpcore: deprecate `==`(string, HttpCode) (#13682)
      asyncdispatch: fix erroneous set construction (#13765)
      ssl_certs: add Haiku support (#13761)
      More fixes for Haiku (#13774)
      workflows/ci_docs: lots of goodies (#13809)
      workflows/ci_docs: fix documentation deployment (#13819)
      asyncdispatch: export Callback (#14042) [backport]
      tools/finish: don't quote path with space (#14058) [backport]
      testament: don't rely on Nim source structure [backport:1.2] (#14077)
      testament: don't try to test nimgrep if it's not there [backport:1.2] (#14085)
      net: remove more erroneous set constructions (#14252) [backport]
      encodings: use only one iconv definition [backport:1.2] (#14741)
      posix_other: add define to force time_t to 64 bit [backport] (#14753)

awr1 (1):
      [backport] Mention "lambdas" and `=>` in the manual (#12397) [ci skip]

b3liever (3):
      Version of trimZeros without temp strings (#12633)
      add collect macro (#12708)
      basename supports pragmaexpr (#13045)

c-blake (4):
      Discussion both in (#12678)
      Unwind just the "pseudorandom probing" part of recent sets,tables changes (#13816)
      Fulfill https://github.com/nim-lang/Nim/pull/14995#issuecomment-664914391 (#15104)
      Attempt to explain better why delImplIdx is the way it is.  Maybe this can (#15108)

chr v1.x (1):
      [backport] documentation: Add channels examples (#13202) [ci skip]

cooldome (50):
      External file compilation improvement (#12380)
      fixes #5050; fixes #11826  (#12606) [backport]
      fix compilation warning (#12618)
      Fix external file recompilation (#12802)
      fixes #12804 (#12809)
      fixes #12783 [backport] (#12810)
      fixes #12821 (#12822)
      fixes #12820 (#12828)
      fixes #12827 (#12829) [backport]
      invoke createTypeBoundOps for constructors (#12878)
      fixes #12882 (#12889)
      Better clang_cl support (#12896)
      Fixes #12883 (#12894)
      NaN floatFormat with clang_cl  (#12910)
      fixes #12945 (#12959)
      fixes #12989 (#12992)
      Sink to MemMove optimization in injectdestructors (#13002)
      remove default argument for readLines (#12807) [backport]
      Fixes #13026 (#13028)
      fixes #13013, reverts previous changes to readLines() (#13036) [backport]
      distinctBase type trait for distinct types (#13031)
      pass platform argument only if vccexe is used (#13078)
      Working towards arc codegen (#13153)
      fixes #13095 (#13181)
      make sink operator optional (#13068)
      more on arc codegen (#13178)
      fixes #13195 (#13198)
      fixes #13281 (#13282)
      unittest add resetOutputFormatters proc (#13267)
      nimv2 widestring indexing (#13279)
      Repr v2 progress (#13268)
      fixes #13368 (#13397)
      stdlib/system: add sink and move  (#13283)
      fixes #12627 (#13521)
      EndsInNoReturn in expressions extension, fixes #13490 (#13520)
      make it possible to pass linker options for vcc (#13535) [backport]
      fixes #12747 [backport] (#13651)
      Fixes #13659 (#13674)
      Attempt to finish off araq cpp exceptions (#13695)
      fixes #13708 (#13711)
      fixes #13744 (#13749)
      Continue bool conversion fixing (#13751)
      make nim_temp compile with --gc:arc --sinkInference:off (#13769)
      fixes #13810 (#13821)
      fix #13909 (#13914) [backport:1.2]
      fixes #14003 (#14006) [backport:1.2]
      fix #14007 (#14012) [backport]
      Implements RFCs #209 (#13995)
      fix #14219 (#14225)
      fix odbc regressions (#15009) [backport]

ducdetronquito (1):
      Namespace unittest enums to avoid name conflicts (#12468) [backport]

ee7 (1):
      [backport] Docs: Fix broken `code-block` (#14749)

flywind (2):
      fix error in assertions document (#12925) [backport]
      fix asynchttpserver content-length header (#13846)

genotrance (13):
      Fixes #12286 - require explicit disabling of boehm interior pointer checking (#12406) [backport]
      Switch mingw links (#12561)
      Substitute $nimbleDir in --path flags (#12750)
      Fixes #12767 (#12768)
      Path substitution for --out and --outdir (#12796)
      Fix single match output (#12920)
      Fix #10717, fix #13284 (#13307)
      Fix #8648 - use parent streams to avoid hang (#13445)
      Fix docgen snippet numbering (#13507)
      Revert "Support cross compiling from host to host (#12859)" (#13591)
      Fix #12676 (#13634)
      Improve #12920 fix (#13958)
      Fix #14057 - moveFile should overwrite on Windows (#14433)

hlaaftana (11):
      Sets need copying in JS (#11392)
      Remove name attribute from docutils.nimble (#13239)
      Fixes asyncftpclient multiline reading, fixes #4684 (#13242)
      Rename isNilOrWhitespace to isEmptyOrWhitespace and make it use allCharsInSet (#13258)
      Clearer final objects error; fixes #13256 (#13257)
      Consider proc as a pointer type in options (#13460)
      Remove genToArray in jsgen, a PHP remnant (#13466)
      Minor doc change in macros, future -> sugar (#13475) [ci skip]
      Document import/include outside of top level semantics (#13548)
      fix #13409: Document as infix operator (#13570)
      small docs fix in typetraits (#14108)

itsumura-h (2):
      fix db_mysql getRow() when column is null error raised (#12806) [backport]
      fix #7241 (#13779)

jiro (1):
      Add `or detectOs(Manjaro)` (#12587) [backport]

kraptor (1):
      Fix reference to parseSpec proc in readme (#12359)

lbartoletti (1):
      Add arm/arm64 for FreeBSD (#13822)

loloiccl (1):
      Modify the test command for nimly (nimble-package) (#13053)

narimiran (50):
      devel version is 1.0.99 [ci skip]
      Nim now has Patreon account [ci skip]
      [backport] fix #12278, don't expose internal PCRE documentation
      [backport] fix nimpretty removing space before pragma
      [backport] run nimpretty on async
      [backport] run nimpretty on numbers stuff
      [backport] run nimpretty on parsers
      [backport] run nimpretty on hashes
      [backport] run nimpretty on web stuff
      [backport] run nimpretty on string stuff
      [backport] run nimpretty on os-related stuff
      [backport] run nimpretty on the remaining files
      test more packages
      [ci skip] disable two packages until #11764 is merged
      Revert "[ci skip] disable two packages until #11764 is merged"
      [backport] package chronos now has dependencies
      disable flaky test on OSX
      add changelog for v1.0.2
      disable package 'chronos' for now
      NimPatch of devel version should be an odd number because of the earlier hacks
      remove unused imports
      remove unused imports from tests
      [backport] rewrite flaky runnable example
      [backport] print more information for the previous commit
      fix failing test
      remove long-deprecated 'mapIt'
      a better way to test Arraymancer
      Revert "ARC: another critical bugfix; temporary tuples we introduce for tuple unpackaging are not owning the data"
      move entries from the wrong changelog file [ci skip]
      [backport] system/io.nim fix wrong documentation comment [ci skip]
      [backport] fix #13352
      make devel green again: tnetdial still doesn't work on Travis
      [ci skip] important_packages: change the order in commented out packages too
      travis now only builds devel docs
      [ci skip] add back unintentionally removed line
      create a changelog for v1.2.0
      bump Nim version to 1.2.0
      bump Nim version to 1.2.1
      package 'inim' now has dependencies
      use the same Azure Pipelines workflow as current devel
      disable the new fragile test in 'tosproc.nim'
      install gtk3 on osx for package testing
      correctly backport #14496
      disable 'nimx' package, see PR #14293
      bump Nim version to 1.2.2
      bump NimVersion to 1.2.3
      update test command for 'norm' package
      bump NimVersion to 1.2.4
      bump NimVersion to 1.2.5
      bump NimVersion to 1.2.6

perter lee (1):
      fix the ftp store function read the local file bug (#13108) [backport]

pietroppeter (1):
      [doc/tut1] removed discard discussion in comments (#12352)

pyloor (1):
      adding sqlite3 backup functions (#13346)

rockcavera (1):
      fix #12988 (#13022)

slangmgh (3):
      Fixes #13186 (#13188)
      Fix #14151 (#14205) [backport]
      Fix #14289 (#14304) [backport]

solo989 (1):
      Update pegs.nim to work at compiletime. No range errors. (#13459)

supakeen (1):
      Add isNil check to custom Content-Length. (#13867) [backport:1.2]

tauplus (2):
      Fix wrong section hierarchy in the manual (#12724) [backport]
      fix typo in the manual (#12723)

treeform (6):
      Fix -d:logGC compile cerror: 'stdout not defined' (#12237)
      Easier build instructions for windows - just run `build_all.bat`. (#12276)
      About 50% faster base64 implemention. (#12436)
      Remove some unused/disabled OpenSSL functions (#13106)
      Expose more openSSL methods. (#13131)
      Add more JS stuff to dom.nim (#13483)

whiterock (1):
      added note to re constructor regarding performance (#13224)

zah (4):
      macros.newLit now works for ref object types (#12307)
      `system.writeFile` has been overloaded to also support `openarray[byte]` (#12313)
      Fix newLit for objects having string fields (#12542) [backport]
      Fix typeSym.getImpl for ref types (#13752)

Ștefan Talpalaru (4):
      generic stack trace overriding mechanism (#12922)
      c_fflush() the rawWrite() buffer (#12987)
      isolate the build process from external config files (#13411)
      fix #14364 (#14372) [backport:1.2]

めぐみ発動機 (isVowel / GreenWing) (1):
      fixed to jsonArrayEnd comment. (#13624)
mildred pushed a commit to mildred/Nim that referenced this pull request Jan 11, 2021
request.  This can be conceived as an alternate, more capable resolution of
  nim-lang#12200
than
  nim-lang#12208

The code re-org idea here is to upgrade tablimpl.nim:`delImpl`/`delImplIdx`
to abstract client code conventions for cell emptiness & cell hashing via
three new template arguments - `makeEmpty`, `cellEmpty`, `cellHash` which
all take a single integer argument and clear a cell, test if clear or
produce the hash of the key stored at that index in `.data[]`.

Then we update the 3 call sites (`Table`, `CountTable`, `SharedTable`) of
`delImpl`/`delImplIdx` by defining define those arguments just before the
first invocation as non-exported templates.

Because `CountTable` does not save hash() outputs as `.hcode`, it needs a
new tableimpl.nim:`delImplNoHCode` which simply in-lines the hash search
when no `.hcode` field is available for "prefix compare" acceleration.
It is conceivable this new template could be used by future variants, such
as one optimized for integer keys where `hash()` and `==` are fast and
`.hcode` is both wasted space & time (though a small change to interfaces
there for a sentinel key meaning "empty" is needed for maximum efficiency).

We also eliminate the old O(n) `proc remove(CountTable...)` in favor of
simply invoking the new `delImpl*` templates and take care to correctly
handle the case where `val` is either zero for non-existent keys in `inc`
or evolves to zero over time in `[]=` or `inc`.

The only user-visible changes from the +-42 delta here are speed, iteration
order post deletes, and relaxing the `Positive` constraint on `val` in
`proc inc` again, as indicated in the `changelog.md` entry.
clrpackages pushed a commit to clearlinux-pkgs/nim that referenced this pull request Apr 6, 2021
Abhishek Dubey (1):
      Installation Instruction (#15485)

Adam Weber (1):
      Grammar correction in backends.rst (#13989)

Aethylia (1):
      Added [:T] syntax explanation to generics tutorial. (#15890)

Alexander Ivanov (2):
      Remove my wrongly written mangled-related code, not needed anymore (#13858)
      Make await a template (#12085)

Alexander Wolfe (1):
      nimpretty support for multiple files (#14890)

Andreas Rumpf (198):
      new feature: ability to turn specific warnings to errors
      finally de-deprecate the .define and .undef pragmas
      drnim: tiny progress (#13882)
      added a .since annotation to hashIdentity
      drnim: phi nodes for 'if' statements (#13990)
      fixes #14001 (#14004)
      fixes #12741 (#14005)
      fixes #12834 (#14017)
      fixes #14038
      fixes #14052 [backport:1.2] (#14055)
      cycle collector (#14071)
      new implementations for --gc:orc (#14121)
      fixes a critical =trace generation bug (see test case) (#14140)
      fixes #14079 [backport:1.2] (#14163)
      fixes #14054 [backport:1.2] (#14061)
      fixes #13986 [backport:1.2] (#14173)
      fixes #13698 [backport:1.2] (#14175)
      arc: do not unload globals when building a library [backport:1.2] (#14180)
      fixes #14136 (#14198)
      destructors: don't produce stupid code for 'cast' (#14208) [backport:1.2]
      sequtils refactoring: prefer typeof over type (#14212)
      fixes #14209 [backport:1.2] (#14213)
      cleanup the CC setting, only leave in there what is at least semi-officially supported
      added a new feature: --cc:env so that you can use any C compiler as long as it works like GCC
      do not track 'raise Defect' in the .raises: [] clause anymore (#14298)
      fixes #13946 (#14302)
      fixes #13881
      fixes #13935
      fixes #13104 [backport]
      fixes #13998 [backport:1.2]
      fixes #14370 (#14371)
      specialize genericReset (#14398)
      fixes #14126 [backport:1.2] (#14390)
      fixes a bug reported in https://forum.nim-lang.org/t/6361 (#14422)
      change the [Processing] messages into dots (#14418)
      ARC/ORC: optimize s.setLen(0) to match the old runtime's behaviour (#14423)
      make malloc.nim consistent in style (#14427)
      avoid unsafe Nim features in preparation for --gc:arc (#14431)
      manual.rst: updates [backport] (#14445)
      typo
      drnim improvements (#14471)
      more checking for --gc:arc, no need for valgrind (#14467)
      fixes #14495 [backport:1.2] (#14496)
      fixes #14498 [backport:1.2] (#14503)
      warn about observerable stores but don't prevent them for 1.2.2 [backport:1.2]; refs https://github.com/nim-lang/RFCs/issues/230 (#14510)
      fixes #14514 [backport:1.2] (#14533)
      fixes --warningAsError implementation (#14538)
      parser.nim: minor refactorings (#14540)
      more precise analysis about 'observable stores' [backport:1.2] (#14582)
      implement the 'bind' statement for generics, it was an oversight that this was never implemented (#14584)
      fixes #14118 (#14595)
      fixes #14315 (#14594)
      fixes #14557 (#14607)
      optimized wrapWords; fixes #14579 (#14606) [backport:1.2]
      fixes #14578 (#14615)
      fixes #14279 (#14618)
      sizeof for empty objects/tuples should be 1; fixes #14690 (#14751)
      fixes #14458 [backport:1.2] (#14756)
      fixes #14240 [backport:1.2] (#14757)
      init checks and 'out' parameters (#14521)
      fixes #14760 (#14769)
      scoped memory management (#14790)
      injectdestructors: refactoring, added more cases explicitly (#14929)
      fixes #14402 (#14908)
      fixes #14900, this time for real, maybe (#14934)
      fixes #14865 (#14937)
      fixes #14925 (#14947)
      optimize the new nimPrepareStrMutationV2 with inlining (#14969)
      An optimizer for ARC (#14962)
      disable debug output
      cursor inference: hotfix (#14999)
      arc: cursors for simple for loop variables (#15008)
      'isolate' builtin; refs https://github.com/nim-lang/RFCs/issues/244 (#15011)
      fixes #14194 (#15023)
      hotfix: firstOrd/lastOrd for 'tyLent' as it shows up in strange places, as usual
      cursor inference bugfix
      ARC: optimize the code better when --panics:off (#15031)
      fixes #15026 [backport] (#15040)
      enforce browsers.nim only handles URLs [backport] (#15045)
      fixes #15044 [backport:1.2]
      fixes #15036
      writing to a location counts as "side effect"; implements https://github.com/nim-lang/RFCs/issues/234 (#15030)
      strict func: much better error messages (#15068)
      fixes #15052
      fixes #15038 [backport:1.2]
      fixes #15076 (#15095)
      cleanup ARC documentation (#15100)
      disable sink inference, only enable it for the stdlib. Reason: better source code compatibility (#15105)
      fixes #14616 [backport:1.2] (#15109)
      cursor and mutation tracking fixes (#15113)
      fixes #15112 (#15124)
      fixes #15071 [backport] (#15131)
      Revert "Small typo (#15132)" (#15134)
      fixes #15111 (#15136)
      fixes #15122 [backport:1.2] (#15139)
      fixes #15130 (#15141)
      fixes #15129 [backport:1.2] (#15144)
      fixes a collect() bug reported on the forum (#15156) [backport:1.2]
      fixes #15101 [backport] (#15171)
      fixes #15177, the error message is now what it should have been (#15195)
      better strict funcs, WIP (#15199)
      fixes #15221 (#15230)
      fixes #15210 [backport:1.2] (#15237)
      fixes system.add for strict funcs (#15259)
      strict funcs: use control flow information for a more precise analysis (#15271)
      borrow checking (#15282)
      borrow checking refinements (#15290)
      fixes #15280 [backport:1.2] (#15281)
      testament improvement: allow inline error messages inside test cases (#15294)
      fixes #15122 (#15301)
      fixes #15147 (#15315)
      fixes a critical ORC bug, refs #15076 (#15323)
      fixes #15076 (#15329)
      allow old styled RTTI for arc/orc (#15331)
      fixes #15325 (#15340)
      fixes #9754 [backport] (#15342)
      Revert "Introduce explicit copy (#15330)" (#15346)
      async: minor refactorings (#15354)
      more ORC bugfixes (#15355)
      ORC and stdlib optimizations (#15362)
      base64: fixes the error message for an invalid base64 input character [backport:1.2]
      ORC/ARC async progress (#15370)
      fixes #15369 (#15371)
      async: removed the 'unown' references, async never worked with --newruntime anyway and --newruntime is dead (#15374)
      added a basic ORC test I still had lying around (#15376)
      fixes #15360 [backport:1.2] (#15378)
      better nativestacktrace support; refs #15284; backport [1.2] (#15384)
      finish the stacktraces.nim implementation [backport:1.2] (#15393)
      fixes #15361 (#15401)
      fixes #15403 (#15404)
      more precise borrow checking of 'result' (#15406)
      fixes #14983 (#15320)
      cursor inference: makes combparser work; refactorings (#15411)
      better support for slices as views (#15414)
      produce runtime type information for reified openArrays (#15415)
      cleanup lib/system/stacktraces.nim; refs #15416 (#15418)
      .noalias annotation; frontend support (#15419)
      spec for view types (#15424)
      better support for view types (#15436)
      added missing .noalias support for object fields (#15445)
      refactoring, fixes yet another strictFuncs regression (#15446)
      views: yet another bugfix (#15447)
      closureiters: fixes #15243 (#15454) [backport:1.2]
      Added std/effecttraits.nim (#15462)
      parser hotfix: don't run into endless loops; regression (#15468)
      remove nim.cfg file change lefover [backport:1.2] (#15469)
      implements https://github.com/nim-lang/RFCs/issues/257 (#15466)
      fixes https://github.com/nim-lang/RFCs/issues/257 [backport:1.2] (#15479)
      const view types; fixes some cases from https://github.com/nim-lang/Nim/issues/15428 (#15488)
      implements https://github.com/nim-lang/RFCs/issues/258 (#15503)
      implements https://github.com/nim-lang/RFCs/issues/260 (#15505)
      disable 'observable stores' warning message for 1.4 (#15507)
      fixes #15508 (#15509)
      docgen: improve alignment of comments (still not perfect) (#15506)
      fixes #15512 (#15521)
      fixes #15510 (#15523)
      fixes #15511 (#15524)
      fixes #15532 (#15534)
      nimpretty: do not produce 'line too long' messages (#15541)
      refactoring: removed cmdlinehelper.mainCommand callback
      refactoring: moved setOutFile to where it belongs
      sigmatch: hotfix [backport] (#15565)
      fixes a C code generator regression, no need to backport, only the 1.4 line is affected (#15569)
      ORC: critical bugfix for the cycle analyser, introduce -d:nimStressOrc for easier stress testing (#15572)
      harden the ORC asyncleak3 test case (#15580)
      ORC: API extensions for 1.4 (#15581)
      renamed '=' to '=copy' [backport:1.2] (#15585)
      fixes #15560 (#15587)
      fixes bootstrapping for any machine that has a Nim already installed [backport:1.4] (#15660)
      fixes #15652 [backport:1.4] (#15679)
      fixes view types for sizeof() and --gc:orc (#15680)
      ensure the Nim compiler works with --experimental:strictFuncs --experimental:views [backport:1.4] (#15737)
      fixes #15413 (#15768)
      fixes #15804 (#15820)
      fixes #15753 [backport:1.4] (#15971)
      fixes db_mysql broken quoting; refs https://github.com/nim-lang/Nim/commit/c16ee37a7106c645a0d17cc6bd8d399e20f61d96#r44209990 [backport:1.4] (#16035)
      makes parsesql .gcsafe [backport:1.0] (#16039)
      fixes #15942 [backport:1.2] [backport:1.4] (#16051)
      fixes #15671 [backport:1.4] (#15690)
      fixes #16069; [backport:1.2] [backport:1.4] (#16115)
      fixes #15076 (#16143)
      fixes https://github.com/status-im/nimbus-eth2/issues/1549 (#16146)
      updated repr tests (#16147)
      fixes #16119 [backport:1.4] (#16149)
      fixes #16154; underlying system.add for seq is the real cause; will be addressed in a follow-up PR (#16161)
      fixes #16214 [backport] (#16252)
      fixes #16249 [backport:1.4] (#16251)
      OSX: support for M1 [backport:1.0] (#16279)
      fixes #16359 [backport] (#16377)
      fixes #16365 [backport] (#16381)
      asynchttpserver cleanups [backport:1.0] (#15966)
      make --gc:arc --exceptions:quirky work again [backport:1.4] (#16583)
      fixes #16897 [backport:1.2] (#16900)
      basic cleanups regarding SSL handling (#16940) [backport:1.0]
      final SSL changes [backport:1.2] (#16983)
      don't introduce 'dispose', use '=dispose', fixes #17003 [backport:1.4] (#17062)
      fixes #17033 [backport:1.4] (#17061)
      fixes #17085 [backport:1.2] (#17101)

Andrey Makarov (1):
      get rid of $READLINK variable (#14841)

Andy Davidoff (7):
      fix typo (#14063)
      simple typo in locks.nim (#14297)
      add arc and orc to gc list (#14653)
      fix docs for nativesocket read/write selects (#15010)
      template hygiene (#15240)
      don't raise index defects on malformed ast (#15278)
      add criterion to important packages (#15604)

Antonis (3):
      Fix for --styleCheck:error
      fix closure env check
      better error message

Antonis Geralis (3):
      Make newObjUninit proc to adhere to its name (#15764)
      Fix doc comment for sumKbn (#15769)
      Improve enumerate (#16053)

Araq (65):
      unicode: minor documention improvement
      refactor system.$ for objects a little; refs #13398
      fix for asm statement; refs #12650
      remove the nilChecks switch; refs #11570
      cleanup PR #14048
      fixes another silly arc/orc bug [backport:1.2]
      fixes the regression #12860 caused; hotfix
      hotfix: make tcompilerapi green again
      fixes a bug encountered when running 'nim check posix_haiku.nim'
      closes #14142
      don't close #14142
      fixes #14177
      fixes #14159 [backport:1.2]
      improve the 'has to be discarded' error message
      update tests that tested for the 'discard' error messages
      cycle collector: make it threadsafe
      fixes #14331
      fixes #13862
      fixes #14340
      document NVRO and exception handling
      spec: be explicit that NRVO will evolve further
      fixes #14562
      reorder.nim: fixes the indentation
      reorder.nim: fixed typos
      added a space
      improve the parser's error message
      fixes #14718 [backport]
      minor bugfixes for 'func' and .borrow
      fixes #14830
      added security.md; refs #14882
      weaken tosproc test for my Windows machine which doesn't have 'ls'
      speed up Nim's lexer by using cstring instead of string. C optimizers are fragile.
      progress
      fixes #14899
      fixes #14900
      fixes #14805
      closes #14878
      cleanup of PR #14833 (VM profiler)
      renderer.nim: more obvious debug output
      optimize sinks even when in a loop
      no wasMoved() calls after destructors necessary
      fixes the tcontrolflow regression, clen idea of an escaping expression
      fixes a minor regression
      threadpool.nim: minor code style changes
      fixes #15056 [backport]
      compiler: minor code cleanups
      fixes a closure iterator memory leaks, progress on #15076
      code cleanup
      more renamings
      deleted dead code, writetracking.nim was replaced by varpartitions.nim
      fixes #15207 [backport:1.2]
      fixes #15021
      arc: =deepcopy fixes
      arc: added tmarshal.nim test case
      'koch temp' bugfix
      minor reformating
      typo
      fixes a regression
      changelog improvements
      attempt to make asynchttpserver better; fixes #15925; [backport:1.0]
      better documentation
      fixes 'nim doc'
      makes test green again
      ported to FreeRTOS
      fixes the doc rendering

Arnaud Moura (2):
      Add package install command for FreeBSD and OpenBSD. (#14051)
      Fix OS detection in a docker container (#13172)

Arne Döring (2):
      fix #13739 (#13742)
      forward type alignment information to seqs (#12430)

Avahe Kellenberger (1):
      Added a reference to ternary operators. (#14309)

BarrOff (1):
      make nim-gdb compatible with BSD systems (#14700)

Benjamin Lee (2):
      Iterate over smaller set when computing intersection (#15497)
      Update the list of GC options when raising an error (closes #15547) (#15553)

Benoit Favre (1):
      Fix bug in removeDotSegments when path ends with dot (#17038) [backport:1.2]

Bung (23):
      fix #14064 xmltree should allow create text node with raw text(non-es… (#14070)
      fix #9771 (#14357)
      docfix: fix wrong link in doc/manual.rst (#14367)
      add SqlPrepared api fix #13559 (#14365)
      add insert,tryInsert unify for postgres that need pk name (#14416)
      add bindParams to db_sqlite (#14408)
      add missing props,procs (#14978)
      fix #13621, the nim-livereload is mentioned as proposal in #8927 (#14998)
      fix #14822 copy test into var in matrix process, so can reset startTime before actully run (#15000)
      Shadow Dom apis (#14979)
      fix #14534 (#15060) [backport]
      fix #14684 (#15059)
      fixes #14189 (#15080) [backport]
      fix #11354 jsgen not carefully handle genAddr with nkHiddenAddr,nkStm… (#15078)
      Fix #11352 strutil.insertSep() fails on negative numbers (#15087)
      add openssl missing procs (#15180)
      avoid #8231, bitwise move to mul,div (#15070)
      Fix #15219 SQL escape in db_mysql is not enough  (#15234)
      export PrettyOptions,prettyPrint from nimpretty (#15865)
      Fix 14127 js from int to int casting (#15918)
      fix #12726 Cannot take the compile-time sizeof Atomic types (#15928)
      Fix #8404 JS backend doesn't handle float->int type conversion (#15950) [backport]
      add parent property to window in dom.nim (#15922)

Chris Heller (1):
      Make debugSend/debugRecv procs public. Fixes #12189 (#12190)

Christian Ulrich (2):
      close socket in getPrimaryIPAddr (#15538) [backport]
      close socket in getPrimaryIPAddr even if exception occurs (#15558)

Christopher Dunn (3):
      Faster readStr() (#14099)
      Fix doc for CountTable (#15561) [backport]
      Fix a problem for long symlinks in conda (#15908) [backport]

Clyybber (85):
      Fix #13872 (#13898)
      Fix #13889 with testcase (#13896) [backport]
      Fix #13972 (#14034)
      Add tests for #8481, #6490 and #4061 (#14083)
      Fix #14160 (#14161)
      Make ./koch temp --gc:arc work (#14186)
      Make unreachable else in case statements a warning instead of an error (#14190)
      Fix the DFA for "unstructured controlflow" (#14263)
      Fix #14270 and add testcases (#14276)
      Fix typo
      Fix #14269 (#14286)
      New "ping-pong" DFA (#14322)
      Fix #14394 (#14395)
      Small improvements for string and char repr with gc:arc (#14400)
      Remove #PRTEMP leftover comment
      Fix #14568 (#14583)
      Add testcases for #11811 and #14315 (#14726)
      Remove outdated comment and copy of length (#14759)
      Add testcase for #14440 (#14771)
      Correct changelog (#14775)
      CI: Install the pkg we cloned (#14770)
      Add testcase for #4796 (#14784)
      Testament: Reenable arraymancer (#14831)
      Update link to parseSpec proc
      Changelog: Tiny style improvement
      Fix #14647 (#14776)
      Fix typo
      DFA and injectdestructors cleanup (#14824)
      Make unreachable code a warning instead of an error (#14816)
      allow packed union (#14868)
      Fix #14396 (#14793)
      Add testcase for #14472 (#14921)
      Fix #14911 (#14922) [backport]
      Add testcase for #14864 (#14928)
      Make arc compile laser again
      Add testcase for #12129 (#14940)
      Cosmetics
      Move `wasMoved` out of `=destroy`
      Update docs and changelog
      Add testcase for #4722 (#14954)
      Add testcase for #12571 (#14955)
      Add testcase for #13815 (#14956)
      Add testcase for #14383 (#14957)
      Add testcase for some old fixed issues (#14960)
      :D
      injectdestructors fixes and refactor (#14964)
      Closes #8426
      Closes #13253
      Closes #10396
      Reenable a few tests
      Fix #14985 (#14988)
      Fix #14990 (#14991)
      repr_v2 improvements (#14992)
      Fix #14994 (#14996)
      Show that a variable is cursor in --expandArc (#15002)
      Fix forward declaration issues in template/macro context (#15091)
      Make explicit {.nimcall.} a seperate calling convention
      Add testcase for #5688
      Fix bootstrapping
      Remove little lies :)
      Use typeflag instead
      Allow pragmas on parameters (#15178)
      Fix #5691 (#15158)
      Big compiler Cleanup (#14777)
      Expand hoisted default params in sem (#15270)
      Better semiStmtList parsing (#15123)
      Fix #15305 (#15311)
      Add testcase for invalid if statement (#15313)
      Add strutils.indentation and make unindent use it (#15264)
      Fix forward declarations in shadow scope contexts (#15386)
      Fix "arraq" typo :)
      Fix typo
      Make useVersion:1.0 disable the proc arg sym change (#15570)
      Fix #15599 (#15601)
      Fix #15639 (#15640)
      Fix commentOffsetA for doc comments (#15643)
      Fix #12410 (#15685)
      Revert "fixes #15280 [backport:1.2] (#15281)" (#15700)
      Try to fix CI failures (#15701)
      Grammar fixes
      Typos
      Tiny unittest doc fix
      Closes #12897 (#15867)
      Add testcase for #14601 (#15677)
      Fix nimsuggest/#117 (#15602)

Cléber Zavadniak (1):
      Fix typo on CoroutineRef* doc (#15179)

Code Hz (1):
      removing `out T` from docs since it no longer working (#16378) [backport]

Constantine Molchanov (1):
      Fix Norm test path. (#14779)

Danil Yarantsev (16):
      Speed up testing of some packages (#14358)
      Fix some typos in the manual [backport] (#14399)
      Disable unused warnings for await in async macro (#14517)
      Disable unused warnings for error await template too (#14531)
      Fix `compiles` for nimsuggest [backport] (#14527)
      Change severity of template instantiation message [backport] (#14526)
      Fix #14570 (#14571)
      Reject casts to builtin typeclasses (#14788)
      Add test-cases to some fixed issues to close them (#14795)
      Remove double entry for thiscall (#14842)
      Fix some typos (#14843)
      Add a testcase for #14480. Fixes #14480 (#15037)
      Add a test-case for #12990 (#15072)
      Add test-cases for #12576 and #12523 (#15085)
      Add tests to #15363 (#15633)
      Add support to the latest LibreSSL version (#15715) [backport:1.2] [backport:1.4]

David Krause (1):
      added testament documentation link to tools.rst (#15481)

Dean Eigenmann (1):
      Update btrees.nim (#14916)

Dien Tran (1):
      Move generated tex file to doc to correct location (#14191)

Dominik Picheta (5):
      Fixes issues with dynamic loading OpenSSL. Fixes #13903. (#13919) [backport]
      Emscripten: disable epoll (#14361)
      Clarify imported exceptions note in manual
      Revert commit 3e843ab3358. Closes #14930.
      [Backport] Fixes callbacks being dropped on Linux/macOS/BSD. (#15012)

Dylan Modesitt (1):
      Close#5586 (#14682)

Elijah Shaw-Rutschman (1):
      Add test coverage for atomics (#15193)

Euan (14):
      #12103 - CI for OpenBSD (#12105)
      Ref #14075 - enable two tests which seem to now be passing locally on FreeBSD. (#14076)
      Fix #14091 and #14093 - test failures on NetBSD (#14096)
      Fix #14088 and #14089 on NetBSD (#14104)
      Use cc on OpenBSD and link to libm when building result (#14672)
      Set cincludes and clibdir for FreeBSD, OpenBSD and NetBSD. (#14680)
      Fix #14715 - detect tool fails on FreeBSD (#14716)
      Patch #14716 - add missing `when` (#14792)
      Change clibdir and cincludes for NetBSD (#15102)
      Use sysctl on NetBSD to get exe name (#15359)
      Fix #15452 - ip protocol not defined on NetBSD (#15453)
      Ref #14094 - disable hot code reloading tests on NetBSD (#15458)
      Fix #15493 - disable TLS emulation for NetBSD (#15494)
      Fix FreeBSD build failures (#15613)

Fanael Linithien (1):
      Fix #15909 (#15914)

Frank Paulo Filho (1):
      Make build_all.sh file executable (#14518)

Frank Schmitt (1):
      docs: fix syntax error in hotCodeReloading example (fixes #14380) (#14381)

Gampol T (1):
      Fix #13609 (#15567)

Hendrik (1):
      fix index error (#14974)

Hessam Mehr (2):
      Add support for `zig cc` as C compiler. (#13757)
      Treat zig like clang/gcc wrt integer arithmetic. (#13957)

Hiroki Noda (2):
      doc: fix comment for repr*(x: char): string (#13873)
      Set O_NONBLOCK flag atomically (#13934)

Hugo Granström (1):
      fix #15033 (#15034)

Huy Doan (1):
      Add thiscall calling convention, mostly for hooking purpose (#14466)

Héctor M. Monacci (1):
      Correct typo (#16972)

IDF (2):
      Add SSL_CTX_set_session_id_context (#15233)
      New hint for unused exceptions in .raises (#15492)

Ico Doornekamp (4):
      manual: removed subjective phrase from 'macros' section (#14536)
      Added --benchmarkVM to times.cpuTime() documentation (#14663)
      VM profiler (#14833)
      Added array type definition to manual (#15173)

Igor Ribeiro de Assis (2):
      Fix crash in parsexml (#15582) (#15583)
      Do not read the whole file to compute SHA1 hash (fixes 15997) (#16006)

Ivan Bobev (2):
      Change `UnpackError` with `UnpackDefect` (#14457)
      Add some enhancements to `jsonutils.nim` (#15133)

Jacek Sieka (1):
      Error -> Defect for defects (#13908)

Jae Yang (1):
      Fixes #14110 (#14111)

Jaremy Creechley (2):
      Changes for FreeRTOS/LwIP Port for the ESP32 (ESP-IDF) (#15250)
      Fixing issue #15302 -- lwip doesn't support signals (#15303)

Jason Beetham (1):
      Fixed iteration limit hit from execproc (#15723) [backport:1.2] [backport:1.4]

Jasper Jenkins (1):
      allow generic typedesc field access (#12220)

Jjp137 (1):
      parsecsv: fix '\0' being displayed as '0' in docs (#15086) [backport]

John (1):
      add OpenBSD MAP_STACK for coroutines (#14353)

John Dupuy (1):
      Added more SSL documentation to `net` module. (#15206)

Jon (1):
      fix in doc: incomplete output (#15222) [ci skip]

Jovial Joe Jayarson (1):
      refactor: renamed readme to readme.md (#14283)

Juan Carlos (49):
      Make unused code into actual test, replace echo with doassert (#13952)
      Add jsdomparser (#13920)
      Add Data URI Base64, implements RFC-2397 (#13759)
      Documentation Fix Typo, Add Table (#14609)
      Documentation update a description (#14619)
      Add rstgen.rstToLatex convenience proc for renderRstToOut and initRstGenerator with outLatex output, see https://github.com/nim-lang/fusion/pull/11#issuecomment-641804899 (#14629)
      Change 'Future Directions' to link memory management documentation (#14664)
      Documentation update nims.rst (#14683)
      Deprecate unroll pragma, remove from documentation (#14705)
      Deprecate and/or remove ospaths (#14767)
      Documentation GC (#14739)
      Deprecate oldNewlines, clean out deprecated code from oldNewlines (#14763)
      Deprecated laxStrings for mutating the internal zero terminator on strings and its Deprecated code cleaned out (#14766)
      Clean out Deprecated proc (#14797)
      Clean out oldast (#14837)
      Clean out dom (#14855)
      Removed asyncdispatch.newAsyncNativeSocket, was deprecated since 0.18 (#14854)
      Clean out sharedtables (#14858)
      Clean out strutils (#14859)
      Clean out sharedlists (#14857)
      Add jsre (#14870)
      Fix logging tiny bug (#14910)
      https://github.com/nim-lang/Nim/pull/14948#issuecomment-656498426 (#14958)
      Clean up macros (#14959)
      db_postgres document how to use it with unix socket (#15187)
      Remove unroll pragma from stdlib (#14706)
      Improve prelude so it does not hijacks documentation when used (#15299)
      Fix #15183 (#15300)
      dom.Navigator add missing attributes (#15310)
      Remove Deprecated {.this:self.} from Documentation so people dont use it anymore (#15328)
      Add documentation for Testament (#15344)
      Documentation prelude (#15377)
      Add 1 overload to apply (#15439)
      Clean out jssys (#15442)
      Clean out (#15440)
      Clean out (#15448)
      Add critbits.toCritBitTree (#15444)
      Clean out niminst (#15451)
      inline tiny func on httpcore (#15480)
      GitHub Actions Skip CI (#15289)
      inline tiny proc (#15498)
      Fix Prelude (#15714)
      Documentation only iup (#15732)
      Fix #15806
      Fix #15806
      Fix #15806
      Fix #15806
      https://github.com/nim-lang/Nim/pull/15968/files#r523468677
      htmlgen: Add lazy loading (#15986)

Judd (1):
      fix mapIt issues #12625 & #12639 (#14041)

Kaushal Modi (6):
      Document that proc named fooTask is created for every foo task [backport] (#14187)
      Make --backend:cpp|js work for :test: code-blocks as well (#14306)
      Fail quickly if re or nre module is attempted to be compiled with js [backport] (#14341)
      Remove the uses of {.procvar.} pragma (#14359)
      Propagate the outDir to rstgen to fix hrefs for modules in subdirs (#14479)
      Clarify the use of the backwards index operator (^N) in tut1 (#14681)

Keithcat1 (1):
      Add LTO support for most compilers and do some VCC fixes (#14013)

Khronos (1):
      Fix a problem with extra build commands. (#14528)

Leorize (29):
      nativesockets: add missing inheritable pass-through
      asyncnet, net: call SSL_shutdown only when connection established
      untestable/thttpclient_ssl: catch errors caused by the bad catergory
      untestable/thttpclient_ssl: fix 10000-sans test
      untestable/thttpclient_ssl: fix macos
      net: don't clear all errors on close
      thttpclient_ssl: be less specific
      Revert "net: don't clear all errors on close"
      net: don't clear error queue unless shutdown() will be performed
      openssl: fix erroneous function signatures
      asyncnet, net: clear openssl error queue before performing I/O
      net: use a secure cipher list by default
      untestable/thttpclient_ssl: move incomplete-chain to dubious_broken
      untestable/thttpclient_ssl: some tests are no longer broken
      ssl_config_parser: refactor for sanity reasons
      changelog.md: clarify that only the default has changed [ci-skip]
      asyncnet: clear SSL error queue before performing I/O
      wrappers/openssl: fix SSL_CTX_ctrl signature
      net: enable automatic EC curve selection for OpenSSL 1.0.2
      wrappers/openssl: getOpenSSLVersion is gcsafe
      wrappers/openssl: fix SSL_CTX_set_mode
      net: don't call set_ecdh_auto for super old OpenSSL
      net: use CiphersOld list for Windows
      wrappers/openssl: the version number comes from the utility library
      net: revert compatibility changes for Windows
      wrappers/openssl: enable SSL_CTX_set_ecdh_auto for LibreSSL
      wrappers/openssl: mark casts as gcsafe
      net: also set TLSv1.3 cipher suites
      wrappers/openssl: defer loading SSL_CTX_set_ciphersuites

Luca Guzzon (1):
      Console apps in Windows can raise OSError (#15874)

Luis Felipe Manfroni (1):
      doc(sugar): added description and examples to dup (#15455)

Lưu Danh, Hiếu (1):
      Update code example to match new sdl2.nim syntax (#13924)

Mamy Ratsimbazafy (2):
      The whole options module should be inline (#14417) [backport:1.2]
      Use more `lent` in options (#15208)

Manuel Bojato (3):
      Fix nimdoc invalid css on theme switch class (#14834)
      docs: Make `..<`, `.. ^` more discoverable (#14835)
      Fix theme switch load from local storage (#14897)

Max Grender-Jones (2):
      Add support for mktemps (#14347)
      Make the example better describe the desired outcome (#14611)

Mildred Ki'Lya (2):
      Add missing attributes and methods to JavaScript DOM (#14428)
      smtp: Fix STARTTLS, request HELO once TLS is established (#15032)

Miran (46):
      Test packages on Linux (#13921)
      add timezones package to important_packages (#13987)
      make fuzzy search a bit less fuzzy (#13996) [backport:1.2]
      use newer nodejs on Azure Pipelines (#14065)
      add 14 more packages to 'important_packages' (#14141)
      change 'iff' to 'if' to stop "corrections" once and for all (#14182)
      Split testing important packages into two jobs (#14256)
      install gtk3 on osx for package testing (#14388)
      Remove deprecated stuff from stdlib (#14699)
      fix #14750, don't allocate too much in newWideCString (#14773)
      [backport] fix #14748, move gdb files to other section of installer.ini (#14772)
      fix #14401, trailing comma confuses nimpretty (#14867)
      remove a condition that table size must be passed as power of 2 (#14926)
      fix #14912, make `--useVersion:1.0` work again (#14945)
      asyncftpclient.nim - don't assume a sufficiend line length (#14973)
      fix #14082, don't crash on incorrectly formatted input (#14977) [backport]
      fix several newline problems (#15028) [backend]
      Change testing commands for some packages (#15041)
      json.nim: smaller init size (#15048)
      jsre: try to fix nightlies (#15057)
      deprecate tables.add (#15047)
      fix nightlies: smaller log files (#15074)
      deprecate tables.allValues; continuation of #15047 (#15092)
      [backport] fix #15064, strscans.scanf edge case for '$+' (#15223)
      remove deprecation from `math.round` (#15224)
      fix #15257, `toHex` couldn't handle large uint64 (#15261) [backport:1.2]
      "for-loop macros" are no longer an experimental feature (#15288)
      deprecate `high(value)` and `low(value)` (#15283)
      fix warnings for deprecated `low` and `high` (#15291)
      close #6071, remove the mentions of deprecated `docSeeSrcUrl` (#15350)
      fix #6430, support `:target:` for images (#15379)
      add `enumerate` macro (#15297)
      fix the indentation in `--help` and `--fullhelp` (#15387)
      fix #14474, crash inside of a sole code-block (#15402)
      fix #11537, correct parse inline code without surrounding spaces (#15399)
      various documentation fixes [backport] (#15422)
      group procs of the same name in TOC (#15487)
      [backport: 1.4] Better linebreaks (#15658)
      fix `toHex` - make it work with int literals (#15770)
      promote `collect` macro as a map+filter replacement (#15788)
      fix #15702, show enum fields documentation (#15792)
      Correct all eggs (#15906)
      fix #16047 (#16066)
      fix export links in the documentation (#16114) [backport:1.4]
      [backport:1.2] update the nimble commit hash to the latest one (#16971)
      [backport:1.2] update nimble commit hash (#17109)

Neelesh Chandola (2):
      Undefine `paramCount` & `paramStr` in nimscript.nim for *.nims (#12860)
      disallow typedesc in arrays & move existing checks to `types.typeAllowedAux` (#13261)

Nicolai Søborg (1):
      json doc: Note about Option and reserved keywords (#13895)

Oliver Daniel (1):
      Small typo (#15132)

Oscar Nihlgård (4):
      Fix semfold handling of {.str/int/bool-define.} (#13964)
      Times refactorings (#13949)
      Remove some deprecated procs from std/times (#14129)
      Make the fields of `times.DateTime` private (#14197)

PMunch (7):
      Fix #14066 issue with stringifying incomplete types (#14135)
      Add RSA key reading and encrypt/decrypt to openssl (#14137)
      Add procedures to read RSA keys from BIO format (#14223)
      Allow let to not have value when using importc (#14258)
      Improve nimeval, changes some defaults (#14351)
      Improve JSON serialisation of strtabs (#14549)
      Fix sets for architectures with default integers smaller than 32 bits (#15258) [backport]

Paul Tan (1):
      effects: exclude swap() from "indirect calls" assumption (#15504)

Phil Krylov (1):
      Add critbits.commonPrefixLen (#14072)

Ray Imber (2):
      Fix asyncdispatch drain behavior (#14820) (#14838)
      Improvements to Windows install instructions (#15099)

RecruitMain707 (1):
      Fix compilation error for regions and memory profiling (#15641) (#15656)

RokkuCode (1):
      fixes #16080 (#16091) [backport:1.2]

Rory O’Kane (1):
      docs: move `not nil` to the experimental page (#14027)

Scott Wadden (2):
      Raise KeyError if passed an invalid row entry (#15227)
      nimeval errorHook support (#15255)

Serban Constantin (1):
      update unittest docs with correct exit code info (#15502)

Silvio (2):
      docs: dlimport -> dynlib (#15175)
      replace / with _ in trId (#15256)

Sizhe Zhao (2):
      Fix missing comma (#14829)
      Warn about calling wrappers at compile time until #14049 is fixed. (#14828)

Thomas Tay (1):
      Update tables documentation (#15807)

Tim Smith (1):
      Spelling and Grammer fixes (#15719)

Timothee Cour (149):
      add nimPath to nim dump (#13876)
      fix https://github.com/timotheecour/Nim/issues/88 (#13865) [backport:1.2]
      openDefaultBrowser now works on OSX (#13892) [backport]
      fix some codegen bugs: NIM_BOOL, NIM_STATIC_ASSERT, --passc:-std=... (etc) (#13798)
      fix #13902 distinct uint64 type corruption on 32-bit with borrow (#13907) [backport:1.2]
      fix #13848: make var result work with nim cpp (#13959)
      fix #12864 static params were mutating arg types during sigmatch; fix #12713 ; refs #13529 (#13976)
      enable important_pkg on OSX (#13954)
      Fix https://github.com/inim-repl/INim/issues/66 (#13984)
      fix newDomParser (#13981)
      fix https://github.com/nim-lang/RFCs/issues/211: `var a: DateTime` compiles and is usable (#14002) [backport:1.2]
      add `--experimental:vmopsDanger`; add generic conversion for vmops (#13813)
      fix #13222: make relativePath more robust and flexible (#13451)
      fix globalOptions (#14059)
      new cmd: `nim r main [args...]` to compile & run, saving binary under $nimcache/main (#13382)
      CT sizeof(+friends) for {.importc, completeStruct.} types, enable ABI static checks (#13926)
      add CI badges for azure-pipelines for devel, 1.0, 1.2 branches (#14101)
      [ci skip] changelog conflicts are a thing of the past (#14098)
      fix nim CI; fix local testament (#14102)
      add CI badges for CI github actions ssl+docs
      since now takes an optional patch, eg: `since: (1, 3, 1)` (#14124)
      fix #14132 dsymutil should not be called on static libraries (#14133) [backport:1.2]
      `$(a: float)` now works consistently in nim js, avoiding printing floats as ints (#14134)
      `$` now works for  unsigned intergers with `nim js` (#14122)
      `echo cmd | nim r - -arg1 -arg2` now works (#14210)
      fix https://github.com/timotheecour/Nim/issues/152: avoid writing spurious `^[[0m` to stderr when callStyledWriteLineStderr not called (#14214)
      fix js stacktraces, unify all file,line,col formatting into a single function (#14230)
      fix regression: -d:nimHasLibFFI was not being tested anymore (#14234)
      fix root cause of https://github.com/dom96/choosenim/issues/193; config/config.nims should get installed
      fix https://github.com/nim-lang/Nim/issues/14275 querySetting(nimcacheDir) works even if implicitly set (#14277)
      --hint:processing (+friends) is now supported and means `--hint:processing:on`, like all other bool flags (#14271)
      `nim doc -r main` and `nim rst2html -r main` now call openDefaultBrowser (#14285)
      diable nimx (CI failure) refs https://github.com/timotheecour/Nim/issues/167 (#14293)
      fix a critical bug in windows.osproc leading to resource leaks and blocking IO [backport] (#14296)
      `nim doc --backend:js`, `nim doc --doccmd:-d:foo`, `nim r --backend:js`, `--doccmd:skip` + other improvements (#14278)
      properly fixes #13758 so that `import std/macros` stays legal (#14291)
      fix #14314 do not analyze importc procs for effects (#14319)
      close #13071 by adding test: nim cpp -r --gc:arc` segfaults on caught AssertionError (#14323)
      fix #14320 (tasyncawait.nim is recently very flaky) + avoid hardcoding service ports everywhere + flakyAssert (#14327)
      `osproc.execCmdEx` now takes an optional `input` for stdin, `env`, workingDir (#14211)
      no more guessing where compiler msgs came from (#14317)
      fix some issues with --backend (#14363)
      close #12746; minor cleanup (#14379)
      fix #12293 findNimStdLibCompileTime should not break with nimble install compiler (#14334)
      fix #14174 do not collapse pragma inside runnableExamples (#14385)
      refs #14369 improve docs for importcpp exceptions (#14391)
      trunner was not actually being tested in non-CTFFI mode; minor testament cleanups (#14377)
      fix #10731 ; `runnableExamples "-b:cpp --run:off": code` works (#14384)
      fix comment from https://github.com/nim-lang/Nim/commit/e909486e5cde5a4a77cd6f21b42fc9ab38ec2ae6#r39287564 (#14412)
      fix #14404 foldr had the classic multiple evaluation bug (#14413)
      [cleanup] fix UnusedImport sempass2 compiler/semparallel.nim (#14426)
      no more code duplication bw liMessage and rawMessage + several bug fixes (#14415)
      add test for `define`, `undef` (#14443)
      fix #6583, fix #14376, index+search now generated for all projects, many bug fixes with nim doc (#14324)
      fix #9227 procs can now have multiple interleaved doc comments + runnableExamples and be docgen'd correctly (#14441)
      tnimblepathdollarfail.nim -> tests/nimble/tnimblepathdollar_fault to reduce false positives when searching for `fail` in CI logs (#14450)
      docgen: fix #14448 show @@ as .. in href text (#14451)
      docgen: mangling using _. instead of @@ to avoid issue (#14454)
      make it easier to figure out how to debug issues (#14477)
      close #14284 document semantics for start for re,nre; improve examples (#14483)
      fix #8871 runnableExamples now preserves source code comments, litterals, and all formatting; other bug fix (#14439)
      fix #14485 (#14487)
      hotfix doc comments for procs without body (#14494)
      fix #14421 items uses lent T (#14447)
      enable compiler docs with their own index+search (#14493)
      fix CI doc windows: style error in lib/std/time_t.nim (#14523)
      runnableExamples: correctly handle multiline string litterals (#14492)
      walkDirRecFilter, update doc CI filter,  compiler/index.nim for docs + various other fixes (#14501)
      fix https://github.com/timotheecour/Nim/issues/266 retry on failure to avoid common 503 github errors (#14547)
      * honor --errorMax even for tools (eg drnim, nim doc) (#14546)
      [cleanup] docgen: remove docOutdir now that outDir is always set (#14554)
      bug fixes with sfMainModule, hints, mainPackageNotes, mainPackageId, hintSuccessX (#14555)
      refs #14545 fix snippet errors: avoid showing confusing errors when they are expected (#14569)
      remove isMainModule from json,os,sequtils (#14572)
      fix #14576 addr of param (including for lent) now works with nim js (#14577)
      hotfix disable nitter refs https://github.com/timotheecour/Nim/issues/167 (#14603)
      `toJson`, `jsonTo`, json (de)serialization for custom types; remove dependency on strtabs thanks to a hooking mechanism (#14563)
      enable tioselectors on osx; more diagnostic for #13166 (#14625)
      parseutils: integerOutOfRangeDefect => integerOutOfRangeError (#14627)
      fix #14545 windows CI docs (#14590)
      Disable tfdleak_multiple on platforms other than Windows (#14624)
      remove tyOpt, mOpt (#14636)
      fix #13166 tioselectors flaky test on freebsd+OSX (#14634)
      fix #14655 setLen(seq) now zeros memory (#14656)
      normalizeExe (#14668)
      make `fromJson/toJson` work with `array[range, typ]`, + 1 bugfix (#14669)
      make tests/stdlib tests joinable (#14626)
      misc cleanups in compiler msgs: use toHumanStr, etc (#14677)
      `hintMsgOrigin` now works in VM code (#14678)
      fix #14179, fix #14142, make CI 1.4x faster (2x faster locally) (#14658)
      `addQuitProc` now works with closures, and c, js(node/browser) backend; fix some bugs in testament (#14342)
      cleanup tests/test_nimscript.nims (#14686)
      use check to investigate #14685 flaky tests/async/t7758.nim (#14689)
      remove compilerproc from `newIdentNode` (#14692)
      [cleanups] doassert => doAssert; mark deadcode (#14711)
      fix #14691 docgen works again for methods (#14701)
      add legacy workaround; improve test so that it actually tests for the bugfix
      fix #14685 tests/async/t7758.nim flaky (#14721)
      fix #13899 defer now works with async (#14723)
      nep1: use subjectVerb, not verbSuject (#14732)
      unbreak CI, refs https://github.com/timotheecour/Nim/issues/167 (#14765)
      fix bug in semgnrc: runnableExamples should not semcheck, even with > 1 arg (#14768)
      misc testament cleanups (#14764)
      fix #10343 (#14789)
      fromJson: support object variants (#14694)
      add typetraits.elementType (#14780)
      fix #14802 (#14803)
      expr => untyped; stmt => typed (#14804)
      followup after https://github.com/Vindaar/ggplotnim/pull/74 wrt #14447 lent iterators (#14817)
      update contributing.rst and docstyle.rst: refer to a bug via `bug #1234` + other guidelines (#14796)
      testament: generic N-fold batching: windows CI 37mn=>16m (#14823)
      fix `./koch tests` following #14823 (#14845)
      fix #13432 typetraits.$: $(int,) is now (int,); $tuple[] is now tuple[] (#14799)
      CI openbsd: 3x batching via NIM_TESTAMENT_BATCH ; overall CI finishes in 21m instead of 34m (#14851)
      fix #14846; add macros.extractDocCommentsAndRunnables (#14849)
      cleanup comment now that #14434 was fixed (#14874)
      {.deprecated: [existsFile: fileExists].} (#14735)
      typetraits.$: $((int, float), int)` is now `"((int, float), int)"` instead of `"(tuple of (int, float), int)" (#14812)
      deprecate existsDir; use dirExists instead (#14884)
      fix #14475; unittest.require now works with `nim c`; require and check now works with -d:nodejs (#14676)
      enable,document,test getImplTransformed, very useful for understanding how nim transforms code (#14924)
      fix #14698 nkRecWhen caused internalAssert in semConstructFields when generic type not mentioned in fields (#14709)
      doc fix typo in lib/pure/httpclient.nim (#15364)
      document that items no longer works with enum with holes (#15426)
      close #13081 (#15529)
      fix gitignore for testament cruft (#15530)
      followup after #15529 and #15534 (#15536)
      os: add overload copyFile*(source, dest: string, isDir = false) (#15537)
      unbreak CI: fix logic for skipping ci (#15556)
      dup docs: add an example with `addQuoted` (#15548)
      reference fusion docs (#15562)
      ci docs: add config/nimdoc.cfg to paths (#15566)
      $(uint|uint64) now works with nimscript (#15644)
      [minor] nimVMDebug: fix codeListing formatting for jump-to-file to work (#15711)
      close #8007 (#15695)
      fix #15704 #15597 wrong VM register was freed (#15705)
      [backport] fix #15595 procvar `==` works in VM (#15724)
      simplify toHex (#15821)
      strengthen taddr.nim: add test case for #14578; reference other issues; test cpp (#15960)
      targets: use cpp instead of c++ everywhere (was by far the most common) (#15961)
      workaround #15713 disable freebsd tssl.nim (#15718)
      remove unused and misleading FilenameOption.foShort (#15982)
      defer: improve manual, clarify difference wrt try/finally (#16010)
      fix #16033 nim js --gc:arc works and ignores --gc:arc (#16036)
      remove all mentions of doc2, jsondoc2 (except 1 mentioning the alias) (#15683)
      [backport => 1.0] fix #16428 vmops now works for generic procs (#16429)
      [backport 1.0] add backend support for js bigint (#16606)
      typetraits: make genericHead docs reflect reality; use runnableExamples (#16776) [backport:1.4]
      followup #17001: improve coverage for tests/openarray/topenarray.nim (#17006)

Tomohiro (5):
      Fix sugar.dump: It doesn't work correctly with compile time expression (#14580)
      Fix #12745 (#14879)
      Limit number of error messages from gcc/clang backend (#14852)
      Fix #14906 (#14949)
      Fix osproc so that it doesn't close pipe/process/thread handles twice (#16385) [backport]

Tomáš Hübelbauer (1):
      Remove bit about opening files not raising (#15654)

Tristram Oaten (4):
      Fix broken async httpclient example
      New runnableExample for `newAsyncHttpClient()` (#14045)
      Remove travis ci badge (#14062)
      Re-enabling INim (#14215)

Viktor Kirilov (1):
      HCR: properly handling complex const objects in the codegen - fixes #13915 (#14115)

Vindaar (1):
      base `parseEnum` on a case statement, fixes #14030 (#14046)

Xavier Noria (1):
      Document implicit return values from procedures (#15738)

Yanis Zafirópulos (2):
      Copy editing (#15733)
      Massive documentation fixes + copy editing (#15747)

Yuriy Glukhov (2):
      Fixed undeclared nimIdentNormalize compilation error in parseEnum (#15343)
      Dont assert on setstacksize result in iOS (#15427) [backport:1.2]

Zed (1):
      Fix asynchttpserver newline breaking content-length (#14565) [backport]

aguspiza (1):
      SSL_CTX_load_verify_locations parameters are reversed (#14815) [backport]

alaviss (42):
      asyncdispatch: get rid of erroneous set constructions (#13877)
      posix: add full Haiku support (#13931)
      osproc: added a better version of waitForExit for Haiku (#13938)
      compiler/suggest: highlight squashed operators (#11796)
      Make file descriptors from stdlib non-inheritable by default (#13201)
      asyncdispatch: export Callback (#14042) [backport]
      tools/finish: don't quote path with space (#14058) [backport]
      testament: don't rely on Nim source structure [backport:1.2] (#14077)
      testament: don't try to test nimgrep if it's not there [backport:1.2] (#14085)
      net: remove more erroneous set constructions (#14252) [backport]
      tslow_tables: wait for an additional 2 seconds (#14266)
      asyncdispatch, asyncnet: add inheritance control (#14362)
      niminst: use threaded compression when supported (#14455)
      Revert "niminst: use threaded compression when supported (#14455)" (#14462)
      io: correct signature for some win32 apis (#14551)
      tfdleak: fix flakyness on Windows (#14550)
      openssl: use explicit result for SSL_in_init (#14597)
      tools/kochdocs: add log folding supports for more CI services (#14643)
      compiler/commands: make gitHash settable at compile-time. (#14654)
      encodings: use only one iconv definition [backport:1.2] (#14741)
      posix_other: add define to force time_t to 64 bit [backport] (#14753)
      koch: add --localdocs to allow building only local docs (#14783)
      typetraits: features and fixes (#14791)
      io: fix SetHandleInformation signature to match Windows' (#15017)
      koch: use in-tree Nim to run test if possible (#15018)
      koch: bundle nim-lang/fusion with Nim (#15061)
      Small optimization for the CI pipeline. (#15088)
      asyncnet, net: don't attempt SSL_shutdown if a fatal error occurred (#15066)
      ci_docs: build fusion docs (#15127)
      net: allow close() to ignore SSL failures due to disconnections (#15120)
      asyncnet: don't try to close the socket again [backport] (#15174)
      gc_regions: cleanup & fixes for deallocation (#11920)
      doc/nimdoc.css: align field names to the right (#15217)
      os: make getApplFreebsd available for NetBSD (#15381)
      koch, compiler: bundle fusion as part of the source archive (#15409)
      koch: unify nimble building scripts [backport:1.4] (#15443)
      tools/deps: fix git dir check (#15470)
      koch: remove c2nim from windows release builds (#15471)
      niminst: restore ZIP building functionality (#15472)
      renderer: use the biggest integer type for masking literals (#15482)
      terminal: fix fgColor/bgColor commands [backport] (#15554)
      suggest: try to find the implementation of a symbol when def is used (#15555)

archnim (1):
      Added the ability to initialize a deque with an openArray (#15138)

awr1 (5):
      added extended msg for failed library loads w/ incorrect DLL formats (#13950)
      Make bitand, bitor, bitxor varargs-friendly  (#13985)
      Added bitslice operations for bitops (#14016)
      Fix runnable examples for bitops (#14247)
      Minor improvements to typecast section of manual (#14896)

b3liever (3):
      small refactoring (#14303)
      fix detecting closure env for nested asts (#14326)
      added normal variate function (#14725)

c-blake (7):
      Add `hashWangYi1` (#13823)
      Add `proc find` to `heapqueue` (#14628)
      Fulfill https://github.com/nim-lang/Nim/pull/14995#issuecomment-664914391 (#15104)
      Attempt to explain better why delImplIdx is the way it is.  Maybe this can (#15108)
      Add `iterator inotify_events` which is *almost always* needed logic for (#15152)
      Add first draft of new osproc.readLines (#15429)
      Clarify the sense in which Nim supports recursive iterators in the (#15834)

cooldome (69):
      Fix sym owner in wrapper proc (#13878)
      fix #13910 (#13917)
      fix #13909 (#13914) [backport:1.2]
      fix ICE in isUnresolvedSym (#13925)
      fixes #13863 (#13929)
      error msg for #13864 (#13962)
      Implements RFCs #209 (#13995)
      Step2: fixes #13781, fixes #13805  (#13897)
      fixes #14003 (#14006) [backport:1.2]
      fix #14007 (#14012) [backport]
      Fixes #14014 (#14029)
      Replace enum fields idents with syms (#14048)
      implement (#14114)
      add FileReader Web API to js dom (#14105)
      bug fix (#14149) [backport:1.2]
      parseEnum_regression (#14150)
      vcc fix (#14222)
      fix #14217 (#14218)
      fixes #14244 (#14248)
      fix #14236 (#14250)
      fix #14243 (#14257)
      fix #14294 (#14301)
      fix #14219 (#14225)
      fix #14312
      fix test
      fix one motr dicriminator bug
      fix #14333 (#14336)
      fix #14369 (#14386)
      docs:getCurrentException() and getCurrentExceptionMsg() are not available for imported exceptions (#14392)
      make get for options use lent T (#14442)
      Implement rendering of `[]=`, `{}`, `{}=` braces (#14539)
      fix odbc regressions (#15009) [backport]
      implement (#15153)
      fix sqlgetdata regression in odbc (#15161)
      fix #15035 (#15236)
      fix #15238 (#15262)
      Fix #15286 (#15292)
      Introduce explicit copy (#15330)
      proc params as syms (#15332)
      fix #15326 (#15341)
      Fix #15389 (#15390)
      Revert "fix #15035 (#15236)" (#15408)
      fix #15405. deepcopy arc (#15410)
      fix #15516 (#15518)
      fix gc:arc in nimscript (#15525)
      Fix 15543 (#15544)
      Tables, use sink val arguments more actively (#15625)
      arc allocation method aligned (#15588)
      fix #15662 (#15678)
      fix #15752 (#15754)
      ARC now capable of custom extra alignment. Ref, closure and seq support. (#15697)
      fix #15756 (#15761)
      canAlias improvement (#15773)
      fix static[Slice[T]] as argument issue (#15842)
      Use modern enums in compiler (#15775)
      close #11142 (#15847)
      Fix #12636 (#15850)
      fix #15609 (#15856)
      static[T] related fixes (#15853)
      fix #15707 (#15870)
      Fix #15858 (#15887)
      Fix 15629 (#15888)
      fix #15825 (#15894)
      fix #15910 (#15984)
      Semfold for nil cast (#16030)
      fix #15958 (#15970) [backport:1.4]
      fix #16110 (#16117)
      fix #16120 (#16145)
      fix #15043 (#16441) [backport:1.4]

djazz (1):
      httpcore: Add http code 308 Permanent Redirect (#14639)

ee7 (9):
      exceptions.nim: Fix a bad `Error` -> `Defect` renaming (#14621)
      [backport] Docs: Fix broken `code-block` (#14749)
      tables.nim: Add named fields in `smallest` and `largest` (#14919)
      deques.nim: Refactor the `toDeque` functionality (#15166)
      intsets.nim: Add `toIntSet` proc (#15460)
      heapqueue.nim: Add `toHeapQueue` proc (#15459)
      changelog.md: Group the new `to` procs (#15522)
      CI(actions): Replace deprecated `add-path` commands (#15892)
      Docs(strutils): Fix broken links (#15912)

flywind (122):
      add debug fmt string like python's (#14808)
      add docs and more tests for debug format strings (#14861)
      Add testcase for #10465 (#14943)
      fix #11009 (#14935)
      add testcase for #4668 (#14946)
      add testcase for #5926 (#14965)
      Fix #12759 (#14967)
      fix #6608 (#14963)
      fix #13086 (#14987)
      fix #15006 (#15007)
      fixes #14139 (#15107)
      improve epoll docs (#15137)
      export asyncdispatch handles (#15140)
      minor improvement (#15155)
      fix #15148 (#15149)
      more Protocol supports in windows (#15274) [backport:1.2]
      nativesockets docs minor [backport: 1.2] (#15285)
      add getprotobyname (#15273)
      remove annoying messages when creating  orderedTables (#15309)
      fix cookie with comma (#15319)
      test cookies with comma for #15319 (#15322)
      Methods docs improvement (#15338)
      docs minor and #15335 (#15337)
      string is not nil anymore (#15352)
      add testcase for #9710 (#15365)
      add testcase for #7165 (#15368)
      add testcase for #6060 (#15366)
      deinitLock (#15383)
      fix #15333 (#15336)
      use release version (#15400)
      fix doc search(escape HTML code) (#15433)
      [docs minor] unify generates and Generates (#15434)
      use func in httpcore (#15457)
      make testing for prologue more stable (#15491)
      use func in uri module (#15486)
      docs minor (#15550)
      add tests for #7686 (#15771)
      add testcase for #7127 (#15780)
      fix #15638 (#15789)
      add testcase for #9091 (#15791)
      add testcase for #9165 (#15787)
      add testcase for #8012 (#15785)
      closes #7658 (#15784)
      add testcase for #7416 (#15782)
      closes #7374 (#15781)
      closes #6036 (#15779)
      [closes #11625 and closes #2488]add global and threadvar(with `--threads:off` mode ) pragmas supports for JS backend (#15772)
      add testcase for #14227 (#15794)
      [closes #12682]add testcase for #12682 (#15796)
      support par expression as checkpoint (#15802)
      fix #15651 (#15800)
      closes #3670 [add testcase for #3670] (#15808)
      fix #15145 (#15816)
      fix #15815 (#15817)
      fixes #15717
      fix #8821 (#15809)
      Closure iterators are not supported by VM (#15818)
      more clear (#15812)
      fixes #15594 (#15819)
      follow #15818 and close #7109 (#15823)
      fix #12640 (#15829)
      fix deprecated messages regarding high (#15832)
      fix #15835 (#15838)
      close #8457 (#15844)
      close #10307(add testcase for #10307) (#15840)
      change non-working example to  runnableExamples (#15841)
      fix #15463 (#15831)
      fix #15663 (#15839) [backport:1.4]
      fix adding empty sequence to HTTP headers (#15783)
      document #15618 (#15810)
      fix #15851 (#15852)
      follow #11707(add pragmas examples for =>) (#15863)
      close #8829(add testcase for #8829) (#15866)
      fix #12558 (#15864)
      follow #15874(add testcase for #15874) (#15893)
      fix #12471 (#15901)
      close #4318(add testcase for #4318) (#15904)
      fix #14157 (#15877)
      fix #15916 (#15917) [backport]
      change some code-blocks to runnableExamples and correct some errors in docs (#15900)
      make workaround for #15934 and #15620
      add testcase
      fix #15941 (#15948)
      close #2771(add testcase for #2771) (#15932)
      close #13062(add testcase for #13062) (#15956)
      nil
      add testcase for #9754
      minor
      [docs minor]add some tips yo intern.rst
      minor
      rename: stmt -> typed and expr -> untyped (#15989)
      fix #15972 (#15994)
      combine PR#16009 and PR#16012 (#16024)
      fix #6497 (#16027)
      close #14847(add testcase for #14847) (#16045)
      alternative way to fix #16022 (#16064) [backport:1.4]
      heapqueue minor improvement (#16088)
      complex minor improvement (#16086)
      xmltree minor improvement (#16085)
      deques minor improvement (#16084)
      sets minor improvement (#16087)
      fix #9695 asyncmacro: tfuturevar fails when activated [backport: 1.0] (#16090)
      ast minor (#16079)
      fix rope index (#16100)
      correct errors in xmltree docs (#16104)
      ref #5617 add lineinfo to complete (#16102)
      fix ropes format errors (#16106) [backport:1.0]
      typeinfo minor improvement (#16083)
      fix #16103 (#16109) [backport:1.0]
      improve document for heapqueue (#16107)
      move tests to testament (#16101)
      add simple runnableExamples for atomics (#16116)
      ref #16054 remove typed array (#16077)
      improve the documentation of ropes (#16111)
      move tests under the compiler directory to testament (#16096)
      improve docs for prelude (#16135)
      ref #16054 undefine some stuff in JS backend (#16070)
      add testcase (#16156)
      fix #16364 (#16379) [backport]
      fix #16706 (#16717) [backport:1.4]
      [JS] Ref #15952 make toOpenArray works better (#17001)
      fix #17118 (#17119) [backport:1.2]

genotrance (14):
      Improve #12920 fix (#13958)
      Fix #14057 - moveFile should overwrite on Windows (#14433)
      Fix #2408 - add -d:globalSymbols (#14904)
      Bump nimble commit (#15053)
      Bump nimble (#15077)
      Bump nimble (#15114)
      Bump nimble (#15126)
      Bump nimble (#15272)
      Bump nimble (#15304)
      Bump nimble (#15380)
      Bump nimble (#15398)
      Bump nimble (#15539)
      Fix #12027 (#15519)
      Bump nimble (#15573)

haxscramper (1):
      [FIX] strtabs interpolation in nimscript (#15172)

hlaaftana (27):
      Fix unused warning for `$` for empty tuple/objects (#13991)
      clarify tuples and objects in manual, fixes #12486 (#14044)
      Add deques.peekFirst/Last(var Deque[T]) -> var T (#13542)
      change some Exceptions to CatchableError or Defect, fixes #10288 (#14069)
      Make JS not mangle to snake_case (#14086)
      changed type() to typeof() in docs and error messages (#14084)
      small docs fix in typetraits (#14108)
      fixes #14112, tests for #12892, #12671, #11697 (#14125)
      Update grammar.txt with `func` and `as` (#14147) [backport]
      StringStream & more stdlib modules support for JS/NimScript (#14095)
      Fix negative indexed arrays for JS, refs #13966 (#14152)
      many bugfixes for js (#14158)
      JS unittest stacktrace fix, cleanup js repr and inclrtl includes (#14168)
      discardable async procs are now an error (#14176)
      exp. features now in correct manual, closes #11932 (#14195)
      move since from inclrtl to std/private/since (#14188)
      => supports pragmas & names (+ changed behavior) (#14200)
      Clarify JS cstring len (#14184)
      make `from` an operator (#14241)
      fix #14350, cstrings in JS init as null (#14355)
      fix repr(char) example assert (#14437)
      Add /lib/fusion to gitignore (#15295)
      Fix proc generic params ident defs, missing empty (#15412)
      add finally as post expr block [backport:1.4] (#16896)
      Remove declPragmas from lambdas [backport:1.0] (#16966)
      fix #16967 [backport:1.2] (#16976)
      [backport:1.4] JS cstring null fixes (#16979)

jcosborn (7):
      fix codegen bug due to changing existing symbol declaration in template (#14666)
      add full tests from #9463 (#14975)
      fix assignment to converted concept type (#15051)
      fix overloading case with generic alias (#15116)
      fix overloading issue with generic invocation (#15135)
      fix some issues overloading with generics and inheritance (#15211)
      fix infinite recursion in typeRel (#15241)

jiro (2):
      Add runnableExamples to bitops module (#13951)
      Add runnableExamples to critbits module (#13994)

kemifl (1):
      fix #14056 (#16071)

konsumlamm (1):
      Improve documentation for std/sha1 (#16970)

ktamp (3):
      readLine: Unicode support for Windows console
      readLine: Remove recursive imports
      readLine: Fix issues with --gc:arc

kwgchi (1):
      Update readme.md (#14953)

lbartoletti (3):
      Fix link to "rebuilding the compiler" (#14567)
      [OpenBSD] Add arm support (#14608)
      New freebsd platforms (#14801)

lenoil98 (2):
      Add support for FreeBSD/PowerPC64 Little Endian (#15927)
      Update buildsh.nimf (#15945)

lihaifeng (1):
      Update parsecfg.nim (#15513)

lqdev (2):
      fixed #14839 (#14840)
      disabled sink openArray[T] for adding to seqs (#16352) [backport:1.4]

n5m (8):
      document that Nim executable must be included (#15611)
      add tests for #15584  (#15619)
      fix #15631 (#15632)
      expect valgrind test failure on memory leak (#15669)
      add tests for Testament "reject" action (#15709)
      improve public Testament docs (#15710)
      include example of error-marked copy proc (#15886)
      improve Testament docs (#15881)

narimiran (55):
      bump devel version to 1.3.1
      fix #13894, httpclient hang on Http204
      minor fixes in 1.2 changelog [ci skip]
      fix tdistros test which was failing on Nightlies
      test packages with Github workflows
      [ci skip] prevent fail-fast on packages CI
      [ci skip] clean-up CI badges
      test even more packages
      cleanup [ci skip]
      turn 'runnableExample' into 'code-block' to make nightlies green
      revert 0944b0f4
      Fix style inconsistencies due to the previous commit
      fix mistake in times.nim docs
      enable 'nimterop' test
      bump FusionStableCommit to the latest commit
      another bump
      yet another fusion fix
      add stale bot
      stalebot: don't send messages to keep spam down
      put stale limit at 3 years
      limit stalebot a bit more
      stale bot is now active only for pull requests
      PRs with no activity in last year are marked as stale
      [ci skip] fix typo in the manual
      fix broken links in the documentation
      bump NimVersion to 1.3.7
      change case in nimdoc [ci skip]
      bump NimVersion to 1.4.0
      create a changelog for 1.4.0
      add bufixes for 1.4 in its changelog
      cosmetic fixes for the 1.4 changelog [ci skip]
      bump NimVersion to 1.4.1
      it is not "eg", it is "e.g."
      more "eg" fixes
      even more "eg" fixes [ci skip]
      fix #15750
      change/remove deprecated stuff
      fix the incorrect merge conflict of an earlier backport
      fix `norm` package testing command
      remove `codeowners` [ci skip]
      nimdoc: items of ordered lists now have numbers instead of circles
      fix wrongly backported change containing `nextId`
      telling us once about a change is enough [ci skip]
      fix wrong backport containing `idgen`
      bump NimVersion to 1.4.2
      bump NimVersion to 1.4.3
      Revert "make --gc:arc --exceptions:quirky work again [backport:1.4] (#16583)"
      [ci skip] CountTable, remove link to unexisting proc
      disable 'criterion' package
      disable package 'bump'
      disable 'fidget' package
      remove 'tsugar'
      remove tests for not backported stuff
      bump NimVersion to 1.4.4
      remove tests for stuff not available in 1.4

rockcavera (6):
      added high level sendTo and recvFrom to std/asyncnet (UDP functionality) (#14109)
      fix sendTo and recvFrom in asyncnet (#14154)
      Fixes net.recvFrom to work correctly with IPv6 (#14131)
      add a second asyn…
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants