From cbb4674065396f2ccdf67005a74f53441ce0d999 Mon Sep 17 00:00:00 2001 From: ringabout <43030857+ringabout@users.noreply.github.com> Date: Sat, 5 Nov 2022 16:20:38 +0800 Subject: [PATCH 01/14] fix =#13790 ptr char (+friends) should not implicitly convert to cstring --- compiler/sigmatch.nim | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/compiler/sigmatch.nim b/compiler/sigmatch.nim index 7124315d91b44..dcce6b1196e24 100644 --- a/compiler/sigmatch.nim +++ b/compiler/sigmatch.nim @@ -1392,15 +1392,18 @@ proc typeRel(c: var TCandidate, f, aOrig: PType, of tyString: result = isConvertible of tyPtr: # ptr[Tag, char] is not convertible to 'cstring' for now: - if a.len == 1: - let pointsTo = a[0].skipTypes(abstractInst) - if pointsTo.kind == tyChar: result = isConvertible - elif pointsTo.kind == tyUncheckedArray and pointsTo[0].kind == tyChar: - result = isConvertible - elif pointsTo.kind == tyArray and firstOrd(nil, pointsTo[0]) == 0 and - skipTypes(pointsTo[0], {tyRange}).kind in {tyInt..tyInt64} and - pointsTo[1].kind == tyChar: - result = isConvertible + when false: + result = isNone + else: + if a.len == 1: + let pointsTo = a[0].skipTypes(abstractInst) + if pointsTo.kind == tyChar: result = isConvertible + elif pointsTo.kind == tyUncheckedArray and pointsTo[0].kind == tyChar: + result = isConvertible + elif pointsTo.kind == tyArray and firstOrd(nil, pointsTo[0]) == 0 and + skipTypes(pointsTo[0], {tyRange}).kind in {tyInt..tyInt64} and + pointsTo[1].kind == tyChar: + result = isConvertible else: discard of tyEmpty, tyVoid: From 10c591f4151038df8e96eb43ec840efc65422534 Mon Sep 17 00:00:00 2001 From: ringabout <43030857+ringabout@users.noreply.github.com> Date: Sat, 5 Nov 2022 17:16:03 +0800 Subject: [PATCH 02/14] Apply suggestions from code review --- compiler/sigmatch.nim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/sigmatch.nim b/compiler/sigmatch.nim index dcce6b1196e24..3ca82bc910f43 100644 --- a/compiler/sigmatch.nim +++ b/compiler/sigmatch.nim @@ -1392,7 +1392,7 @@ proc typeRel(c: var TCandidate, f, aOrig: PType, of tyString: result = isConvertible of tyPtr: # ptr[Tag, char] is not convertible to 'cstring' for now: - when false: + when true: result = isNone else: if a.len == 1: From 1459b42dc4fdff4591b64e09bca9597c634d3896 Mon Sep 17 00:00:00 2001 From: ringabout <43030857+ringabout@users.noreply.github.com> Date: Fri, 11 Nov 2022 13:03:59 +0800 Subject: [PATCH 03/14] first round; compiles on windows --- compiler/lexer.nim | 4 ++-- compiler/sighashes.nim | 2 +- lib/pure/strutils.nim | 4 ++-- lib/std/formatfloat.nim | 6 +++--- lib/std/private/strimpl.nim | 2 +- lib/std/private/win_setenv.nim | 4 ++-- lib/std/syncio.nim | 2 +- lib/system/dyncalls.nim | 2 +- lib/system/excpt.nim | 4 ++-- lib/system/strmantle.nim | 2 +- lib/system/strs_v2.nim | 2 +- 11 files changed, 17 insertions(+), 17 deletions(-) diff --git a/compiler/lexer.nim b/compiler/lexer.nim index a9e370b5b80aa..ec27add8a947e 100644 --- a/compiler/lexer.nim +++ b/compiler/lexer.nim @@ -918,7 +918,7 @@ proc getSymbol(L: var Lexer, tok: var Token) = else: break tokenEnd(tok, pos-1) h = !$h - tok.ident = L.cache.getIdent(addr(L.buf[L.bufpos]), pos - L.bufpos, h) + tok.ident = L.cache.getIdent(cast[cstring](addr(L.buf[L.bufpos])), pos - L.bufpos, h) if (tok.ident.id < ord(tokKeywordLow) - ord(tkSymbol)) or (tok.ident.id > ord(tokKeywordHigh) - ord(tkSymbol)): tok.tokType = tkSymbol @@ -932,7 +932,7 @@ proc getSymbol(L: var Lexer, tok: var Token) = proc endOperator(L: var Lexer, tok: var Token, pos: int, hash: Hash) {.inline.} = var h = !$hash - tok.ident = L.cache.getIdent(addr(L.buf[L.bufpos]), pos - L.bufpos, h) + tok.ident = L.cache.getIdent(cast[cstring](addr(L.buf[L.bufpos])), pos - L.bufpos, h) if (tok.ident.id < oprLow) or (tok.ident.id > oprHigh): tok.tokType = tkOpr else: tok.tokType = TokType(tok.ident.id - oprLow + ord(tkColon)) L.bufpos = pos diff --git a/compiler/sighashes.nim b/compiler/sighashes.nim index fc6b1455fae42..a642d5cb3cf21 100644 --- a/compiler/sighashes.nim +++ b/compiler/sighashes.nim @@ -20,7 +20,7 @@ when defined(nimPreviewSlimSystem): proc `&=`(c: var MD5Context, s: string) = md5Update(c, s, s.len) proc `&=`(c: var MD5Context, ch: char) = # XXX suspicious code here; relies on ch being zero terminated? - md5Update(c, unsafeAddr ch, 1) + md5Update(c, cast[cstring](unsafeAddr ch), 1) proc `&=`(c: var MD5Context, i: BiggestInt) = md5Update(c, cast[cstring](unsafeAddr i), sizeof(i)) diff --git a/lib/pure/strutils.nim b/lib/pure/strutils.nim index 2e408f438658a..8b3d36f66201f 100644 --- a/lib/pure/strutils.nim +++ b/lib/pure/strutils.nim @@ -2435,11 +2435,11 @@ func formatBiggestFloat*(f: BiggestFloat, format: FloatFormatMode = ffDefault, frmtstr[3] = '*' frmtstr[4] = floatFormatToChar[format] frmtstr[5] = '\0' - L = c_sprintf(addr buf, addr frmtstr, precision, f) + L = c_sprintf(cast[cstring](addr buf), cast[cstring](addr frmtstr), precision, f) else: frmtstr[1] = floatFormatToChar[format] frmtstr[2] = '\0' - L = c_sprintf(addr buf, addr frmtstr, f) + L = c_sprintf(cast[cstring](addr buf), cast[cstring](addr frmtstr), f) result = newString(L) for i in 0 ..< L: # Depending on the locale either dot or comma is produced, diff --git a/lib/std/formatfloat.nim b/lib/std/formatfloat.nim index 6f23837605971..2850f7021c3c8 100644 --- a/lib/std/formatfloat.nim +++ b/lib/std/formatfloat.nim @@ -49,7 +49,7 @@ proc writeFloatToBufferSprintf*(buf: var array[65, char]; value: BiggestFloat): ## ## returns the amount of bytes written to `buf` not counting the ## terminating '\0' character. - var n: int = c_sprintf(addr buf, "%.16g", value) + var n: int = c_sprintf(cast[cstring](addr buf), "%.16g", value) var hasDot = false for i in 0..n-1: if buf[i] == ',': @@ -90,7 +90,7 @@ proc addFloatRoundtrip*(result: var string; x: float | float32) = else: var buffer {.noinit.}: array[65, char] let n = writeFloatToBufferRoundtrip(buffer, x) - result.addCstringN(cstring(buffer[0].addr), n) + result.addCstringN(cast[cstring](buffer[0].addr), n) proc addFloatSprintf*(result: var string; x: float) = when nimvm: @@ -98,7 +98,7 @@ proc addFloatSprintf*(result: var string; x: float) = else: var buffer {.noinit.}: array[65, char] let n = writeFloatToBufferSprintf(buffer, x) - result.addCstringN(cstring(buffer[0].addr), n) + result.addCstringN(cast[cstring](buffer[0].addr), n) proc nimFloatToString(a: float): cstring = ## ensures the result doesn't print like an integer, i.e. return 2.0, not 2 diff --git a/lib/std/private/strimpl.nim b/lib/std/private/strimpl.nim index 7d19825f4c594..6a38cbfd2dc74 100644 --- a/lib/std/private/strimpl.nim +++ b/lib/std/private/strimpl.nim @@ -106,7 +106,7 @@ func find*(s, sub: cstring, start: Natural = 0, last = 0): int = if sub.len > s.len - start: return -1 if sub.len == 1: return find(s, sub[0], start, last) if last == 0 and s.len > start: - let found = c_strstr(s[start].unsafeAddr, sub) + let found = c_strstr(cast[cstring](s[start].unsafeAddr), sub) if not found.isNil: result = cast[ByteAddress](found) -% cast[ByteAddress](s) else: diff --git a/lib/std/private/win_setenv.nim b/lib/std/private/win_setenv.nim index 9315f3e7ecff5..303889a40a32c 100644 --- a/lib/std/private/win_setenv.nim +++ b/lib/std/private/win_setenv.nim @@ -94,9 +94,9 @@ else: var buf = newSeq[char](requiredSize + 1) let buf2 = buf[0].addr if wcstombs(buf2, wideName, csize_t(requiredSize + 1)) != high(csize_t): - var ptrToEnv = c_getenv(buf2) + var ptrToEnv = c_getenv(cast[cstring](buf2)) ptrToEnv[0] = '\0' - ptrToEnv = c_getenv(buf2) + ptrToEnv = c_getenv(cast[cstring](buf2)) ptrToEnv[1] = '=' # And now, we have to update the outer environment to have a proper empty value. diff --git a/lib/std/syncio.nim b/lib/std/syncio.nim index d406c254f93b7..16abc5afea53e 100644 --- a/lib/std/syncio.nim +++ b/lib/std/syncio.nim @@ -467,7 +467,7 @@ proc readLine*(f: File, line: var string): bool {.tags: [ReadIOEffect], while true: # fixes #9634; this pattern may need to be abstracted as a template if reused; # likely other io procs need this for correctness. - fgetsSuccess = c_fgets(addr line[pos], sp.cint, f) != nil + fgetsSuccess = c_fgets(cast[cstring](addr line[pos]), sp.cint, f) != nil if fgetsSuccess: break when not defined(nimscript): if errno == EINTR: diff --git a/lib/system/dyncalls.nim b/lib/system/dyncalls.nim index d5ebe3c19c913..de22f7cbb9173 100644 --- a/lib/system/dyncalls.nim +++ b/lib/system/dyncalls.nim @@ -161,7 +161,7 @@ elif defined(windows) or defined(dos): dec(m) k = k div 10 if k == 0: break - result = getProcAddress(cast[THINSTANCE](lib), addr decorated) + result = getProcAddress(cast[THINSTANCE](lib), cast[cstring](addr decorated)) if result != nil: return procAddrError(name) diff --git a/lib/system/excpt.nim b/lib/system/excpt.nim index c76be554f51b7..86cfff9cd349e 100644 --- a/lib/system/excpt.nim +++ b/lib/system/excpt.nim @@ -397,9 +397,9 @@ proc reportUnhandledErrorAux(e: ref Exception) {.nodestroy, gcsafe.} = xadd(buf, e.name, e.name.len) add(buf, "]\n") if onUnhandledException != nil: - onUnhandledException($buf.addr) + onUnhandledException($cast[cstring](buf.addr)) else: - showErrorMessage(buf.addr, L) + showErrorMessage(cast[cstring](buf.addr), L) proc reportUnhandledError(e: ref Exception) {.nodestroy, gcsafe.} = if unhandledExceptionHook != nil: diff --git a/lib/system/strmantle.nim b/lib/system/strmantle.nim index cb67185aba777..3c6ac718b1536 100644 --- a/lib/system/strmantle.nim +++ b/lib/system/strmantle.nim @@ -232,7 +232,7 @@ proc nimParseBiggestFloat(s: openArray[char], number: var BiggestFloat, t[ti-2] = ('0'.ord + absExponent mod 10).char absExponent = absExponent div 10 t[ti-3] = ('0'.ord + absExponent mod 10).char - number = c_strtod(addr t, nil) + number = c_strtod(cast[cstring](addr t), nil) when defined(nimHasInvariant): {.pop.} # staticBoundChecks diff --git a/lib/system/strs_v2.nim b/lib/system/strs_v2.nim index 74b9e7cd98692..e5ab236d29eac 100644 --- a/lib/system/strs_v2.nim +++ b/lib/system/strs_v2.nim @@ -89,7 +89,7 @@ proc cstrToNimstr(str: cstring): NimStringV2 {.compilerRtl.} = proc nimToCStringConv(s: NimStringV2): cstring {.compilerproc, nonReloadable, inline.} = if s.len == 0: result = cstring"" - else: result = cstring(unsafeAddr s.p.data) + else: result = cast[cstring](unsafeAddr s.p.data) proc appendString(dest: var NimStringV2; src: NimStringV2) {.compilerproc, inline.} = if src.len > 0: From e31d6ee45e4cec0ed31aaca8b44724610caf2b83 Mon Sep 17 00:00:00 2001 From: ringabout <43030857+ringabout@users.noreply.github.com> Date: Fri, 11 Nov 2022 13:20:03 +0800 Subject: [PATCH 04/14] nimPreviewSlimSystem --- compiler/sigmatch.nim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/sigmatch.nim b/compiler/sigmatch.nim index 989b15f045149..15bc805ced1f3 100644 --- a/compiler/sigmatch.nim +++ b/compiler/sigmatch.nim @@ -1392,7 +1392,7 @@ proc typeRel(c: var TCandidate, f, aOrig: PType, of tyString: result = isConvertible of tyPtr: # ptr[Tag, char] is not convertible to 'cstring' for now: - when true: + if isDefined(c.c.config, "nimPreviewSlimSystem"): result = isNone else: if a.len == 1: From 2b0c1e13ad114e839f0fab163cc8ac293ee0dba8 Mon Sep 17 00:00:00 2001 From: ringabout <43030857+ringabout@users.noreply.github.com> Date: Fri, 11 Nov 2022 14:20:51 +0800 Subject: [PATCH 05/14] conversion is unsafe, cast needed --- lib/posix/posix_utils.nim | 2 +- lib/std/private/oscommon.nim | 2 +- lib/std/private/osdirs.nim | 2 +- lib/system.nim | 2 +- lib/system/repr.nim | 2 +- lib/system/sysstr.nim | 2 +- tests/async/tnewasyncudp.nim | 4 ++-- tests/float/tfloat4.nim | 2 +- tests/system/tostring.nim | 2 +- 9 files changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/posix/posix_utils.nim b/lib/posix/posix_utils.nim index 0bd83b27b685f..92fe0940dd829 100644 --- a/lib/posix/posix_utils.nim +++ b/lib/posix/posix_utils.nim @@ -21,7 +21,7 @@ type Uname* = object sysname*, nodename*, release*, version*, machine*: string template charArrayToString(input: typed): string = - $cstring(addr input) + $cast[cstring](addr input) proc uname*(): Uname = ## Provides system information in a `Uname` struct with sysname, nodename, diff --git a/lib/std/private/oscommon.nim b/lib/std/private/oscommon.nim index 66725395fa73d..bab4856caebbe 100644 --- a/lib/std/private/oscommon.nim +++ b/lib/std/private/oscommon.nim @@ -63,7 +63,7 @@ when defined(windows) and not weirdTarget: template findNextFile*(a, b: untyped): untyped = findNextFileA(a, b) template getCommandLine*(): untyped = getCommandLineA() - template getFilename*(f: untyped): untyped = $cstring(addr f.cFileName) + template getFilename*(f: untyped): untyped = $cast[cstring](addr f.cFileName) proc skipFindData*(f: WIN32_FIND_DATA): bool {.inline.} = # Note - takes advantage of null delimiter in the cstring diff --git a/lib/std/private/osdirs.nim b/lib/std/private/osdirs.nim index 4b349817c02a6..add9ed424b78f 100644 --- a/lib/std/private/osdirs.nim +++ b/lib/std/private/osdirs.nim @@ -231,7 +231,7 @@ iterator walkDir*(dir: string; relative = false, checkDir = false, while true: var x = readdir(d) if x == nil: break - var y = $cstring(addr x.d_name) + var y = $cast[cstring](addr x.d_name) if y != "." and y != "..": var s: Stat let path = dir / y diff --git a/lib/system.nim b/lib/system.nim index a8e5824b503a4..6e16b1189b974 100644 --- a/lib/system.nim +++ b/lib/system.nim @@ -1844,7 +1844,7 @@ proc debugEcho*(x: varargs[typed, `$`]) {.magic: "Echo", noSideEffect, when hostOS == "standalone" and defined(nogc): proc nimToCStringConv(s: NimString): cstring {.compilerproc, inline.} = if s == nil or s.len == 0: result = cstring"" - else: result = cstring(addr s.data) + else: result = cast[cstring](addr s.data) proc getTypeInfo*[T](x: T): pointer {.magic: "GetTypeInfo", benign.} ## Get type information for `x`. diff --git a/lib/system/repr.nim b/lib/system/repr.nim index e049d18fadbad..e47220656d0d0 100644 --- a/lib/system/repr.nim +++ b/lib/system/repr.nim @@ -17,7 +17,7 @@ proc reprFloat(x: float): string {.compilerproc.} = return $x proc reprPointer(x: pointer): string {.compilerproc.} = result = newString(60) - let n = c_sprintf(addr result[0], "%p", x) + let n = c_sprintf(cast[cstring](addr result[0]), "%p", x) setLen(result, n) proc reprStrAux(result: var string, s: cstring; len: int) = diff --git a/lib/system/sysstr.nim b/lib/system/sysstr.nim index 7655d900416bf..be32652d80750 100644 --- a/lib/system/sysstr.nim +++ b/lib/system/sysstr.nim @@ -91,7 +91,7 @@ proc copyStr(s: NimString, start: int): NimString {.compilerproc.} = proc nimToCStringConv(s: NimString): cstring {.compilerproc, nonReloadable, inline.} = if s == nil or s.len == 0: result = cstring"" - else: result = cstring(addr s.data) + else: result = cast[cstring](addr s.data) proc toNimStr(str: cstring, len: int): NimString {.compilerproc.} = result = rawNewStringNoInit(len) diff --git a/tests/async/tnewasyncudp.nim b/tests/async/tnewasyncudp.nim index ba1e4134e87c4..68de796a02bb3 100644 --- a/tests/async/tnewasyncudp.nim +++ b/tests/async/tnewasyncudp.nim @@ -58,7 +58,7 @@ proc launchSwarm(name: ptr SockAddr) {.async.} = 16384, cast[ptr SockAddr](addr saddr), addr slen) size = 0 - var grammString = $cstring(addr buffer) + var grammString = $cast[cstring](addr buffer) if grammString == message: saveSendingPort(sockport) inc(recvCount) @@ -80,7 +80,7 @@ proc readMessages(server: AsyncFD) {.async.} = 16384, cast[ptr SockAddr](addr(saddr)), addr(slen)) size = 0 - var grammString = $cstring(addr buffer) + var grammString = $cast[cstring](addr buffer) if grammString.startsWith("Message ") and saddr.sin_addr.s_addr == nativesockets.ntohl(INADDR_LOOPBACK.uint32): await sendTo(server, addr grammString[0], len(grammString), diff --git a/tests/float/tfloat4.nim b/tests/float/tfloat4.nim index 5bedca371336a..f6216c374e492 100644 --- a/tests/float/tfloat4.nim +++ b/tests/float/tfloat4.nim @@ -8,7 +8,7 @@ proc c_sprintf(buf, fmt: cstring) {.importc:"sprintf", header: "", vara proc floatToStr(f: float64): string = var buffer: array[128, char] - c_sprintf(addr buffer, "%.16e", f) + c_sprintf(cast[cstring](addr buffer), "%.16e", f) result = "" for ch in buffer: if ch == '\0': diff --git a/tests/system/tostring.nim b/tests/system/tostring.nim index cae20865ebfca..bb6e453fbbaca 100644 --- a/tests/system/tostring.nim +++ b/tests/system/tostring.nim @@ -47,7 +47,7 @@ import strutils let arr = ['H','e','l','l','o',' ','W','o','r','l','d','!','\0'] doAssert $arr == "['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!', '\\x00']" -doAssert $cstring(addr arr) == "Hello World!" +doAssert $cast[cstring](addr arr) == "Hello World!" proc takes(c: cstring) = doAssert c == cstring"" From 4efb5c75d8946745b3ccd62cf999ebe8ba69e5e1 Mon Sep 17 00:00:00 2001 From: ringabout <43030857+ringabout@users.noreply.github.com> Date: Fri, 11 Nov 2022 15:07:39 +0800 Subject: [PATCH 06/14] fixes more tests --- lib/impure/db_odbc.nim | 12 ++++++------ lib/pure/nativesockets.nim | 10 +++++----- lib/wrappers/openssl.nim | 8 ++++---- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/lib/impure/db_odbc.nim b/lib/impure/db_odbc.nim index 2427f64fa54e8..62f047b49a37e 100644 --- a/lib/impure/db_odbc.nim +++ b/lib/impure/db_odbc.nim @@ -137,7 +137,7 @@ proc getErrInfo(db: var DbConn): tuple[res: int, ss, ne, msg: string] {. 511.TSqlSmallInt, retSz.addr) except: discard - return (res.int, $(addr sqlState), $(addr nativeErr), $(addr errMsg)) + return (res.int, $(cast[cstring](addr sqlState)), $cast[cstring](addr nativeErr), $cast[cstring](addr errMsg)) proc dbError*(db: var DbConn) {. tags: [ReadDbEffect, WriteDbEffect], raises: [DbError] .} = @@ -187,7 +187,7 @@ proc sqlGetDBMS(db: var DbConn): string {. db.sqlCheck(SQLGetInfo(db.hDb, SQL_DBMS_NAME, cast[SqlPointer](buf.addr), 4095.TSqlSmallInt, sz.addr)) except: discard - return $(addr buf) + return $(cast[cstring](addr buf)) proc dbQuote*(s: string): string {.noSideEffect.} = ## DB quotes the string. @@ -291,7 +291,7 @@ iterator fastRows*(db: var DbConn, query: SqlQuery, buf[0] = '\0' db.sqlCheck(SQLGetData(db.stmt, colId.SqlUSmallInt, SQL_C_CHAR, cast[cstring](buf.addr), 4095, sz.addr)) - rowRes[colId-1] = $(addr buf) + rowRes[colId-1] = $cast[cstring]((addr buf)) yield rowRes res = SQLFetch(db.stmt) properFreeResult(SQL_HANDLE_STMT, db.stmt) @@ -319,7 +319,7 @@ iterator instantRows*(db: var DbConn, query: SqlQuery, buf[0] = '\0' db.sqlCheck(SQLGetData(db.stmt, colId.SqlUSmallInt, SQL_C_CHAR, cast[cstring](buf.addr), 4095, sz.addr)) - rowRes[colId-1] = $(addr buf) + rowRes[colId-1] = $cast[cstring](addr buf) yield (row: rowRes, len: cCnt.int) res = SQLFetch(db.stmt) properFreeResult(SQL_HANDLE_STMT, db.stmt) @@ -358,7 +358,7 @@ proc getRow*(db: var DbConn, query: SqlQuery, buf[0] = '\0' db.sqlCheck(SQLGetData(db.stmt, colId.SqlUSmallInt, SQL_C_CHAR, cast[cstring](buf.addr), 4095, sz.addr)) - rowRes[colId-1] = $(addr buf) + rowRes[colId-1] = $cast[cstring](addr buf) res = SQLFetch(db.stmt) result = rowRes properFreeResult(SQL_HANDLE_STMT, db.stmt) @@ -386,7 +386,7 @@ proc getAllRows*(db: var DbConn, query: SqlQuery, buf[0] = '\0' db.sqlCheck(SQLGetData(db.stmt, colId.SqlUSmallInt, SQL_C_CHAR, cast[cstring](buf.addr), 4095, sz.addr)) - rowRes[colId-1] = $(addr buf) + rowRes[colId-1] = $cast[cstring](addr buf) rows.add(rowRes) res = SQLFetch(db.stmt) result = rows diff --git a/lib/pure/nativesockets.nim b/lib/pure/nativesockets.nim index 2599a8acc4c9f..5de2e4d30e45b 100644 --- a/lib/pure/nativesockets.nim +++ b/lib/pure/nativesockets.nim @@ -487,7 +487,7 @@ when not useNimNetLite: if posix.IN6_IS_ADDR_V4MAPPED(addr6) != 0: result.setSlice("::ffff:".len.. 0): discard md5_Update(ctx, buf[0].addr, cast[csize_t](bytes)) - discard md5_Final(buf[0].addr, ctx) + discard md5_Final(cast[cstring](buf[0].addr), ctx) f.close - result = hexStr(addr buf) + result = hexStr(cast[cstring](addr buf)) proc md5_Str*(str: string): string = ## Generate MD5 hash for a string. Result is a 32 character @@ -824,8 +824,8 @@ proc md5_Str*(str: string): string = discard md5_Update(ctx, input[i].addr, cast[csize_t](L)) i += L - discard md5_Final(addr res, ctx) - result = hexStr(addr res) + discard md5_Final(cast[cstring](addr res), ctx) + result = hexStr(cast[cstring](addr res)) when defined(nimHasStyleChecks): {.pop.} From 5f0ba1a2053eec922adf7fed92409a4dc2ee624e Mon Sep 17 00:00:00 2001 From: xflywind <43030857+xflywind@users.noreply.github.com> Date: Fri, 11 Nov 2022 15:25:58 +0800 Subject: [PATCH 07/14] fixes asyncnet --- lib/pure/asyncnet.nim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pure/asyncnet.nim b/lib/pure/asyncnet.nim index ea0ae1f69a7a4..2c021f01683b6 100644 --- a/lib/pure/asyncnet.nim +++ b/lib/pure/asyncnet.nim @@ -229,7 +229,7 @@ when defineSsl: let len = bioCtrlPending(socket.bioOut) if len > 0: var data = newString(len) - let read = bioRead(socket.bioOut, addr data[0], len) + let read = bioRead(socket.bioOut, cast[cstring](addr data[0]), len) assert read != 0 if read < 0: raiseSSLError() From b5ee8378f1098081fdcd1ede1f3c0f3d14c40f17 Mon Sep 17 00:00:00 2001 From: xflywind <43030857+xflywind@users.noreply.github.com> Date: Fri, 11 Nov 2022 15:50:24 +0800 Subject: [PATCH 08/14] another try another error --- lib/pure/asyncnet.nim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pure/asyncnet.nim b/lib/pure/asyncnet.nim index 2c021f01683b6..a24f5368b1f06 100644 --- a/lib/pure/asyncnet.nim +++ b/lib/pure/asyncnet.nim @@ -247,7 +247,7 @@ when defineSsl: var data = await recv(socket.fd.AsyncFD, BufferSize, flags) let length = len(data) if length > 0: - let ret = bioWrite(socket.bioIn, addr data[0], length.cint) + let ret = bioWrite(socket.bioIn, cast[cstring](addr data[0]), length.cint) if ret < 0: raiseSSLError() elif length == 0: From 41bca19ae9bec33adc14171ed7f2492e2427980a Mon Sep 17 00:00:00 2001 From: ringabout <43030857+ringabout@users.noreply.github.com> Date: Sat, 12 Nov 2022 22:48:54 +0800 Subject: [PATCH 09/14] last one --- lib/pure/nativesockets.nim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pure/nativesockets.nim b/lib/pure/nativesockets.nim index 5de2e4d30e45b..067776fbf85bd 100644 --- a/lib/pure/nativesockets.nim +++ b/lib/pure/nativesockets.nim @@ -481,7 +481,7 @@ when not useNimNetLite: result = newString(addrLen) let addr6 = addr cast[ptr Sockaddr_in6](sockAddr).sin6_addr when not useWinVersion: - if posix.inet_ntop(posix.AF_INET6, addr6, addr result[0], + if posix.inet_ntop(posix.AF_INET6, addr6, cast[cstring](addr result[0]), result.len.int32) == nil: raiseOSError(osLastError()) if posix.IN6_IS_ADDR_V4MAPPED(addr6) != 0: From c081b460a72c97d3d08644692bf215dd21ed8e01 Mon Sep 17 00:00:00 2001 From: ringabout <43030857+ringabout@users.noreply.github.com> Date: Sun, 13 Nov 2022 10:05:32 +0800 Subject: [PATCH 10/14] true --- lib/pure/asyncnet.nim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pure/asyncnet.nim b/lib/pure/asyncnet.nim index a24f5368b1f06..982459af77d00 100644 --- a/lib/pure/asyncnet.nim +++ b/lib/pure/asyncnet.nim @@ -459,7 +459,7 @@ proc send*(socket: AsyncSocket, data: string, when defineSsl: var copy = data sslLoop(socket, flags, - sslWrite(socket.sslHandle, addr copy[0], copy.len.cint)) + sslWrite(socket.sslHandle, cast[cstring](addr copy[0]), copy.len.cint)) await sendPendingSslData(socket, flags) else: await send(socket.fd.AsyncFD, data, flags) From f92180f54eff0d38105055947d7ca831e8ca32ba Mon Sep 17 00:00:00 2001 From: ringabout <43030857+ringabout@users.noreply.github.com> Date: Sun, 13 Nov 2022 10:46:21 +0800 Subject: [PATCH 11/14] one more --- lib/pure/nativesockets.nim | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/pure/nativesockets.nim b/lib/pure/nativesockets.nim index 067776fbf85bd..14a3184126247 100644 --- a/lib/pure/nativesockets.nim +++ b/lib/pure/nativesockets.nim @@ -509,7 +509,7 @@ when not useNimNetLite: if sockAddr.sa_family.cint == nativeAfInet: let addr4 = addr cast[ptr Sockaddr_in](sockAddr).sin_addr when not useWinVersion: - if posix.inet_ntop(posix.AF_INET, addr4, addr strAddress[0], + if posix.inet_ntop(posix.AF_INET, addr4, cast[cstring](addr strAddress[0]), strAddress.len.int32) == nil: raiseOSError(osLastError()) else: @@ -519,7 +519,7 @@ when not useNimNetLite: elif sockAddr.sa_family.cint == nativeAfInet6: let addr6 = addr cast[ptr Sockaddr_in6](sockAddr).sin6_addr when not useWinVersion: - if posix.inet_ntop(posix.AF_INET6, addr6, addr strAddress[0], + if posix.inet_ntop(posix.AF_INET6, addr6, cast[cstring](addr strAddress[0]), strAddress.len.int32) == nil: raiseOSError(osLastError()) if posix.IN6_IS_ADDR_V4MAPPED(addr6) != 0: From 5c7dc7df12b8e1bced94ca1a7da0418e64545ea2 Mon Sep 17 00:00:00 2001 From: ringabout <43030857+ringabout@users.noreply.github.com> Date: Sun, 13 Nov 2022 11:29:40 +0800 Subject: [PATCH 12/14] why bugs didn't show at once --- tests/stdlib/tnet_ll.nim | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/stdlib/tnet_ll.nim b/tests/stdlib/tnet_ll.nim index 2d340cea80460..13b56dbb93e4a 100644 --- a/tests/stdlib/tnet_ll.nim +++ b/tests/stdlib/tnet_ll.nim @@ -29,7 +29,7 @@ suite "inet_ntop tests": check: ip4.s_addr == 0x10111213'u32 var buff: array[0..255, char] - let r = inet_ntop(AF_INET, cast[pointer](ip4.s_addr.addr), buff[0].addr, buff.len.int32) + let r = inet_ntop(AF_INET, cast[pointer](ip4.s_addr.addr), cast[cstring](buff[0].addr), buff.len.int32) let res = if r == nil: "" else: $r check: res == "19.18.17.16" @@ -41,7 +41,7 @@ suite "inet_ntop tests": var ip6 = [0x1000'u16, 0x1001, 0x2000, 0x2001, 0x3000, 0x3001, 0x4000, 0x4001] var buff: array[0..255, char] - let r = inet_ntop(AF_INET6, cast[pointer](ip6[0].addr), buff[0].addr, buff.len.int32) + let r = inet_ntop(AF_INET6, cast[pointer](ip6[0].addr), cast[cstring](buff[0].addr), buff.len.int32) let res = if r == nil: "" else: $r check: not ipv6Support or res == "10:110:20:120:30:130:40:140" From 24393407e7011bd6a72eec4c5896ec888d1eb685 Mon Sep 17 00:00:00 2001 From: ringabout <43030857+ringabout@users.noreply.github.com> Date: Sun, 13 Nov 2022 13:33:18 +0800 Subject: [PATCH 13/14] add `nimPreviewCstringConversion` switch --- changelog.md | 2 ++ compiler/nim.cfg | 1 + compiler/sigmatch.nim | 3 +-- tests/stdlib/config.nims | 3 ++- tests/tools/config.nims | 3 ++- 5 files changed, 8 insertions(+), 4 deletions(-) diff --git a/changelog.md b/changelog.md index b40a5b63e83b7..062aa696e6f63 100644 --- a/changelog.md +++ b/changelog.md @@ -41,6 +41,8 @@ - Enabling `-d:nimPreviewSlimSystem` removes the import of `channels_builtin` in in the `system` module. +- Enabling `-d:nimPreviewCstringConversion`, `ptr char`, `ptr array[N, char]` and `ptr UncheckedArray[N, char]` don't support conversion cstring anymore. + - The `gc:v2` option is removed. - The `mainmodule` and `m` options are removed. diff --git a/compiler/nim.cfg b/compiler/nim.cfg index 2df0010852aeb..224d037dbe49f 100644 --- a/compiler/nim.cfg +++ b/compiler/nim.cfg @@ -6,6 +6,7 @@ define:booting define:nimcore define:nimPreviewFloatRoundtrip define:nimPreviewSlimSystem +define:nimPreviewCstringConversion define:nimPreviewRangeDefault threads:off diff --git a/compiler/sigmatch.nim b/compiler/sigmatch.nim index 15bc805ced1f3..2c4f5d2ea8b2c 100644 --- a/compiler/sigmatch.nim +++ b/compiler/sigmatch.nim @@ -1391,8 +1391,7 @@ proc typeRel(c: var TCandidate, f, aOrig: PType, of tyNil: result = f.allowsNil of tyString: result = isConvertible of tyPtr: - # ptr[Tag, char] is not convertible to 'cstring' for now: - if isDefined(c.c.config, "nimPreviewSlimSystem"): + if isDefined(c.c.config, "nimPreviewCstringConversion"): result = isNone else: if a.len == 1: diff --git a/tests/stdlib/config.nims b/tests/stdlib/config.nims index ea5d738e2bb05..cf97152bab752 100644 --- a/tests/stdlib/config.nims +++ b/tests/stdlib/config.nims @@ -1,3 +1,4 @@ switch("styleCheck", "usages") switch("styleCheck", "error") -switch("define", "nimPreviewSlimSystem") \ No newline at end of file +switch("define", "nimPreviewSlimSystem") +switch("define", "nimPreviewCstringConversion") \ No newline at end of file diff --git a/tests/tools/config.nims b/tests/tools/config.nims index 20eb34633a9c8..b4bb92b300707 100644 --- a/tests/tools/config.nims +++ b/tests/tools/config.nims @@ -1 +1,2 @@ ---d:nimPreviewSlimSystem \ No newline at end of file +--d:nimPreviewSlimSystem +--d:nimPreviewCstringConversion \ No newline at end of file From 6b95f40ea975c3b9ff194ca744aadede59b1c432 Mon Sep 17 00:00:00 2001 From: ringabout <43030857+ringabout@users.noreply.github.com> Date: Sun, 13 Nov 2022 13:34:31 +0800 Subject: [PATCH 14/14] typo --- changelog.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog.md b/changelog.md index 062aa696e6f63..c2fd211061650 100644 --- a/changelog.md +++ b/changelog.md @@ -41,7 +41,7 @@ - Enabling `-d:nimPreviewSlimSystem` removes the import of `channels_builtin` in in the `system` module. -- Enabling `-d:nimPreviewCstringConversion`, `ptr char`, `ptr array[N, char]` and `ptr UncheckedArray[N, char]` don't support conversion cstring anymore. +- Enabling `-d:nimPreviewCstringConversion`, `ptr char`, `ptr array[N, char]` and `ptr UncheckedArray[N, char]` don't support conversion to cstring anymore. - The `gc:v2` option is removed.