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

'isolated' data for Nim #244

Closed
Araq opened this issue Jul 17, 2020 · 20 comments
Closed

'isolated' data for Nim #244

Araq opened this issue Jul 17, 2020 · 20 comments

Comments

@Araq
Copy link
Member

Araq commented Jul 17, 2020

Proposal to add the concept of 'isolated' data to Nim

This is the evolution of owned ref. A new name, Isolated was chosen
in order to avoid confusions and also because it can be done almost entirely
as a library without bloating Nim's core type system further.

Motivation

We want to be able to pass subgraphs to threads, safely and easily. All
data races should be prevented at compile-time. We are not willing to pay
the price of atomic reference counting in order to do so. We also seek to
avoid Rust's and C++'s many different pointer types. Nim uses ref everywhere
and ref should remain the default pointer type to use. It is safe, efficient
and Nim's optimizers understand it well.

Yet, ref has no concept of unique ownership which is required for effective
message passing without copies. Hence we wrap it inside an Isolated[T]:

type
  Isolated*[T] = object ## Isolated data can only be moved, not copied.
    value: T

proc `=`*[T](dest: var Isolated[T]; src: Isolated[T]) {.error.}

proc `=sink`*[T](dest: var Isolated[T]; src: Isolated[T]) {.inline.} =
  # delegate to value's sink operation
  `=sink`(dest.value, src.value)

proc `=destroy`*[T](dest: var Isolated[T]) {.inline.} =
  # delegate to value's destroy operation
  `=destroy`(dest.value)

Isolated[T] is what a channel should use, comparable to
Rust's "sendable" trait:

proc send*[T](c: var Channel[T]; msg: sink Isolated[T])
proc recv*[T](c: var Channel[T]): T
  ## Note: Returns T, not Isolated[T] for convenience.

proc recvIso*[T](c: var Channel[T]): Isolated[T]
  ## remembers the data is Isolated[T].

How to construct isolated subgraphs

Construction must ensure that the invariant holds, namely that the wrapped T
is free of external aliases into it. To ensure it, we propose a Pony-inspired
recover construct, but named isolate for clarity:

func isolate(x: sink T): Isolated[T] {.magic: "Isolate".}

As you can see, this is a new builtin because the check it performs on x is non-trivial:

If T does not contain a ref or closure type, it is isolated. Else the syntactic structure of x is analyzed:

  • Atoms like nil, 4, "abc" are isolated.
  • An array constructor [x...] is isolated if every element x is isolated.
  • An object constructor Obj(x...) is isolated if every element x is isolated.
  • An if or case expression is isolated if all possible values the expression
    may return are isolated.
  • A type conversion C(x) is isolated if x is isolated. Analogous for cast
    expressions.
  • A field access x.field is isolated if x is isolated.
  • An array/seq access x[i] is not isolated if x is isolated as otherwise
    code like a.send x[i]; b.send x[i] (send to two different channels) might
    compile.
  • A function call f(x...) is isolated if f is .noSideEffect and for every argument x:
    • x is isolated or
    • f's return type cannot alias x's type. This is checked via a form of alias analysis as explained in the next paragraph.

Note: Previously the spec said that f must be .gcsafe, this is not sufficient, we cannot guarantee isolation for a .threadvar location.

Alias analysis

We start with an important, simple case that must be valid: Sending the result
of parseJson to a channel. Since the signature
is func parseJson(input: string): JsonNode it is easy to see that JsonNode
can never simply be a view into input which is a string.

A different case is the identity function id, send id(myJsonGraph) must be
invalid because we do not know how many aliases into myJsonGraph exist
elsewhere.

In general type A can alias type T if:

  • A and T are the same types.
  • A is a distinct type derived from T.
  • A is a field inside T if T is a final object type.
  • T is an inheritable object type. (An inherited type could always contain
    a field: A).
  • T is a closure type. Reason: T's environment can contain a field of
    type A.
  • A is the element type of T if T is an array, sequence or pointer type.

These rules ensure the freedom of potential data races but they can be quite
limiting. It remains to be seen if they suffice in practice. Pony's recover
is actually not a function, but a block of code. It is unclear at this point
if that really adds expressivity or not over this proposed builtin function.

Sugar

We expect the pattern send(isolate(f())) to be very common so we add a
template overload to the channel:

template send*[T](c: var Channel[T]; msg: sink T) =
  c.send(isolate(msg))

Example: send JsonNodes to a worker thread

var ch: Channel[JsonNode]
open(ch)

proc worker {.thread.} =
  while true:
    let t = ch.recv()
    if t == nil: break
    download(t["url"])

