* don't zero out in a move in the VM * Add testcases for #17199 * Update tests/arc/tarcmisc.nim Co-authored-by: Timothee Cour <timothee.cour2@gmail.com> * Update tests/vm/tissues.nim Co-authored-by: Timothee Cour <timothee.cour2@gmail.com> * Fix test failures * Fix test * Fix tests Co-authored-by: Andreas Rumpf <rumpf_a@web.de> Co-authored-by: Timothee Cour <timothee.cour2@gmail.com>
This commit is contained in:
parent
e3e9742143
commit
bb3769975b
3 changed files with 63 additions and 18 deletions
|
|
@ -1354,9 +1354,10 @@ proc genMagic(c: PCtx; n: PNode; dest: var TDest; m: TMagic) =
|
||||||
if dest < 0: dest = c.getTemp(arg.typ)
|
if dest < 0: dest = c.getTemp(arg.typ)
|
||||||
gABC(c, arg, whichAsgnOpc(arg, requiresCopy=false), dest, a)
|
gABC(c, arg, whichAsgnOpc(arg, requiresCopy=false), dest, a)
|
||||||
# XXX use ldNullOpcode() here?
|
# XXX use ldNullOpcode() here?
|
||||||
c.gABx(n, opcLdNull, a, c.genType(arg.typ))
|
# Don't zero out the arg for now #17199
|
||||||
c.gABx(n, opcNodeToReg, a, a)
|
# c.gABx(n, opcLdNull, a, c.genType(arg.typ))
|
||||||
c.genAsgnPatch(arg, a)
|
# c.gABx(n, opcNodeToReg, a, a)
|
||||||
|
# c.genAsgnPatch(arg, a)
|
||||||
c.freeTemp(a)
|
c.freeTemp(a)
|
||||||
of mNodeId:
|
of mNodeId:
|
||||||
c.genUnaryABC(n, dest, opcNodeId)
|
c.genUnaryABC(n, dest, opcNodeId)
|
||||||
|
|
|
||||||
|
|
@ -390,3 +390,35 @@ proc newPixelBuffer(): PixelBuffer =
|
||||||
|
|
||||||
discard newPixelBuffer()
|
discard newPixelBuffer()
|
||||||
|
|
||||||
|
|
||||||
|
# bug #17199
|
||||||
|
|
||||||
|
proc passSeq(data: seq[string]) =
|
||||||
|
# used the system.& proc initially
|
||||||
|
let wat = data & "hello"
|
||||||
|
|
||||||
|
proc test2 =
|
||||||
|
let name = @["hello", "world"]
|
||||||
|
passSeq(name)
|
||||||
|
doAssert name == @["hello", "world"]
|
||||||
|
|
||||||
|
static: test2() # was buggy
|
||||||
|
test2()
|
||||||
|
|
||||||
|
proc merge(x: sink seq[string], y: sink string): seq[string] =
|
||||||
|
newSeq(result, x.len + 1)
|
||||||
|
for i in 0..x.len-1:
|
||||||
|
result[i] = move(x[i])
|
||||||
|
result[x.len] = move(y)
|
||||||
|
|
||||||
|
proc passSeq2(data: seq[string]) =
|
||||||
|
# used the system.& proc initially
|
||||||
|
let wat = merge(data, "hello")
|
||||||
|
|
||||||
|
proc test3 =
|
||||||
|
let name = @["hello", "world"]
|
||||||
|
passSeq2(name)
|
||||||
|
doAssert name == @["hello", "world"]
|
||||||
|
|
||||||
|
static: test3() # was buggy
|
||||||
|
test3()
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ import std/[isolation, json]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
proc main() =
|
proc main(moveZeroesOut: static bool) =
|
||||||
block:
|
block:
|
||||||
type
|
type
|
||||||
Empty = ref object
|
Empty = ref object
|
||||||
|
|
@ -19,64 +19,76 @@ proc main() =
|
||||||
block: # string literals
|
block: # string literals
|
||||||
var data = isolate("string")
|
var data = isolate("string")
|
||||||
doAssert data.extract == "string"
|
doAssert data.extract == "string"
|
||||||
doAssert data.extract == ""
|
if moveZeroesOut:
|
||||||
|
doAssert data.extract == ""
|
||||||
|
|
||||||
block: # string literals
|
block: # string literals
|
||||||
var data = isolate("")
|
var data = isolate("")
|
||||||
doAssert data.extract == ""
|
doAssert data.extract == ""
|
||||||
doAssert data.extract == ""
|
if moveZeroesOut:
|
||||||
|
doAssert data.extract == ""
|
||||||
|
|
||||||
block:
|
block:
|
||||||
var src = "string"
|
var src = "string"
|
||||||
var data = isolate(move src)
|
var data = isolate(move src)
|
||||||
doAssert data.extract == "string"
|
doAssert data.extract == "string"
|
||||||
doAssert src.len == 0
|
if moveZeroesOut:
|
||||||
|
doAssert src.len == 0
|
||||||
|
|
||||||
block: # int literals
|
block: # int literals
|
||||||
var data = isolate(1)
|
var data = isolate(1)
|
||||||
doAssert data.extract == 1
|
doAssert data.extract == 1
|
||||||
doAssert data.extract == 0
|
if moveZeroesOut:
|
||||||
|
doAssert data.extract == 0
|
||||||
|
|
||||||
block: # float literals
|
block: # float literals
|
||||||
var data = isolate(1.6)
|
var data = isolate(1.6)
|
||||||
doAssert data.extract == 1.6
|
doAssert data.extract == 1.6
|
||||||
doAssert data.extract == 0.0
|
if moveZeroesOut:
|
||||||
|
doAssert data.extract == 0.0
|
||||||
|
|
||||||
block:
|
block:
|
||||||
var data = isolate(@["1", "2"])
|
var data = isolate(@["1", "2"])
|
||||||
doAssert data.extract == @["1", "2"]
|
doAssert data.extract == @["1", "2"]
|
||||||
doAssert data.extract == @[]
|
if moveZeroesOut:
|
||||||
|
doAssert data.extract == @[]
|
||||||
|
|
||||||
block:
|
block:
|
||||||
var data = isolate(@["1", "2", "3", "4", "5"])
|
var data = isolate(@["1", "2", "3", "4", "5"])
|
||||||
doAssert data.extract == @["1", "2", "3", "4", "5"]
|
doAssert data.extract == @["1", "2", "3", "4", "5"]
|
||||||
doAssert data.extract == @[]
|
if moveZeroesOut:
|
||||||
|
doAssert data.extract == @[]
|
||||||
|
|
||||||
block:
|
block:
|
||||||
var data = isolate(@["", ""])
|
var data = isolate(@["", ""])
|
||||||
doAssert data.extract == @["", ""]
|
doAssert data.extract == @["", ""]
|
||||||
doAssert data.extract == @[]
|
if moveZeroesOut:
|
||||||
|
doAssert data.extract == @[]
|
||||||
|
|
||||||
block:
|
block:
|
||||||
var src = @["1", "2"]
|
var src = @["1", "2"]
|
||||||
var data = isolate(move src)
|
var data = isolate(move src)
|
||||||
doAssert data.extract == @["1", "2"]
|
doAssert data.extract == @["1", "2"]
|
||||||
doAssert src.len == 0
|
if moveZeroesOut:
|
||||||
|
doAssert src.len == 0
|
||||||
|
|
||||||
block:
|
block:
|
||||||
var data = isolate(@[1, 2])
|
var data = isolate(@[1, 2])
|
||||||
doAssert data.extract == @[1, 2]
|
doAssert data.extract == @[1, 2]
|
||||||
doAssert data.extract == @[]
|
if moveZeroesOut:
|
||||||
|
doAssert data.extract == @[]
|
||||||
|
|
||||||
block:
|
block:
|
||||||
var data = isolate(["1", "2"])
|
var data = isolate(["1", "2"])
|
||||||
doAssert data.extract == ["1", "2"]
|
doAssert data.extract == ["1", "2"]
|
||||||
doAssert data.extract == ["", ""]
|
if moveZeroesOut:
|
||||||
|
doAssert data.extract == ["", ""]
|
||||||
|
|
||||||
block:
|
block:
|
||||||
var data = isolate([1, 2])
|
var data = isolate([1, 2])
|
||||||
doAssert data.extract == [1, 2]
|
doAssert data.extract == [1, 2]
|
||||||
doAssert data.extract == [0, 0]
|
if moveZeroesOut:
|
||||||
|
doAssert data.extract == [0, 0]
|
||||||
|
|
||||||
block:
|
block:
|
||||||
type
|
type
|
||||||
|
|
@ -119,5 +131,5 @@ proc main() =
|
||||||
doAssert $x == """@[(value: "1234")]"""
|
doAssert $x == """@[(value: "1234")]"""
|
||||||
|
|
||||||
|
|
||||||
static: main()
|
static: main(moveZeroesOut = false)
|
||||||
main()
|
main(moveZeroesOut = true)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue