VM can now cast integer type arbitrarily. (#11459) [feature]

This commit is contained in:
Arne Döring 2019-06-10 19:58:11 +02:00 • committed by Andreas Rumpf
commit 94177f7357
2 changed files with 143 additions and 31 deletions

View file

@ -2,6 +2,8 @@ discard """
output: "OK"
"""
import macros
type
Dollar = distinct int
XCoord = distinct int32
@ -112,6 +114,130 @@ proc test() =
doAssert(not compiles(cast[uint32](I8)))
doAssert(not compiles(cast[uint64](I8)))
const prerecordedResults = [
# cast to char
"\0", "\255",
"\0", "\255",
"\0", "\255",
"\0", "\255",
"\0", "\255",
"\128", "\127",
"\0", "\255",
"\0", "\255",
"\0", "\255",
# cast to uint8
"0", "255",
"0", "255",
"0", "255",
"0", "255",
"0", "255",
"128", "127",
"0", "255",
"0", "255",
"0", "255",
# cast to uint16
"0", "255",
"0", "255",
"0", "65535",
"0", "65535",
"0", "65535",
"65408", "127",
"32768", "32767",
"0", "65535",
"0", "65535",
# cast to uint32
"0", "255",
"0", "255",
"0", "65535",
"0", "4294967295",
"0", "4294967295",
"4294967168", "127",
"4294934528", "32767",
"2147483648", "2147483647",
"0", "4294967295",
# cast to uint64
"0", "255",
"0", "255",
"0", "65535",
"0", "4294967295",
"0", "18446744073709551615",
"18446744073709551488", "127",
"18446744073709518848", "32767",
"18446744071562067968", "2147483647",
"9223372036854775808", "9223372036854775807",
# cast to int8
"0", "-1",
"0", "-1",
"0", "-1",
"0", "-1",
"0", "-1",
"-128", "127",
"0", "-1",
"0", "-1",
"0", "-1",
# cast to int16
"0", "255",
"0", "255",
"0", "-1",
"0", "-1",
"0", "-1",
"-128", "127",
"-32768", "32767",
"0", "-1",
"0", "-1",
# cast to int32
"0", "255",
"0", "255",
"0", "65535",
"0", "-1",
"0", "-1",
"-128", "127",
"-32768", "32767",
"-2147483648", "2147483647",
"0", "-1",
# cast to int64
"0", "255",
"0", "255",
"0", "65535",
"0", "4294967295",
"0", "-1",
"-128", "127",
"-32768", "32767",
"-2147483648", "2147483647",
"-9223372036854775808", "9223372036854775807",
]
proc free_integer_casting() =
# cast from every integer type to every type and ensure same
# behavior in vm and execution time.
macro bar(arg: untyped) =
result = newStmtList()
var i = 0
for it1 in arg:
let typA = it1[0]
for it2 in arg:
let lowB = it2[1]
let highB = it2[2]
let castExpr1 = nnkCast.newTree(typA, lowB)
let castExpr2 = nnkCast.newTree(typA, highB)
let lit1 = newLit(prerecordedResults[i*2])
let lit2 = newLit(prerecordedResults[i*2+1])
result.add quote do:
doAssert($(`castExpr1`) == `lit1`)
doAssert($(`castExpr2`) == `lit2`)
i += 1
bar([
(char, '\0', '\255'),
(uint8, 0'u8, 0xff'u8),
(uint16, 0'u16, 0xffff'u16),
(uint32, 0'u32, 0xffffffff'u32),
(uint64, 0'u64, 0xffffffffffffffff'u64),
(int8, 0x80'i8, 0x7f'i8),
(int16, 0x8000'i16, 0x7fff'i16),
(int32, 0x80000000'i32, 0x7fffffff'i32),
(int64, 0x8000000000000000'i64, 0x7fffffffffffffff'i64)
])
proc test_float_cast =
@ -158,9 +284,11 @@ proc test_float32_cast =
test()
test_float_cast()
test_float32_cast()
free_integer_casting()
static:
test()
test_float_cast()
test_float32_cast()
free_integer_casting()
echo "OK"