From e996d98a8a215666b1207477a651dfdbf6ece8cc Mon Sep 17 00:00:00 2001 From: flywind Date: Wed, 3 Mar 2021 18:58:50 +0800 Subject: [PATCH] fix #16384 and #17144 (#17126) [backport] (cherry picked from commit 6391f6e861d4c1dc87a94861374973b809f0d09f) --- compiler/vm.nim | 3 +- tests/stdlib/tlists.nim | 111 ++++++++++++++++++++++++---------------- 2 files changed, 68 insertions(+), 46 deletions(-) diff --git a/compiler/vm.nim b/compiler/vm.nim index 28355b6faa..c6e9b0d734 100644 --- a/compiler/vm.nim +++ b/compiler/vm.nim @@ -995,7 +995,8 @@ proc rawExecute(c: PCtx, start: int, tos: PStackFrame): TFullReg = let nc = regs[rc].node if nb.kind != nc.kind: discard elif (nb == nc) or (nb.kind == nkNilLit): ret = true # intentional - elif sameConstant(nb, nc): ret = true + elif (nb.kind in {nkSym, nkTupleConstr, nkClosure} and nb.typ.kind == tyProc) and sameConstant(nb, nc): + ret = true # this also takes care of procvar's, represented as nkTupleConstr, e.g. (nil, nil) elif nb.kind == nkIntLit and nc.kind == nkIntLit and nb.intVal == nc.intVal: # TODO: nkPtrLit let tb = nb.getTyp diff --git a/tests/stdlib/tlists.nim b/tests/stdlib/tlists.nim index a288af7819..4587534d0b 100644 --- a/tests/stdlib/tlists.nim +++ b/tests/stdlib/tlists.nim @@ -1,67 +1,88 @@ discard """ - output: '''true''' + targets: "c js" """ -import lists +import std/[lists, sequtils] const data = [1, 2, 3, 4, 5, 6] -block SinglyLinkedListTest1: - var L: SinglyLinkedList[int] - for d in items(data): L.prepend(d) - for d in items(data): L.append(d) - assert($L == "[6, 5, 4, 3, 2, 1, 1, 2, 3, 4, 5, 6]") - assert(4 in L) +template main = + block SinglyLinkedListTest1: + var L: SinglyLinkedList[int] + for d in items(data): L.prepend(d) + for d in items(data): L.append(d) + doAssert($L == "[6, 5, 4, 3, 2, 1, 1, 2, 3, 4, 5, 6]") -block SinglyLinkedListTest2: - var L: SinglyLinkedList[string] - for d in items(data): L.prepend($d) - assert($L == """["6", "5", "4", "3", "2", "1"]""") + doAssert(4 in L) - assert("4" in L) + block SinglyLinkedListTest2: + var L: SinglyLinkedList[string] + for d in items(data): L.prepend($d) + doAssert($L == """["6", "5", "4", "3", "2", "1"]""") + + doAssert("4" in L) -block DoublyLinkedListTest1: - var L: DoublyLinkedList[int] - for d in items(data): L.prepend(d) - for d in items(data): L.append(d) - L.remove(L.find(1)) - assert($L == "[6, 5, 4, 3, 2, 1, 2, 3, 4, 5, 6]") + block DoublyLinkedListTest1: + var L: DoublyLinkedList[int] + for d in items(data): L.prepend(d) + for d in items(data): L.append(d) + L.remove(L.find(1)) + doAssert($L == "[6, 5, 4, 3, 2, 1, 2, 3, 4, 5, 6]") - assert(4 in L) + doAssert(4 in L) -block SinglyLinkedRingTest1: - var L: SinglyLinkedRing[int] - L.prepend(4) - assert($L == "[4]") - L.prepend(4) + block SinglyLinkedRingTest1: + var L: SinglyLinkedRing[int] + L.prepend(4) + doAssert($L == "[4]") + L.prepend(4) - assert($L == "[4, 4]") - assert(4 in L) + doAssert($L == "[4, 4]") + doAssert(4 in L) -block DoublyLinkedRingTest1: - var L: DoublyLinkedRing[int] - L.prepend(4) - assert($L == "[4]") - L.prepend(4) + block DoublyLinkedRingTest1: + var L: DoublyLinkedRing[int] + L.prepend(4) + doAssert($L == "[4]") + L.prepend(4) - assert($L == "[4, 4]") - assert(4 in L) + doAssert($L == "[4, 4]") + doAssert(4 in L) - L.append(3) - L.append(5) - assert($L == "[4, 4, 3, 5]") + L.append(3) + L.append(5) + doAssert($L == "[4, 4, 3, 5]") - L.remove(L.find(3)) - L.remove(L.find(5)) - L.remove(L.find(4)) - L.remove(L.find(4)) - assert($L == "[]") - assert(4 notin L) + L.remove(L.find(3)) + L.remove(L.find(5)) + L.remove(L.find(4)) + L.remove(L.find(4)) + doAssert($L == "[]") + doAssert(4 notin L) + block tlistsToString: + block: + var l = initDoublyLinkedList[int]() + l.append(1) + l.append(2) + l.append(3) + doAssert $l == "[1, 2, 3]" + block: + var l = initDoublyLinkedList[string]() + l.append("1") + l.append("2") + l.append("3") + doAssert $l == """["1", "2", "3"]""" + block: + var l = initDoublyLinkedList[char]() + l.append('1') + l.append('2') + l.append('3') + doAssert $l == """['1', '2', '3']""" -echo "true" - +static: main() +main()