diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2018-04-28 15:13:44 +0200 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2018-04-28 15:13:44 +0200 |
commit | f64f9e50cca38db24f68ee70d979fd55b1c49868 (patch) | |
tree | 19681dd716159a57c6863c182c85920755c6c3a3 /lib/system | |
parent | 13a380bca6d64310eb1383434519b153f1b48e57 (diff) | |
download | Nim-f64f9e50cca38db24f68ee70d979fd55b1c49868.tar.gz |
correct comparisons for nil strings/seqs
Diffstat (limited to 'lib/system')
-rw-r--r-- | lib/system/sysstr.nim | 29 |
1 files changed, 21 insertions, 8 deletions
diff --git a/lib/system/sysstr.nim b/lib/system/sysstr.nim index 9e7ee903f..bba59e930 100644 --- a/lib/system/sysstr.nim +++ b/lib/system/sysstr.nim @@ -22,21 +22,34 @@ proc resize(old: int): int {.inline.} = proc cmpStrings(a, b: NimString): int {.inline, compilerProc.} = if a == b: return 0 - if a == nil: return -1 - if b == nil: return 1 - let minlen = min(a.len, b.len) + when defined(nimNoNil): + let alen = if a == nil: 0 else: a.len + let blen = if b == nil: 0 else: b.len + else: + if a == nil: return -1 + if b == nil: return 1 + let alen = a.len + let blen = b.len + let minlen = min(alen, blen) if minlen > 0: result = c_memcmp(addr a.data, addr b.data, minlen.csize) if result == 0: - result = a.len - b.len + result = alen - blen else: - result = a.len - b.len + result = alen - blen proc eqStrings(a, b: NimString): bool {.inline, compilerProc.} = if a == b: return true - if a == nil or b == nil: return false - return a.len == b.len and - equalMem(addr(a.data), addr(b.data), a.len) + when defined(nimNoNil): + let alen = if a == nil: 0 else: a.len + let blen = if b == nil: 0 else: b.len + else: + if a == nil or b == nil: return false + let alen = a.len + let blen = b.len + if alen == blen: + if alen == 0: return true + return equalMem(addr(a.data), addr(b.data), alen) when declared(allocAtomic): template allocStr(size: untyped): untyped = |