* fixes #17173 * add testcase (#17214) * Apply suggestions from code review * fix for newruntime * Apply suggestions from code review * Update lib/system.nim * Update lib/system.nim * Update lib/system.nim Co-authored-by: Danil Yarantsev <tiberiumk12@gmail.com> Co-authored-by: flywind <xzsflywind@gmail.com> Co-authored-by: Danil Yarantsev <tiberiumk12@gmail.com>
This commit is contained in:
parent
c625ce80cb
commit
bb0c19f42c
5 changed files with 33 additions and 2 deletions
|
|
@ -173,6 +173,12 @@ provided by the operating system.
|
||||||
dumping (on select signals) and notifying the parent process about the cause
|
dumping (on select signals) and notifying the parent process about the cause
|
||||||
of termination.
|
of termination.
|
||||||
|
|
||||||
|
- Added `system.prepareStrMutation` for better support of low
|
||||||
|
level `moveMem`, `copyMem` operations for Orc's copy-on-write string
|
||||||
|
implementation.
|
||||||
|
|
||||||
|
- `hashes.hash` now supports `object`, but can be overloaded.
|
||||||
|
|
||||||
- Added `std/strbasics` for high performance string operations.
|
- Added `std/strbasics` for high performance string operations.
|
||||||
Added `strip`, `setSlice`, `add(a: var string, b: openArray[char])`.
|
Added `strip`, `setSlice`, `add(a: var string, b: openArray[char])`.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -80,6 +80,8 @@ func setSlice*(s: var string, slice: Slice[int]) =
|
||||||
when not declared(moveMem):
|
when not declared(moveMem):
|
||||||
impl()
|
impl()
|
||||||
else:
|
else:
|
||||||
|
when defined(nimSeqsV2):
|
||||||
|
prepareStrMutation(s)
|
||||||
moveMem(addr s[0], addr s[first], last - first + 1)
|
moveMem(addr s[0], addr s[first], last - first + 1)
|
||||||
s.setLen(last - first + 1)
|
s.setLen(last - first + 1)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3127,3 +3127,9 @@ export io
|
||||||
|
|
||||||
when not defined(createNimHcr) and not defined(nimscript):
|
when not defined(createNimHcr) and not defined(nimscript):
|
||||||
include nimhcr
|
include nimhcr
|
||||||
|
|
||||||
|
when notJSnotNims and not defined(nimSeqsV2):
|
||||||
|
proc prepareStrMutation*(s: var string) {.inline.} =
|
||||||
|
## String literals (e.g. "abc", etc) in the ARC/ORC mode are "copy on write",
|
||||||
|
## therefore you should call `prepareStrMutation` before modifying the strings.
|
||||||
|
discard
|
||||||
|
|
|
||||||
|
|
@ -168,3 +168,10 @@ proc nimPrepareStrMutationImpl(s: var NimStringV2) =
|
||||||
proc nimPrepareStrMutationV2(s: var NimStringV2) {.compilerRtl, inline.} =
|
proc nimPrepareStrMutationV2(s: var NimStringV2) {.compilerRtl, inline.} =
|
||||||
if s.p != nil and (s.p.cap and strlitFlag) == strlitFlag:
|
if s.p != nil and (s.p.cap and strlitFlag) == strlitFlag:
|
||||||
nimPrepareStrMutationImpl(s)
|
nimPrepareStrMutationImpl(s)
|
||||||
|
|
||||||
|
proc prepareStrMutation*(s: var string) {.inline.} =
|
||||||
|
# string literals are "copy on write", so you need to call
|
||||||
|
# `prepareStrMutation` before modifying the strings.
|
||||||
|
{.cast(noSideEffect).}:
|
||||||
|
let s = unsafeAddr s
|
||||||
|
nimPrepareStrMutationV2(cast[ptr NimStringV2](s)[])
|
||||||
|
|
|
||||||
10
tests/arc/t17173.nim
Normal file
10
tests/arc/t17173.nim
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
discard """
|
||||||
|
matrix: "--gc:refc; --gc:arc; --newruntime"
|
||||||
|
"""
|
||||||
|
|
||||||
|
import std/strbasics
|
||||||
|
|
||||||
|
|
||||||
|
var a = " vhellov "
|
||||||
|
strip(a)
|
||||||
|
doAssert a == "vhellov"
|
||||||
Loading…
Add table
Add a link
Reference in a new issue