std/hashes: hash(ref|ptr|pointer) + other improvements (#17731)

This commit is contained in:
Timothee Cour
2021-04-16 05:21:26 -07:00
committed by GitHub
parent 611b88763f
commit d19e4310dc
5 changed files with 96 additions and 36 deletions

View File

@@ -3,7 +3,7 @@ discard """
"""
import std/hashes
from stdtest/testutils import disableVm, whenVMorJs
when not defined(js) and not defined(cpp):
block:
@@ -177,5 +177,25 @@ proc main() =
doAssert hash(Obj5(t: false, x: 1)) == hash(Obj5(t: true, y: 1))
doAssert hash(Obj5(t: false, x: 1)) != hash(Obj5(t: true, y: 2))
block: # hash(ref|ptr|pointer)
var a: array[10, uint8]
# disableVm:
whenVMorJs:
# pending fix proposed in https://github.com/nim-lang/Nim/issues/15952#issuecomment-786312417
discard
do:
assert a[0].addr.hash != a[1].addr.hash
assert cast[pointer](a[0].addr).hash == a[0].addr.hash
block: # hash(ref)
type A = ref object
x: int
let a = A(x: 3)
disableVm: # xxx Error: VM does not support 'cast' from tyRef to tyPointer
let ha = a.hash
assert ha != A(x: 3).hash # A(x: 3) is a different ref object from `a`.
a.x = 4
assert ha == a.hash # the hash only depends on the address
static: main()
main()

View File

@@ -3,7 +3,7 @@ discard """
"""
import std/strutils
from stdtest/testutils import disableVm
# xxx each instance of `disableVm` and `when not defined js:` should eventually be fixed
template rejectParse(e) =
@@ -12,10 +12,6 @@ template rejectParse(e) =
raise newException(AssertionDefect, "This was supposed to fail: $#!" % astToStr(e))
except ValueError: discard
template disableVm(body) =
when nimvm: discard
else: body
template main() =
block: # strip
doAssert strip(" ha ") == "ha"