Skip to content

Commit 31bdf9c

Browse files
author
Mohammad Rezaei
committed
add a semantic test for masks
1 parent 57125cb commit 31bdf9c

File tree

1 file changed

+78
-0
lines changed

1 file changed

+78
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
// test various masks, some generated by the compiler internally
2+
3+
contract MaskTests {
4+
struct FitsInU256 {
5+
uint8 oneByte;
6+
uint96 bigNightySixer;
7+
uint64 sixtyFourMiddle;
8+
uint16 sixteener;
9+
uint72 seventyTwo;
10+
}
11+
12+
FitsInU256 first;
13+
14+
constructor() {
15+
first = FitsInU256(0x98, 0x010203040506070809a1b2c3, 0xdeadcafefeedbead, 0x1234, 0x102030405060708090);
16+
}
17+
18+
// the compiler generates masks for these functions
19+
function firstOneByte() external view returns (uint8) {
20+
return first.oneByte;
21+
}
22+
23+
function firstBigNightySixer() external view returns (uint96) {
24+
return first.bigNightySixer;
25+
}
26+
27+
function firstSixtyFourMiddle() external view returns (uint64) {
28+
return first.sixtyFourMiddle;
29+
}
30+
31+
function firstSixteener() external view returns (uint16) {
32+
return first.sixteener;
33+
}
34+
35+
function firstSeventyTwo() external view returns (uint72) {
36+
return first.seventyTwo;
37+
}
38+
39+
function setMiddleSixtyFour(uint64 x) external returns (uint96) {
40+
first.sixtyFourMiddle = x;
41+
return first.bigNightySixer + first.sixtyFourMiddle + first.sixteener;
42+
}
43+
44+
// hand coded masks
45+
function add55(uint x) external pure returns (uint) {
46+
return x + ((uint(1) << 55) - 1);
47+
}
48+
49+
function add155(uint x) external pure returns (uint) {
50+
return x + ((uint(1) << 155) - 1);
51+
}
52+
53+
function add55shift(uint x) external pure returns (uint) {
54+
return x + (((uint(1) << 55) - 1) << 67);
55+
}
56+
57+
function add155shift(uint x) external pure returns (uint) {
58+
return x + (((uint(1) << 155) - 1) << 67);
59+
}
60+
}
61+
// ====
62+
// EVMVersion: =current
63+
// ----
64+
// firstOneByte() -> 0x98
65+
// firstBigNightySixer() -> 0x010203040506070809a1b2c3
66+
// firstSixtyFourMiddle() -> 0xdeadcafefeedbead
67+
// firstSixteener() -> 0x1234
68+
// firstSeventyTwo() -> 0x102030405060708090
69+
// add55(uint256): 1 -> 0x80000000000000
70+
// add55(uint256): 2 -> 0x80000000000001
71+
// add55(uint256): 0x1000000000000000 -> 0x107fffffffffffff
72+
// add155(uint256): 1 -> 0x800000000000000000000000000000000000000
73+
// add55shift(uint256): 1 -> 0x3fffffffffffff80000000000000001
74+
// add55shift(uint256): 0x80000000000000000 -> 0x4000000000000000000000000000000
75+
// add155shift(uint256): 1 -> 0x3ffffffffffffffffffffffffffffffffffffff80000000000000001
76+
// add155shift(uint256): 0x80000000000000000 -> 0x40000000000000000000000000000000000000000000000000000000
77+
// setMiddleSixtyFour(uint64): 0 -> 0x010203040506070809a1c4f7
78+
// setMiddleSixtyFour(uint64): 0xffffffffffffffff -> 0x010203050506070809a1c4f6

0 commit comments

Comments
 (0)