diff --git a/doc/destructors.rst b/doc/destructors.rst index 3c50241ebc..ff6ceaf5e3 100644 --- a/doc/destructors.rst +++ b/doc/destructors.rst @@ -676,25 +676,25 @@ moveMem(addr y[0], addr x[0], 3) ``` The program fails because we need to prepare a fresh copy for the variable `y`. -`prepareStrMutation` should be called before the address operation. +`prepareMutation` should be called before the address operation. ```nim var x = "abc" var y = x -prepareStrMutation(y) +prepareMutation(y) moveMem(addr y[0], addr x[0], 3) assert y == "abc" ``` -Now `prepareStrMutation` solves the problem. +Now `prepareMutation` solves the problem. It manually creates a fresh copy and makes the variable `y` mutable. ```nim var x = "abc" var y = x -prepareStrMutation(y) +prepareMutation(y) moveMem(addr y[0], addr x[0], 3) moveMem(addr y[0], addr x[0], 3) moveMem(addr y[0], addr x[0], 3) diff --git a/lib/std/strbasics.nim b/lib/std/strbasics.nim index 0ea5a28174..9232204abe 100644 --- a/lib/std/strbasics.nim +++ b/lib/std/strbasics.nim @@ -81,7 +81,7 @@ func setSlice*(s: var string, slice: Slice[int]) = impl() else: when defined(nimSeqsV2): - prepareStrMutation(s) + prepareMutation(s) moveMem(addr s[0], addr s[first], last - first + 1) s.setLen(last - first + 1) diff --git a/lib/system.nim b/lib/system.nim index 605670f446..559c71f01a 100644 --- a/lib/system.nim +++ b/lib/system.nim @@ -3122,14 +3122,14 @@ when not defined(createNimHcr) and not defined(nimscript): include nimhcr when notJSnotNims and not defined(nimSeqsV2): - proc prepareStrMutation*(s: var string) {.inline.} = + proc prepareMutation*(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 + ## therefore you should call `prepareMutation` before modifying the strings ## via `addr`. runnableExamples("--gc:arc"): var x = "abc" var y = "defgh" - prepareStrMutation(y) # without this, you may get a `SIGBUS` or `SIGSEGV` + prepareMutation(y) # without this, you may get a `SIGBUS` or `SIGSEGV` moveMem(addr y[0], addr x[0], x.len) assert y == "abcgh" discard diff --git a/lib/system/strs_v2.nim b/lib/system/strs_v2.nim index 2647f7dccd..6944cdc589 100644 --- a/lib/system/strs_v2.nim +++ b/lib/system/strs_v2.nim @@ -169,9 +169,9 @@ proc nimPrepareStrMutationV2(s: var NimStringV2) {.compilerRtl, inline.} = if s.p != nil and (s.p.cap and strlitFlag) == strlitFlag: nimPrepareStrMutationImpl(s) -proc prepareStrMutation*(s: var string) {.inline.} = +proc prepareMutation*(s: var string) {.inline.} = # string literals are "copy on write", so you need to call - # `prepareStrMutation` before modifying the strings via `addr`. + # `prepareMutation` before modifying the strings via `addr`. {.cast(noSideEffect).}: let s = unsafeAddr s nimPrepareStrMutationV2(cast[ptr NimStringV2](s)[])