make var string return var char w/ BackwardsIndex (#15461)

* make var string return var char w/ BackwardsIndex

fixes #14497

* work around VM bug
* properly workaround again
This commit is contained in:
hlaaftana 2020-11-12 13:44:21 +03:00 • committed by GitHub
commit 527e792827
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 11 additions and 3 deletions

View file

@ -69,7 +69,7 @@ proc addNormalizePath*(x: string; result: var string; state: var int;
while hasNext(it, x): while hasNext(it, x):
let b = next(it, x) let b = next(it, x)
if (state shr 1 == 0) and isSlash(x, b): if (state shr 1 == 0) and isSlash(x, b):
if result.len == 0 or result[^1] notin {DirSep, AltSep}: if result.len == 0 or result[result.len - 1] notin {DirSep, AltSep}:
result.add dirSep result.add dirSep
state = state or 1 state = state or 1
elif isDotDot(x, b): elif isDotDot(x, b):
@ -87,13 +87,13 @@ proc addNormalizePath*(x: string; result: var string; state: var int;
setLen(result, d-1) setLen(result, d-1)
dec state, 2 dec state, 2
else: else:
if result.len > 0 and result[^1] notin {DirSep, AltSep}: if result.len > 0 and result[result.len - 1] notin {DirSep, AltSep}:
result.add dirSep result.add dirSep
result.add substr(x, b[0], b[1]) result.add substr(x, b[0], b[1])
elif isDot(x, b): elif isDot(x, b):
discard "discard the dot" discard "discard the dot"
elif b[1] >= b[0]: elif b[1] >= b[0]:
if result.len > 0 and result[^1] notin {DirSep, AltSep}: if result.len > 0 and result[result.len - 1] notin {DirSep, AltSep}:
result.add dirSep result.add dirSep
result.add substr(x, b[0], b[1]) result.add substr(x, b[0], b[1])
inc state, 2 inc state, 2

View file

@ -2579,6 +2579,7 @@ proc `[]`*[T](s: var openArray[T]; i: BackwardsIndex): var T {.inline.} =
system.`[]`(s, s.len - int(i)) system.`[]`(s, s.len - int(i))
proc `[]`*[Idx, T](a: var array[Idx, T]; i: BackwardsIndex): var T {.inline.} = proc `[]`*[Idx, T](a: var array[Idx, T]; i: BackwardsIndex): var T {.inline.} =
a[Idx(a.len - int(i) + int low(a))] a[Idx(a.len - int(i) + int low(a))]
proc `[]`*(s: var string; i: BackwardsIndex): var char {.inline.} = s[s.len - int(i)]
proc `[]=`*[T](s: var openArray[T]; i: BackwardsIndex; x: T) {.inline.} = proc `[]=`*[T](s: var openArray[T]; i: BackwardsIndex; x: T) {.inline.} =
system.`[]=`(s, s.len - int(i), x) system.`[]=`(s, s.len - int(i), x)

View file

@ -91,3 +91,10 @@ proc tester[T](x: T) =
tester(1) tester(1)
# #14497
func reverse*(a: string): string =
result = a
for i in 0 ..< a.len div 2:
swap(result[i], result[^(i + 1)])
doAssert reverse("hello") == "olleh"