diff refs/heads/master refs/heads/nim commit - 95f0dc7a65cb9d99b358422d51ebe4cd140dfb25 commit + 933dda27509c89ae303df353d83a6226e77a9049 blob - 627ad33783ec4b0492337f396270606a20beb32e blob + 00f7704adc1c4f4f601e572e4532307034895422 --- lang/nim/Makefile +++ lang/nim/Makefile @@ -2,9 +2,8 @@ ONLY_FOR_ARCHS = amd64 arm64 i386 COMMENT = statically typed systems programming language -DISTNAME = nim-2.2.10 +DISTNAME = nim-2.2.12 EXTRACT_SUFX = .tar.xz -REVISION = 0 CATEGORIES = lang @@ -13,20 +12,11 @@ SITES = ${HOMEPAGE}download/ MAINTAINER = Alfred Morgan -NIMBLE_CHECKSUMS_V = f8f6bd34bfa3fe12c64b919059ad856a96efcba0 -NIMBLE_ZIPPY_V = a99f6a7d8a8e3e0213b3cad0daf0ea974bf58e3f -NIMBLE_CHRONOS_V = 0646c444fce7c7ed08ef6f2c9a7abfd172ffe655 -NIMBLE_RESULTS_V = df8113dda4c2d74d460a8fa98252b0b771bf1f27 -NIMBLE_STEW_V = b66168735d6f3841c5239c3169d3fe5fe98b1257 +NIMBLE_CHRONOS_V = 536169b4ab6b7772f57993284331b7de716b6e99 -DIST_TUPLE = github nim-lang atlas 0.14.7 . -DIST_TUPLE += github nim-lang nimble 42ef70c2102a942c46f13eb76872326edd525cec . +DIST_TUPLE = github nim-lang atlas 0.16.3 . +DIST_TUPLE += github nim-lang nimble v0.26.0 . DIST_TUPLE += github status-im nim-chronos ${NIMBLE_CHRONOS_V} . -DIST_TUPLE += github arnetheduck nim-results ${NIMBLE_RESULTS_V} . -DIST_TUPLE += github status-im nim-stew ${NIMBLE_STEW_V} . -DIST_TUPLE += github nim-lang sat e63eaea8baf00bed8bcd5a29ffd8823abb265b39 . -DIST_TUPLE += github nim-lang checksums ${NIMBLE_CHECKSUMS_V} . -DIST_TUPLE += github guzba zippy ${NIMBLE_ZIPPY_V} . # MIT, BSD, Apache 2.0 PERMIT_PACKAGE = Yes @@ -49,26 +39,16 @@ TEST_DEPENDS = archivers/7zip,-main \ SUBST_VARS += CFLAGS post-extract: + # Reuse bundled dependencies except for Nimble's updated Chronos revision. + rm -R ${WRKDIR}/nimble-*/vendor + mv ${WRKDIST}/dist/nimble/vendor ${WRKDIR}/nimble-*/ rm -R ${WRKDIST}/dist/nimble - rm -R ${WRKDIST}/dist/checksums mv ${WRKDIR}/nimble-* ${WRKDIST}/dist/nimble - rm -R ${WRKDIST}/dist/nimble/vendor/{checksums,chronos,results,stew,zippy} - cp -r ${WRKDIR}/checksums-${NIMBLE_CHECKSUMS_V} \ - ${WRKDIST}/dist/nimble/vendor/checksums - mv ${WRKDIR}/nim-chronos-${NIMBLE_CHRONOS_V} \ - ${WRKDIST}/dist/nimble/vendor/chronos - mv ${WRKDIR}/nim-results-${NIMBLE_RESULTS_V} \ - ${WRKDIST}/dist/nimble/vendor/results - mv ${WRKDIR}/nim-stew-${NIMBLE_STEW_V} \ - ${WRKDIST}/dist/nimble/vendor/stew - mv ${WRKDIR}/zippy-${NIMBLE_ZIPPY_V} \ - ${WRKDIST}/dist/nimble/vendor/zippy - cp -r ${WRKDIR}/sat-*/* \ - ${WRKDIST}/dist/nimble/vendor/sat/ - mv ${WRKDIR}/checksums-* ${WRKDIST}/dist/checksums + rm -R ${WRKDIST}/dist/nimble/vendor/chronos + mv ${WRKDIR}/nim-chronos-* ${WRKDIST}/dist/nimble/vendor/chronos mv ${WRKDIR}/atlas-* ${WRKDIST}/dist/atlas mkdir -p ${WRKDIST}/dist/atlas/dist - mv ${WRKDIR}/sat-* ${WRKDIST}/dist/atlas/dist/sat + cp -R ${WRKDIST}/dist/nimble/vendor/sat ${WRKDIST}/dist/atlas/dist/sat post-patch: mkdir -p ${WRKSRC}/nimcache-port blob - e887957fbcf0b860c3ad71d61fd83c6e8a2cef33 blob + 46d7bb3b263b08525ceeb33febfd1c2ae68c49dc --- lang/nim/distinfo +++ lang/nim/distinfo @@ -1,18 +1,8 @@ -SHA256 (arnetheduck-nim-results-df8113dda4c2d74d460a8fa98252b0b771bf1f27.tar.gz) = UtR71LY9UYHWk0Mwd0rx+nXxYH2YzGfLb0uIKjfc8Yc= -SHA256 (guzba-zippy-a99f6a7d8a8e3e0213b3cad0daf0ea974bf58e3f.tar.gz) = TmlLHmmbJYmlMcgfY/AWT1AKX1K9EF7PRXLeqYLx2ms= -SHA256 (nim-2.2.10.tar.xz) = eVe37QBCBrzxC8xPO0dEFTh45i8kMVUqmo6dP0Do1dU= -SHA256 (nim-lang-atlas-0.14.7.tar.gz) = rnH51fTA98LlbcUgkSiJniXh6gIPk9kt5N5ru6TadNk= -SHA256 (nim-lang-checksums-f8f6bd34bfa3fe12c64b919059ad856a96efcba0.tar.gz) = nNBiWuiGDtHWogz/PauBMlqSPCd4n8K+2CYlp8V2OXU= -SHA256 (nim-lang-nimble-42ef70c2102a942c46f13eb76872326edd525cec.tar.gz) = PyTiH5jxAkcigZIwV95spkEuIRqM9VJp8WEPrH5NdvA= -SHA256 (nim-lang-sat-e63eaea8baf00bed8bcd5a29ffd8823abb265b39.tar.gz) = CEZgfiHMKYDOaDJfw7Ssvy6+THTLxe4cRZ+8Krr3KFY= -SHA256 (status-im-nim-chronos-0646c444fce7c7ed08ef6f2c9a7abfd172ffe655.tar.gz) = 1ZtM8tzIA6Mz2c0pWwd5QFaAVj7CB5VqLmSNbzfrMTY= -SHA256 (status-im-nim-stew-b66168735d6f3841c5239c3169d3fe5fe98b1257.tar.gz) = XDu+cFL6ktOZcIhLmhSVEHpQUB2Ikw5fqUPuuovssgM= -SIZE (arnetheduck-nim-results-df8113dda4c2d74d460a8fa98252b0b771bf1f27.tar.gz) = 24169 -SIZE (guzba-zippy-a99f6a7d8a8e3e0213b3cad0daf0ea974bf58e3f.tar.gz) = 29504190 -SIZE (nim-2.2.10.tar.xz) = 8287652 -SIZE (nim-lang-atlas-0.14.7.tar.gz) = 160612 -SIZE (nim-lang-checksums-f8f6bd34bfa3fe12c64b919059ad856a96efcba0.tar.gz) = 47503 -SIZE (nim-lang-nimble-42ef70c2102a942c46f13eb76872326edd525cec.tar.gz) = 772179 -SIZE (nim-lang-sat-e63eaea8baf00bed8bcd5a29ffd8823abb265b39.tar.gz) = 10245 -SIZE (status-im-nim-chronos-0646c444fce7c7ed08ef6f2c9a7abfd172ffe655.tar.gz) = 297162 -SIZE (status-im-nim-stew-b66168735d6f3841c5239c3169d3fe5fe98b1257.tar.gz) = 117078 +SHA256 (nim-2.2.12.tar.xz) = Jjmgal6np/z1ffHn4e9NGyvuWMesm9ANvSqlvqHlpWo= +SHA256 (nim-lang-atlas-0.16.3.tar.gz) = pQG5wWgd2ZNn4vw7GUXeUTgiVKZa87kS8jhRNd0fBGs= +SHA256 (nim-lang-nimble-v0.26.0.tar.gz) = p0fgqocZNg+Fj7Ady+cW91VHQmogtkzGv1mTTULSm10= +SHA256 (status-im-nim-chronos-536169b4ab6b7772f57993284331b7de716b6e99.tar.gz) = 7tK1X7tOwzFHenM1O5wfLoBO5fMDnw8OkFZDRAFeO2Y= +SIZE (nim-2.2.12.tar.xz) = 10259940 +SIZE (nim-lang-atlas-0.16.3.tar.gz) = 206062 +SIZE (nim-lang-nimble-v0.26.0.tar.gz) = 893733 +SIZE (status-im-nim-chronos-536169b4ab6b7772f57993284331b7de716b6e99.tar.gz) = 698219 blob - b8c4e419b4db0bf21090c153fe17e1dfeb34392b blob + 54984c51f625063c093d0ca0496f420099a101f6 --- lang/nim/patches/patch-compiler_options_nim +++ lang/nim/patches/patch-compiler_options_nim @@ -9,7 +9,7 @@ Index: compiler/options.nim hasTinyCBackend* = defined(tinyc) useEffectSystem* = true useWriteTracking* = false -@@ -576,7 +577,7 @@ proc newConfigRef*(): ConfigRef = +@@ -584,7 +585,7 @@ proc newConfigRef*(): ConfigRef = outFile: RelativeFile"", outDir: AbsoluteDir"", prefixDir: AbsoluteDir"", blob - aab32b8987e207fb46af2c55840f71ec33afa932 blob + e27733990b7f243fde97401c10db56085627b662 --- lang/nim/patches/patch-config_nim_cfg +++ lang/nim/patches/patch-config_nim_cfg @@ -24,7 +24,7 @@ Index: config/nim.cfg @elif haiku: gcc.options.linker = "-Wl,--as-needed -lnetwork" gcc.cpp.options.linker = "-Wl,--as-needed -lnetwork" -@@ -223,21 +223,27 @@ clang.objc.options.linker = "-lobjc -lgnustep-base" +@@ -236,21 +236,27 @@ clang.objc.options.linker = "-lobjc -lgnustep-base" # Options for FreeBSD, OpenBSD, NetBSD linker to add locations for searching # shared libraries. @@ -58,7 +58,7 @@ Index: config/nim.cfg @elif netbsd: cincludes: "/usr/pkg/include" clibdir: "/usr/pkg/lib" -@@ -262,15 +268,15 @@ gcc.options.always %= "${gcc.options.always} -fno-stri +@@ -275,15 +281,15 @@ gcc.options.always %= "${gcc.options.always} -fno-stri # -fno-math-errno is default in OSX, iOS, BSD, Musl, Libm, LLVM, Clang, ICC. # See https://itnext.io/why-standard-c-math-functions-are-slow-d10d02554e33 # and https://gcc.gnu.org/onlinedocs/gcc-12.2.0/gcc/Optimize-Options.html#Optimize-Options @@ -78,7 +78,7 @@ Index: config/nim.cfg gcc.cpp.options.debug = "-g3 -Og" #passl = "-pg" -@@ -284,8 +290,8 @@ llvm_gcc.options.size = "-Os" +@@ -297,8 +303,8 @@ llvm_gcc.options.size = "-Os" clang.options.debug = "-g" clang.cpp.options.debug = "-g" clang.options.always = "-w -ferror-limit=3 -fno-strict-aliasing" blob - 3975698fcc1d2e7c1db036bd4022b6793aa954bc (mode 644) blob + /dev/null --- lang/nim/patches/patch-dist_nimble_src_nimblepkg_downloadnim_nim +++ /dev/null @@ -1,46 +0,0 @@ -Index: dist/nimble/src/nimblepkg/downloadnim.nim ---- dist/nimble/src/nimblepkg/downloadnim.nim.orig -+++ dist/nimble/src/nimblepkg/downloadnim.nim -@@ -114,25 +114,26 @@ proc isAppleSilicon*(): bool = - - proc getPlatformString*(arch: int): string = - ## Returns the platform string used in releases.json (e.g., "linux_x64", "macosx_arm64") -- let os = -- when defined(windows): -- "windows" -- elif defined(linux): -- "linux" -- elif defined(macosx): -- "macosx" -- else: -- # For other platforms, fall back to source -- return "source_tar" -+ when defined(windows) or defined(linux) or defined(macosx): -+ let os = -+ when defined(windows): -+ "windows" -+ elif defined(linux): -+ "linux" -+ else: -+ "macosx" - -- when defined(macosx): -- if isAppleSilicon(): -- return os & "_arm64" -+ when defined(macosx): -+ if isAppleSilicon(): -+ return os & "_arm64" -+ else: -+ return os & "_x64" - else: -- return os & "_x64" -+ # For Windows and Linux -+ return os & "_x" & $arch - else: -- # For Windows and Linux -- return os & "_x" & $arch -+ # For other platforms, fall back to source -+ return "source_tar" - - proc getNightliesUrl*(parsedContents: JsonNode, arch: int): (string, string) = - let os = blob - 03cb9e6483c864f0a2cc13661083e24e249c985f blob + 3cbace663e0389bc5c82527029937264ce586078 --- lang/nim/patches/patch-dist_nimble_src_nimblepkg_options_nim +++ lang/nim/patches/patch-dist_nimble_src_nimblepkg_options_nim @@ -3,7 +3,7 @@ don't exec git Index: dist/nimble/src/nimblepkg/options.nim --- dist/nimble/src/nimblepkg/options.nim.orig +++ dist/nimble/src/nimblepkg/options.nim -@@ -354,15 +354,7 @@ const +@@ -377,15 +377,7 @@ const ## sources outside the git tree of Nimble: git_revision_override* {.strdefine.} = "" blob - /dev/null blob + 12b65395cef2d3d74d43d466219843245e022cad (mode 644) --- /dev/null +++ lang/nim/patches/patch-dist_nimble_vendor_bearssl_bearssl_abi_bearssl_ssl_nim @@ -0,0 +1,35 @@ +Match BearSSL's size_t output parameters instead of Nim's native uint. + +Index: dist/nimble/vendor/bearssl/bearssl/abi/bearssl_ssl.nim +--- dist/nimble/vendor/bearssl/bearssl/abi/bearssl_ssl.nim.orig ++++ dist/nimble/vendor/bearssl/bearssl/abi/bearssl_ssl.nim +@@ -823,25 +823,25 @@ proc sslEngineLastError*(cc: var SslEngineContext): ci + return cc.err + + +-proc sslEngineSendappBuf*(cc: var SslEngineContext; len: var uint): ptr byte {. ++proc sslEngineSendappBuf*(cc: var SslEngineContext; len: var csize_t): ptr byte {. + importcFunc, importc: "br_ssl_engine_sendapp_buf", header: "bearssl_ssl.h".} + + proc sslEngineSendappAck*(cc: var SslEngineContext; len: csize_t) {.importcFunc, + importc: "br_ssl_engine_sendapp_ack", header: "bearssl_ssl.h".} + +-proc sslEngineRecvappBuf*(cc: var SslEngineContext; len: var uint): ptr byte {. ++proc sslEngineRecvappBuf*(cc: var SslEngineContext; len: var csize_t): ptr byte {. + importcFunc, importc: "br_ssl_engine_recvapp_buf", header: "bearssl_ssl.h".} + + proc sslEngineRecvappAck*(cc: var SslEngineContext; len: csize_t) {.importcFunc, + importc: "br_ssl_engine_recvapp_ack", header: "bearssl_ssl.h".} + +-proc sslEngineSendrecBuf*(cc: var SslEngineContext; len: var uint): ptr byte {. ++proc sslEngineSendrecBuf*(cc: var SslEngineContext; len: var csize_t): ptr byte {. + importcFunc, importc: "br_ssl_engine_sendrec_buf", header: "bearssl_ssl.h".} + + proc sslEngineSendrecAck*(cc: var SslEngineContext; len: csize_t) {.importcFunc, + importc: "br_ssl_engine_sendrec_ack", header: "bearssl_ssl.h".} + +-proc sslEngineRecvrecBuf*(cc: var SslEngineContext; len: var uint): ptr byte {. ++proc sslEngineRecvrecBuf*(cc: var SslEngineContext; len: var csize_t): ptr byte {. + importcFunc, importc: "br_ssl_engine_recvrec_buf", header: "bearssl_ssl.h".} + + proc sslEngineRecvrecAck*(cc: var SslEngineContext; len: csize_t) {.importcFunc, blob - ff80fb48c9cb0690b731a871e48d312137d665fb blob + e2e236adcd703093d5c902bbf510283da9d62caf --- lang/nim/patches/patch-koch_nim +++ lang/nim/patches/patch-koch_nim @@ -1,3 +1,5 @@ +Use the bundled dependencies when building the compiler and tools. + Index: koch.nim --- koch.nim.orig +++ koch.nim @@ -24,3 +26,20 @@ Index: koch.nim # installer.ini expects it under $nim/bin nimCompile("dist/atlas/src/atlas.nim", options = "-d:release --noNimblePath -d:nimAtlasBootstrap " & args) +@@ -181,7 +172,6 @@ proc bundleChecksums(latest: bool) = + cloneDependency(distDir, "https://github.com/nim-lang/checksums.git", commit, allowBundled = true) + + proc bundleNimsuggest(args: string) = +- bundleChecksums(false) + nimCompileFold("Compile nimsuggest", "nimsuggest/nimsuggest.nim", + options = "-d:danger " & args) + +@@ -344,8 +334,6 @@ proc boot(args: string, skipIntegrityCheck: bool) = + let useCpp = doUseCpp() + let smartNimcache = (if "release" in args or "danger" in args: "nimcache/r_" else: "nimcache/d_") & + hostOS & "_" & hostCPU +- +- bundleChecksums(false) + + let usingLibFFI = "nimHasLibFFI" in args + if usingLibFFI and not dirExists("dist/libffi"): blob - /dev/null blob + 4b2d56f6350ae7c7d3baf0bd284634ba9f1ef928 (mode 644) --- /dev/null +++ lang/nim/patches/patch-dist_nimble_vendor_chronos_chronos_sendfile_nim @@ -0,0 +1,49 @@ +Implement OpenBSD file-to-socket transfers with bounded buffered I/O. +Preserve the input file position and let Chronos retry partial writes. + +Index: dist/nimble/vendor/chronos/chronos/sendfile.nim +--- dist/nimble/vendor/chronos/chronos/sendfile.nim.orig ++++ dist/nimble/vendor/chronos/chronos/sendfile.nim +@@ -43,6 +43,33 @@ elif defined(emscripten) or defined(haiku): + proc sendfile*(outfd, infd: int, offset: int, count: var int): int = + raiseAssert "sendfile() is not implemented yet" + ++elif defined(openbsd): ++ import std/posix ++ ++ proc sendfile*(outfd, infd: int, offset: int, count: var int): int = ++ let requested = count ++ count = 0 ++ if requested < 0 or offset < 0: ++ errno = EINVAL ++ return -1 ++ if requested == 0: ++ return 0 ++ ++ # pread preserves the file position. The caller retries unsent bytes. ++ var buffer: array[16384, byte] ++ let nread = pread(cint(infd), addr buffer[0], ++ min(requested, buffer.len), Off(offset)) ++ if nread < 0: ++ return -1 ++ if nread == 0: ++ return 0 ++ let written = send(SocketHandle(outfd), addr buffer[0], nread, ++ MSG_NOSIGNAL) ++ if written < 0: ++ return -1 ++ count = written ++ 0 ++ + elif (defined(linux) or defined(android)) and not(defined(emscripten)): + + type +@@ -64,7 +91,7 @@ elif (defined(linux) or defined(android)) and not(defi + count = 0 + -1 + +-elif defined(freebsd) or defined(openbsd) or defined(netbsd) or ++elif defined(freebsd) or defined(netbsd) or + defined(dragonflybsd): + import oserrno + type blob - /dev/null blob + c2713d470f0bc793decbe89133c1474c390c728a (mode 644) --- /dev/null +++ lang/nim/patches/patch-dist_nimble_vendor_chronos_chronos_streams_tlsstream_nim @@ -0,0 +1,60 @@ +Keep BearSSL buffer lengths in C size_t storage, including async captures. +Nim's uint and C size_t have different underlying types on OpenBSD/amd64. + +Index: dist/nimble/vendor/chronos/chronos/streams/tlsstream.nim +--- dist/nimble/vendor/chronos/chronos/streams/tlsstream.nim.orig ++++ dist/nimble/vendor/chronos/chronos/streams/tlsstream.nim +@@ -112,7 +112,7 @@ type + alpnProtosC: seq[cstring] + readFut: Future[int].Raising([CancelledError, AsyncStreamError]) + writeFut: Future[void].Raising([CancelledError, AsyncStreamError]) +- wlength: uint ++ wlength: csize_t + error: ref AsyncStreamError + + SomeTLSStreamType* = TLSStreamReader|TLSStreamWriter|TLSAsyncStream +@@ -276,7 +276,7 @@ proc runUntil(rws: TLSAsyncStream, target: cuint): Fut + await cancelAndWait(move(rws.writeFut)) + break + +- sslEngineRecvrecAck(engine[], uint(fut.value)) ++ sslEngineRecvrecAck(engine[], csize_t(fut.value)) + continue # re-read state / last error + + if ((state and target) == target): +@@ -290,7 +290,7 @@ proc runUntil(rws: TLSAsyncStream, target: cuint): Fut + if rws.eof: # We've already read EOF from the underlying stream + break + +- var length = 0'u ++ var length: csize_t = 0 + var buf = sslEngineRecvrecBuf(engine[], length) + rws.readFut = rws.rsource.readOnce(buf, int(length)) + +@@ -342,9 +342,9 @@ proc readOnce( + if (state and SSL_RECVAPP) == SSL_RECVAPP: + # Unencrypted data is available from the engine - copy as much as possible + # to the user buffer +- var length = 0'u ++ var length: csize_t = 0 + var buf = sslEngineRecvappBuf(engine[], length) +- let n = min(nbytes.uint, length) ++ let n = min(nbytes.csize_t, length) + copyMem(pbytes, buf, n) + sslEngineRecvappAck(engine[], n) + return n.int +@@ -387,12 +387,12 @@ proc write( + + if (state and SSL_SENDAPP) == SSL_SENDAPP: + # Application data can be queued for encryption +- var length = 0'u ++ var length: csize_t = 0 + var buf = sslEngineSendappBuf(engine[], length) + let toWrite = min(int(length), nbytes - offset) + copyMem(buf, pbytes.offset(offset), toWrite) + offset += toWrite +- sslEngineSendappAck(engine[], uint(toWrite)) ++ sslEngineSendappAck(engine[], csize_t(toWrite)) + + if offset == nbytes: + # Flushing is necessary for writes that only partially fill an SSL blob - /dev/null blob + 713bb09188d2f3c240543c2a207817fffcaf58ce (mode 644) --- /dev/null +++ lang/nim/patches/patch-dist_nimble_vendor_chronos_chronos_transports_stream_nim @@ -0,0 +1,16 @@ +Complete OpenBSD buffered file transfers at EOF instead of retrying forever. + +Index: dist/nimble/vendor/chronos/chronos/transports/stream.nim +--- dist/nimble/vendor/chronos/chronos/transports/stream.nim.orig ++++ dist/nimble/vendor/chronos/chronos/transports/stream.nim +@@ -1397,7 +1397,9 @@ else: + vector.size += nbytes + + if res >= 0: +- if cast[int](vector.buf) == nbytes: ++ # The OpenBSD buffered fallback returns no bytes at end-of-file. ++ if cast[int](vector.buf) == nbytes or ++ (defined(openbsd) and nbytes == 0): + if not(vector.writer.finished()): + vector.writer.complete(vector.size) + else: blob - 3185dd1f8911bad6873c9bcfbf8bf7450b018684 blob + cb631e102c5e9dc7f252e0e8d0c1cb993d40c45c --- lang/nim/patches/patch-lib_system_nim +++ lang/nim/patches/patch-lib_system_nim @@ -1,7 +1,7 @@ Index: lib/system.nim --- lib/system.nim.orig +++ lib/system.nim -@@ -1098,7 +1098,7 @@ when defined(boehmgc): +@@ -1108,7 +1108,7 @@ when defined(boehmgc): elif defined(macosx): const boehmLib = "libgc.dylib" elif defined(openbsd): blob - 2ac5ec6bc07ec27adcbbde4e766c268d2a99434d (mode 644) blob + /dev/null --- lang/nim/patches/patch-lib_system_sysstr_nim +++ /dev/null @@ -1,14 +0,0 @@ -Index: lib/system/sysstr.nim ---- lib/system/sysstr.nim.orig -+++ lib/system/sysstr.nim -@@ -223,8 +223,9 @@ proc addChar(s: NimString, c: char): NimString = - proc appendString(dest, src: NimString) {.compilerproc, inline.} = - ## Raw, does not prepare `dest` space for copying - if src != nil: -- copyMem(addr(dest.data[dest.len]), addr(src.data), src.len + 1) -+ copyMem(addr(dest.data[dest.len]), addr(src.data), src.len) - inc(dest.len, src.len) -+ dest.data[dest.len] = '\0' - - proc setLengthStr(s: NimString, newLen: int): NimString {.compilerRtl.} = - ## Sets the `s` length to `newLen` zeroing memory on growth.