VM can now cast integer type arbitrarily. (#11459) [feature]
This commit is contained in:
parent
7cf9b522b5
commit
94177f7357
2 changed files with 143 additions and 31 deletions
|
|
@ -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"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue