From e8ec3efd3d33eeb133b0d6290ee3702b54205eae Mon Sep 17 00:00:00 2001 From: ringabout <43030857+ringabout@users.noreply.github.com> Date: Thu, 8 Jun 2023 20:08:49 +0800 Subject: [PATCH] allow addressing elements of openArray[char] in VM (#22045) allow addressing elements of openArray[char] (cherry picked from commit a8d0dda8333f78dfa427e0808ff84280363355d4) --- compiler/vm.nim | 2 ++ tests/vm/tvmmisc.nim | 14 ++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/compiler/vm.nim b/compiler/vm.nim index fda2302010..22aa192d28 100644 --- a/compiler/vm.nim +++ b/compiler/vm.nim @@ -772,6 +772,8 @@ proc rawExecute(c: PCtx, start: int, tos: PStackFrame): TFullReg = else: if src.kind notin {nkEmpty..nkTripleStrLit} and idx <% src.len: takeAddress regs[ra], src.sons[idx] + elif src.kind in nkStrKinds and idx <% src.strVal.len: + regs[ra] = takeCharAddress(c, src, idx, pc) else: stackTrace(c, tos, pc, formatErrorIndexBound(idx, src.safeLen-1)) of opcLdStrIdx: diff --git a/tests/vm/tvmmisc.nim b/tests/vm/tvmmisc.nim index af7de44e0a..c179e3bf54 100644 --- a/tests/vm/tvmmisc.nim +++ b/tests/vm/tvmmisc.nim @@ -657,3 +657,17 @@ proc macroGlobal = static: macroGlobal() macroGlobal() + +block: + proc swap[T](x: var T): T = + result = x + x = default(T) + + proc merge[T](a, b: var openArray[T]) = + a[0] = swap b[0] + + static: + var x = "abc" + var y = "356" + merge(x, y) + doAssert x == "3bc"