Fix operations on string as openarray in VM. (#6257)

* fix openarray.len for string as openArray in VM.
* fix openarray[idx] for string as openArray in VM.
* fix openarray[idx]=val for string as openArray in VM.
* add tests for passing string as openArray in VM.
* fix issue with NimNode.len
NimNode.len was also returning len for string literals.
also fix logic bug in if/elif chain.
This commit is contained in:
Parashurama 2017-09-15 13:35:57 +02:00 • committed by Andreas Rumpf
commit 88a5e9d88c
5 changed files with 69 additions and 8 deletions

View file

@ -1006,6 +1006,12 @@ proc safeLen*(n: PNode): int {.inline.} =
if n.kind in {nkNone..nkNilLit} or isNil(n.sons): result = 0
else: result = len(n.sons)
proc safeArrLen*(n: PNode): int {.inline.} =
## works for array-like objects (strings passed as openArray in VM).
if n.kind in {nkStrLit..nkTripleStrLit}:result = len(n.strVal)
elif n.kind in {nkNone..nkFloat128Lit}: result = 0
else: result = len(n)
proc add*(father, son: PNode) =
assert son != nil
if isNil(father.sons): father.sons = @[]