Copying StackTraceEntry instances when nimStackTraceOverride is defined
breaks the link between a cstring field that's supposed to point at
another string field in the same object.
Sometimes, the original object is garbage collected, that memory region
reused for storing other strings, so when the StackTraceEntry copy tries
to use its cstring pointer to construct a traceback message, it accesses
unrelated strings.
This only happens for async tracebacks and this patch prevents that by
making sure we only use the string fields when nimStackTraceOverride is
defined.
Async tracebacks also beautified slightly by getting rid of an extra line
that was supposed to be commented out, along with the corresponding debugging output.
There's also a micro-optimisation to avoid concatenating two strings just
to get their combined length.
(cherry picked from commit a1c82c39af)
16 KiB
v1.4.0 - yyyy-mm-dd
Standard library additions and changes
-
Added support for parenthesized expressions in
strformat -
Fixed buffer overflow bugs in
net -
Added
sectionsiterator inparsecfg. -
Make custom op in macros.quote work for all statements.
For
netandnativesockets, aninheritableflag has been added to allprocs 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
nimInheritHandlesto enable file handle inheritance by default. This flag does not affect theselectorsmodule due to the differing semantics between operating systems.system.setInheritableandnativesockets.setInheritableis also introduced for setting file handle or socket inheritance. Not all platform have theseprocs defined. -
The file descriptors created for internal bookkeeping by
ioselector_kqueueandioselector_epollwill no longer be leaked to child processes. -
strutils.formatFloatwithprecision = 0has been restored to the version 1 behaviour that produces a trailing dot, e.g.formatFloat(3.14159, precision = 0)is now3., not3. -
critbitsaddscommonPrefixLen. -
relativePath(rel, abs)andrelativePath(abs, rel)used to silently give wrong results (see #13222); instead they now usegetCurrentDirto resolve those cases, and this can now throw in edge cases wheregetCurrentDirthrows.relativePathalso now works for js with-d:nodejs. -
JavaScript and NimScript standard library changes:
streams.StringStreamis now supported in JavaScript, with the limitation that any bufferpointers used must be castable toptr string, any incompatible pointer type will not work. Thelexbaseandstreamsmodules used to fail to compile on NimScript due to a bug, but this has been fixed.The following modules now compile on both JS and NimScript:
parsecsv,parsecfg,parsesql,xmlparser,htmlparserandropes. Additionally supported for JS iscstrutils.startsWithandcstrutils.endsWith, for NimScript:json,parsejson,strtabsandunidecode. -
Added
streams.readStrandstreams.peekStroverloads to accept an existing string to modify, which avoids memory allocations, similar tostreams.readLine(#13857). -
Added high-level
asyncnet.sendToandasyncnet.recvFrom. UDP functionality. -
paramCount¶mStrare now defined in os.nim instead of nimscript.nim for nimscript/nimble. -
dollars.$now works for unsigned ints withnim js -
Improvements to the
bitopsmodule, including bitslices, non-mutating versions of the original masking functions,mask/masked, and varargs support forbitand,bitor, andbitxor. -
sugar.=>andsugar.->changes: Previously(x, y: int)was transformed into(x: auto, y: int), it now becomes(x: int, y: int)in consistency with regular proc definitions (although you cannot use semicolons).Pragmas and using a name are now allowed on the lefthand side of
=>. Here is an aggregate example of these changes:import sugar foo(x, y: int) {.noSideEffect.} => x + y # is transformed into proc foo(x: int, y: int): auto {.noSideEffect.} = x + y -
The fields of
times.DateTimeare now private, and are accessed with getters and deprecated setters. -
The
timesmodule now handles the default value forDateTimemore consistently. Most procs raise an assertion error when given an uninitializedDateTime, the exceptions are==and$(which returns"Uninitialized DateTime"). The proctimes.isInitializedhas been added which can be used to check if aDateTimehas been initialized. -
Fix a bug where calling
closeon io streams in osproc.startProcess was a noop and led to hangs if a process had both reads from stdin and writes (eg to stdout). -
The callback that is passed to
system.onThreadDestructionmust now be.raises: []. -
The callback that is assigned to
system.onUnhandledExceptionmust now be.gcsafe. -
osproc.execCmdExnow takes an optionalinputfor stdin,workingDirandenvparameters. -
Added a
ssl_configmodule containing lists of secure ciphers as recommended by Mozilla OpSec -
net.newContextnow defaults to the list of ciphers targeting "Intermediate compatibility" per Mozilla's recommendation instead ofALL. This change should protect users from the use of weak and insecure ciphers while still provides adequate compatibility with the majority of the Internet. -
A new module
std/jsonutilswith hookablejsonTo,toJson,fromJsonoperations for json serialization/deserialization of custom types was added. -
A new proc
heapqueue.find[T](heap: HeapQueue[T], x: T): intto get index of elementxwas added. -
Added
rstgen.rstToLatexconvenience proc forrenderRstToOutandinitRstGeneratorwithoutLatexoutput. -
Added
os.normalizeExe, e.g.:koch=>./koch. -
macros.newLitnow preserves named vs unnamed tuples; use-d:nimHasWorkaround14720to keep old behavior. -
Added
random.gauss, that uses the ratio of uniforms method of sampling from a Gaussian distribution. -
Added
typetraits.elementTypeto get element type of an iterable. -
typetraits.$changes:$(int,)is now"(int,)"instead of"(int)";$tuple[]is now"tuple[]"instead of"tuple";$((int, float), int)is now"((int, float), int)"instead of"(tuple of (int, float), int)" -
Added
macros.extractDocCommentsAndRunnableshelper -
strformat.fmtandstrformat.&support= specifier.fmt"{expr=}"now expands tofmt"expr={expr}". -
deprecations:
os.existsDir=>dirExists,os.existsFile=>fileExists -
Added
jsremodule, Regular Expressions for the JavaScript target. -
Made
maxLinesargumentPositiveinlogging.newRollingFileLogger, because negative values will result in a new file being created for each logged line which doesn't make sense. -
Changed
loginloggingto use proper log level on JavaScript target, e.g.debugusesconsole.debug,infousesconsole.info,warnusesconsole.warn, etc. -
Tables, HashSets, SharedTables and deques don't require anymore that the passed initial size must be a power of two - this is done internally. Proc
rightSizefor Tables and HashSets is deprecated, as it is not needed anymore.CountTable.inctakesval: intagain notval: Positive; I.e. it can "count down" again. -
Removed deprecated symbols from
macrosmodule, deprecated as far back as0.15. -
On Windows the SSL library now checks for valid certificates. It uses the
cacert.pemfile for this purpose which was extracted fromhttps://curl.se/ca/cacert.pem. Besides the OpenSSL DLLs (e.g. libssl-1_1-x64.dll, libcrypto-1_1-x64.dll) you now also need to shipcacert.pemwith your.exefile. -
Make
{.requiresInit.}pragma to work fordistincttypes. -
Added
asyncdispatch.activeDescriptorsthat returns the number of currently active async event handles/file descriptors -
Added
asyncdispatch.maxDescriptorsthat returns the maximum number of active async event handles/file descriptors. -
Added
getPorttoasynchttpserver. -
--gc:orcis now 10% faster than previously for common workloads. If you have trouble with its changed behavior, compile with-d:nimOldOrc. -
os.FileInfo(returned bygetFileInfo) now containsblockSize, determining preferred I/O block size for this file object. -
Added a simpler to use
io.readCharsoverload. -
Added
**to jsffi. -
writeStackTraceis available in JS backend now. -
Added
decodeQuerytostd/uri. -
strscans.scanfnow supports parsing single characters. -
strscans.scanTupleadded which usesstrscans.scanfinternally, returning a tuple which can be unpacked for easier usage ofscanf. -
Added
setutils.toSetthat can take any iterable and convert it to a built-inset, if the iterable yields a built-in settable type. -
Added
setutils.fullSetwhich returns a full built-insetfor a valid type. -
Added
setutils.complementwhich returns the complement of a built-inset. -
Added
setutils.[]=. -
Added
math.isNaN. -
Added
jsbigintsmodule, arbitrary precision integers for JavaScript target. -
Added
math.copySign. -
Added new operations for singly- and doubly linked lists:
lists.toSinglyLinkedListandlists.toDoublyLinkedListconvert fromopenArrays;lists.copyimplements shallow copying;lists.addconcatenates two lists - an O(1) variation that consumes its argument,addMoved, is also supplied. -
Added
euclDivandeuclModtomath. -
Added
httpcore.is1xxand missing HTTP codes. -
Added
jsconsole.jsAssertfor JavaScript target. -
Added
posix_utils.osReleaseFileto get system identification fromos-releasefile on Linux and the BSDs. https://www.freedesktop.org/software/systemd/man/os-release.html -
Added
socketstreammodule that wraps sockets in the stream interface -
Added
sugar.dumpToStringwhich improves onsugar.dump. -
Added
math.signbit. -
Removed the optional
longestMatchparameter of thecritbits._WithPrefixiterators (it never worked reliably) -
In
lists: renamedappendtoaddand retainedappendas an alias; addedprependandprependMovedanalogously toaddandaddMoved; addedremoveforSinglyLinkedLists. -
Deprecated
any. See https://github.com/nim-lang/RFCs/issues/281 -
Added optional
optionsargument tocopyFile,copyFileToDir, andcopyFileWithPermissions. By default, on non-Windows OSes, symlinks are followed (copy files symlinks point to); on Windows,optionsargument is ignored and symlinks are skipped. -
On non-Windows OSes,
copyDirandcopyDirWithPermissionscopy symlinks as symlinks (instead of skipping them as it was before); on Windows symlinks are skipped. -
On non-Windows OSes,
moveFileandmoveDirmove symlinks as symlinks (instead of skipping them sometimes as it was before). -
Added optional
followSymlinksargument tosetFilePermissions. -
Added
os.isAdminto tell whether the caller's process is a member of the Administrators local group (on Windows) or a root (on POSIX). -
Added experimental
linenoise.readLineStatusto get line and status (e.g. ctrl-D or ctrl-C). -
Added
compilesettings.SingleValueSetting.libPath. -
std/wrapnilsdoesn't useexperimental:dotOperatorsanymore, avoiding issues like https://github.com/nim-lang/Nim/issues/13063 (which affected error messages) for modules importingstd/wrapnils. Added??.macro which returns anOption. -
Added
math.frexpoverload procs. Deprecatedc_frexp, usefrexpinstead. -
parseopt.initOptParserhas been made available andparseopthas been added back topreludefor all backends. PreviouslyinitOptParserwas unavailable if theosmodule did not haveparamCountorparamStr, but the use of these ininitOptParserwere conditionally to the runtime arguments passed to it, soinitOptParserhas been changed to raiseValueErrorwhen the real command line is not available.parseoptwas previously excluded frompreludefor JS, as it could not be imported. -
Added
system.prepareStrMutationfor better support of low levelmoveMem,copyMemoperations for Orc's copy-on-write string implementation. -
Added
std/strbasicsfor high performance string operations. Addedstrip,setSlice,add(a: var string, b: openArray[char]). -
Added to
wrapnilsan option-like API via??.,isSome,get. -
std/optionschanged$some(3)to"some(3)"instead of"Some(3)"and$none(int)to"none(int)"instead of"None[int]". -
Added
algorithm.merge. -
Added
std/jsfetchmodule Fetch wrapper for JavaScript target. -
Added
std/jsheadersmodule Headers wrapper for JavaScript target. -
Added
std/jsformdatamodule FormData wrapper for JavaScript target. -
system.addEscapedCharnow renders\ras\rinstead of\c, to be compatible with most other languages. -
Removed support for named procs in
sugar.=>. -
Added
jscore.debuggerto call any available debugging functionality, such as breakpoints.. -
Added
std/channels. -
Added
htmlgen.portalfor making "SPA style" pages using HTML only. -
Added
ZZZandZZZZpatterns totimes.nimDateTimeparsing, to match time zone offsets without colons, e.g.UTC+7 -> +0700. -
Added
jsconsole.dir,jsconsole.dirxml,jsconsole.timeStamp. -
Added dollar
$andlenforjsre.RegExp. -
Added
std/tasks. -
Added
hasDataBufferedtoasyncnet. -
Added
hasClosuretostd/typetraits. -
Added
std/tempfiles. -
Added
genasts.genAstthat avoids the problems inherent withquote doand can be used as a replacement. -
Added
copyWithinforseqandarrayfor JavaScript targets. -
Fixed premature garbage collection in asyncdispatch, when a stack trace override is in place.
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:
-
The
=destroyhook no longer has to reset its target, as the compiler now automatically insertswasMovedcalls where needed. -
The
=hook is now called=copyfor clarity. The old name=is still available so there is no need to update your code. This change was backported to 1.2 too so you can use the more readability=copywithout loss of compatibility. -
In the newruntime it is now allowed to assign to the discriminator field without restrictions as long as case object doesn't have custom destructor. The discriminator value doesn't have to be a constant either. If you have a custom destructor for a 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 = nilRefactor 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
Compiler changes
- The style checking of the compiler now supports a
--styleCheck:usagesswitch. This switch enforces that every symbol is written as it was declared, not enforcing the official Nim style guide. To be enabled, this has to be combined either with--styleCheck:erroror--styleCheck:hint.