Nim/changelog.md
cooldome 5db0bb744c
Replace enum fields idents with syms (#14048)
* replace enum fields idents with syms
* Trigger build

Co-authored-by: cooldome <ariabushenko@bk.ru>
2020-04-21 20:12:32 +02:00

2.8 KiB

v1.4.0 - yyyy-mm-dd

Standard library additions and changes

  • uri adds Data URI Base64, implements RFC-2397.

  • Add DOM Parser to the dom module for the JavaScript target.

  • The default hash for Ordinal has changed to something more bit-scrambling. import hashes; proc hash(x: myInt): Hash = hashIdentity(x) recovers the old one in an instantiation context while -d:nimIntHash1 recovers it globally.

  • File handles created from high-level abstractions in the stdlib will no longer be inherited by child processes. In particular, these modules are affected: system, nativesockets, net and selectors.

    For net and nativesockets, an inheritable flag has been added to all procs that create sockets, allowing the user to control whether the resulting socket is inheritable. This flag is provided to ease the writing of multi-process servers, where sockets inheritance is desired.

    For a transistion period, define nimInheritHandles to enable file handle inheritance by default. This flag does not affect the selectors module due to the differing semantics between operating systems.

    system.setInheritable and nativesockets.setInheritable is also introduced for setting file handle or socket inheritance. Not all platform have these procs defined.

  • The file descriptors created for internal bookkeeping by ioselector_kqueue and ioselector_epoll will no longer be leaked to child processes.

Language changes

  • In newruntime it is now allowed to assign discriminator field without restrictions as long as case object doesn't have custom destructor. Discriminator value doesn't have to be a constant either. If you have custom destructor for case object and you do want to freely assign discriminator fields, it is recommended to refactor object into 2 objects like this:

    type
      MyObj = object
        case kind: bool
          of true: y: ptr UncheckedArray[float]
          of false: z: seq[int]
    
    proc `=destroy`(x: MyObj) =
      if x.kind and x.y != nil:
        deallocShared(x.y)
        x.y = nil
    

    Refactor into:

    type
      MySubObj = object
        val: ptr UncheckedArray[float]
      MyObj = object
        case kind: bool
        of true: y: MySubObj
        of false: z: seq[int]
    
    proc `=destroy`(x: MySubObj) =
      if x.val != nil:
        deallocShared(x.val)
        x.val = nil
    
  • getImpl() on enum type symbols now returns field syms instead of idents. This helps with writing typed macros. Old behavior for backwards compatiblity can be restored with command line switch --oldast.

Compiler changes

  • Specific warnings can now be turned into errors via --warningAsError[X]:on|off.
  • The define and undef pragmas have been de-deprecated.

Tool changes