From 8e5c1436ad72fe9e1343db6744c742ec8e4a6623 Mon Sep 17 00:00:00 2001 From: Andreas Rumpf Date: Fri, 15 Mar 2019 14:57:40 +0100 Subject: fixes #10845 --- lib/system/sysstr.nim | 35 ++++++++++++++++++++--------------- 1 file 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: -- cgit 1.4.1-2-gfad0