diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2019-03-15 14:57:40 +0100 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2019-03-15 17:51:52 +0100 |
commit | 8e5c1436ad72fe9e1343db6744c742ec8e4a6623 (patch) | |
tree | b2ce76966d5d5639b34296a0672c3f25b28c27c6 /lib/system | |
parent | 16355de5eb8a1525e4fe386d6512d6f7fb3da382 (diff) | |
download | Nim-8e5c1436ad72fe9e1343db6744c742ec8e4a6623.tar.gz |
fixes #10845
Diffstat (limited to 'lib/system')
-rw-r--r-- | lib/system/sysstr.nim | 35 |
1 files changed, 20 insertions, 15 deletions
diff --git a/lib/system/sysstr.nim b/lib/system/sysstr.nim index 9ba432459..bc405c807 100644 --- a/lib/system/sysstr.nim +++ b/lib/system/sysstr.nim @@ -116,22 +116,27 @@ proc newOwnedString(src: NimString; n: int): NimString = proc copyStringRC1(src: NimString): NimString {.compilerRtl.} = if src != nil: - when declared(newObjRC1) and not defined(gcRegions): - var s = src.len - if s < 7: s = 7 - result = cast[NimString](newObjRC1(addr(strDesc), sizeof(TGenericSeq) + - s+1)) - result.reserved = s - when defined(gogc): - result.elemSize = 1 + if (src.reserved and seqShallowFlag) != 0: + result = src + when declared(incRef): + incRef(usrToCell(result)) else: - result = rawNewStringNoInit(src.len) - result.len = src.len - copyMem(addr(result.data), addr(src.data), src.len + 1) - sysAssert((seqShallowFlag and result.reserved) == 0, "copyStringRC1") - when defined(nimShallowStrings): - if (src.reserved and strlitFlag) != 0: - result.reserved = (result.reserved and not strlitFlag) or seqShallowFlag + when declared(newObjRC1) and not defined(gcRegions): + var s = src.len + if s < 7: s = 7 + result = cast[NimString](newObjRC1(addr(strDesc), sizeof(TGenericSeq) + + s+1)) + result.reserved = s + when defined(gogc): + result.elemSize = 1 + else: + result = rawNewStringNoInit(src.len) + result.len = src.len + copyMem(addr(result.data), addr(src.data), src.len + 1) + sysAssert((seqShallowFlag and result.reserved) == 0, "copyStringRC1") + when defined(nimShallowStrings): + if (src.reserved and strlitFlag) != 0: + result.reserved = (result.reserved and not strlitFlag) or seqShallowFlag proc copyDeepString(src: NimString): NimString {.inline.} = if src != nil: |