var thr: Thread[void]
createThread(thr, worker)

proc prepareTasks(fileWithUrls: string): seq[Isolated[JsonNode]] =
  result = @[]
  for line in lines(fileWithUrls):
    result.add isolate(parseJson(line))

proc spawnCrawlers =
  var tasks = prepareTasks("todo_urls.txt")
  for t in mitems tasks:
    ch.send move t

Next steps

There is now an implementation available in std/isolation. The channel type should use Isolated[T] for ARC/ORC and we need to see how it works.

Future directions

Isolated graphs can also be checked for isolation at runtime via something like func assertIsolated[T](graph: sink T): Isolated[T]. This would use ORC's mechanism for graph traversal and the involved reference counts to determine that no external pointers into graph exist. Since this is a runtime check and not a compile-time guarantee, we will first do without such a mechanism.

Araq added a commit to nim-lang/Nim that referenced this issue Jul 17, 2020
@jangko
Copy link

jangko commented Jul 18, 2020

Isolated itself is a good idea, but restricting channel to isolated is a bad idea. We should be able to use channel not only to move data between threads, but also share data among threads. If channel only accepts isolated, we cannot send immutable-read-only data that can be read by many threads.

"sendable" should also include immutable besides isolated.

@Araq
Copy link
Member Author

Araq commented Jul 18, 2020

But you can do that via atomic refcounting.

If T does not contain a ref or closure type, it is isolated.

The implementation of an atomic pointer uses ptr, not ref so it does count as Isolated.

@bluenote10
Copy link

Just bikeshedding: The name recover seems confusing on first glance, what is it recovering exactly? isolate would play nice with the type name.

@SixteNim
Copy link

Just bikeshedding: The name recover seems confusing on first glance, what is it recovering exactly? isolate would play nice with the type name.

Well, recover has been borrowed from pony. The function name is disturbing though : It suggests that something needs to be repaired. Indeed, isolate explains it better. BTW, I propose to shorten Isolated a bit, simply to
iso. (Another borrowing from pony, I frequently used it in the Nim forum, others did the same.... )

@Araq
Copy link
Member Author

Araq commented Jul 18, 2020

In the implemenation I used the name isolate.

@dom96
Copy link
Contributor

dom96 commented Jul 18, 2020

BTW, I propose to shorten Isolated a bit, simply to iso. (Another borrowing from pony, I frequently used it in the Nim forum, others did the same.... )

I would like to push back against this. Let's make our code readable instead of easy to write.

@Varriount
Copy link

Varriount commented Jul 19, 2020

BTW, I propose to shorten Isolated a bit, simply to iso. (Another borrowing from pony, I frequently used it in the Nim forum, others did the same.... )

I would like to push back against this. Let's make our code readable instead of easy to write.

Plus, we have type aliases. If you have channel-heavy code, you can just do type Iso = Isolated.
"Iso" by itself merely means "equal", which is rather confusing to newcomers.

@SixteNim
Copy link

SixteNim commented Jul 19, 2020

Plus, we have type aliases. If you have channel-heavy code, you can just do type Iso = Isolated.
"Iso" by itself merely means "equal", which is rather confusing to newcomers.

Well, I followed the pony-lang approach. Honestly, the least thing I was confused about pony was the iso keyword that comes with the language. I can offer uno instead, unique node pointer. A pointer that may not be shared. ( where "Node" is any mem struct on the heap that can have refs at its own).

There is another point. iso can be seen as a primitive boxing of ref - boxing without runtime costs (it's not java auto-boxing, beware...) . It indicates more or less the intention of the programmer. The compiler can then infer if the iso property is statically maintained or not, allowing for very basic operations at the moment, e.g. for updates of values like float64 or so. If the compiler can't prove it , it will reset the iso to ref. It is very similar to the was moved property. If then a proc demands iso , the compiler will coerce automatically - inserting a runtime check with isolate - or the programmer him/herself can do it. The one-dollar question is: What is the appropriate behavior if isolate fails? In specific cases, implicit copy could be an option.

"Isolated" is an encapsulating type. Nothing wrong with it, but there will be more than one Isolated, because there are many concepts around. If we already had a stable concept for "Isolated" then we already could find it in almost all established languages. So, fine-graining of "Isolated" should be possible, it should kept open for individual demands and solutions. No perfect world.

For the moment, iso is a simple extension of ref , a single bit away from it only. The runtime coercion will do the trick.

Araq added a commit to nim-lang/Nim that referenced this issue Jul 20, 2020
@Araq
Copy link
Member Author

Araq commented Jul 20, 2020

I expect the name Isolated[T] not to be used often enough to justify a shorter name. template send*[T](c: var Channel[T]; msg: sink T) already hides it successfully. It's time to play with the implementation.

@Araq Araq modified the milestone: v1.4.0 Jul 22, 2020
clrpackages pushed a commit to clearlinux-pkgs/nim that referenced this issue 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…
@Araq Araq closed this as completed Apr 9, 2021
@Araq
Copy link
Member Author

Araq commented Jun 23, 2021

Spec Defect: f must be .noSideEffect, not .gcsafe! See bug #18326

@planetis-m
Copy link

planetis-m commented Jul 20, 2021

Here is another issue, I think, that I encountered. Suppose a cow string implementation, passing a string to another thread via isolate does not enforce uniqueness:

      var a: Isolated[String]
      var b: String
      b.add 'w'
      b.add 'o'
      a = isolate b # wrong! needs to perform a deepcopy
      #b.add 'r'
      let c = extract a
      echo cast[ByteAddress](c.p)
      echo cast[ByteAddress](b.p) # the addresses are the same

Implementation: https://github.com/planetis-m/dumpster/blob/master/cowstrings.nim Maybe an isolate constructor that does =deepcopy is needed?

This is an alternative that works:

  func isolate(value: String): Isolated[String] =
    var a: String
    # do a deepCopy here
    result = unsafeIsolate a

@Araq
Copy link
Member Author

Araq commented Jul 20, 2021

Or maybe override isolate and unsafeIsolate for String?

@planetis-m
Copy link

planetis-m commented Jul 20, 2021

Or maybe override isolate and unsafeIsolate for String?

Yes that's what I did. Except unsafeIsolate since Ive no other way of constructing an Isolate[String].

@obadz
Copy link

obadz commented Oct 18, 2021

f's return type cannot alias x's type. This is checked via a form of alias analysis as explained in the next paragraph.

What if f's return type can't alias x's type, but can alias a subgraph of x. Don't you have to check that none of the deeply nested refs that could be held within x can't make their way into the return type?

@Araq
Copy link
Member Author

Araq commented Oct 19, 2021

Don't you have to check that none of the deeply nested refs that could be held within x can't make their way into the return type?

Yes, indeed and I hope the implementation does that. :-)

@obadz
Copy link

obadz commented Oct 19, 2021

I don't think it does:

import std/isolation

type Z = ref object
  i: int

type A = object
  z: Z

type B = object
  z: Z

func a_to_b(a: A): B =
  result = B(z: a.z)

let a = A(z: Z(i: 3))
let b = isolate(a_to_b(a))

echo repr(b) # [value = [z = ref 0x7f8650b6b050 --> [i = 3]]]
inc a.z.i
echo repr(b) # [value = [z = ref 0x7f8650b6b050 --> [i = 4]]]

Even beyond overlapping subgraphs, it doesn't look like returning an entire ref subgraph is detected?

import std/isolation

type Z = ref object
  i: int

type A = object
  z: Z

func a_to_z(a: A): Z =
  result = a.z

let a = A(z: Z(i: 3))
let z = isolate(a_to_z(a))

echo repr(z) # [value = ref 0x7fca2c6d9050 --> [i = 3]]
inc a.z.i
echo repr(z) # [value = ref 0x7fca2c6d9050 --> [i = 4]]

Only the reverse case seems to work:

import std/isolation

type Z = ref object
  i: int

type A = object
  z: Z

func z_to_a(z: Z): A =
  result = A(z: z)

let z = Z(i: 3)
let a = isolate(z_to_a(z)) # Error: expression cannot be isolated: z_to_a(z)

@Araq
Copy link
Member Author

Araq commented Oct 19, 2021

Please report this as a bug on Nim's issue tracker.

@obadz
Copy link

obadz commented Oct 19, 2021

Done ↑

Separately, I think it would be nice if there was a version of this function that created fresh copies of all refs with refcount > 1. (In fact maybe that should be the default behavior?)

@Araq
Copy link
Member Author

Araq commented Oct 21, 2021

Separately, I think it would be nice if there was a version of this function that created fresh copies of all refs with refcount > 1. (In fact maybe that should be the default behavior?)

Variations of this idea have been thought about, but it changes the behavior from O(1) to O(n) and implicit copies of ref's are too confusing in practice. Which is why we moved away from deepCopying things.

@obadz
Copy link

obadz commented Oct 21, 2021

Can't we have an additional function that does this copy optionally? Presumably a macro could statically write the sequence of refcount checks that must be performed and if they are self-contained no copying is required?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

8 participants