1717package vm
1818
1919import (
20+ "math/bits"
2021 "testing"
2122
2223 "github.com/ethereum/go-ethereum/crypto"
@@ -28,24 +29,27 @@ func TestJumpDestAnalysis(t *testing.T) {
2829 exp byte
2930 which int
3031 }{
31- {[]byte {byte (PUSH1 ), 0x01 , 0x01 , 0x01 }, 0x40 , 0 },
32- {[]byte {byte (PUSH1 ), byte (PUSH1 ), byte (PUSH1 ), byte (PUSH1 )}, 0x50 , 0 },
33- {[]byte {byte (PUSH8 ), byte (PUSH8 ), byte (PUSH8 ), byte (PUSH8 ), byte (PUSH8 ), byte (PUSH8 ), byte (PUSH8 ), byte (PUSH8 ), 0x01 , 0x01 , 0x01 }, 0x7F , 0 },
34- {[]byte {byte (PUSH8 ), 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 }, 0x80 , 1 },
35- {[]byte {0x01 , 0x01 , 0x01 , 0x01 , 0x01 , byte (PUSH2 ), byte (PUSH2 ), byte (PUSH2 ), 0x01 , 0x01 , 0x01 }, 0x03 , 0 },
36- {[]byte {0x01 , 0x01 , 0x01 , 0x01 , 0x01 , byte (PUSH2 ), 0x01 , 0x01 , 0x01 , 0x01 , 0x01 }, 0x00 , 1 },
37- {[]byte {byte (PUSH3 ), 0x01 , 0x01 , 0x01 , byte (PUSH1 ), 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 }, 0x74 , 0 },
38- {[]byte {byte (PUSH3 ), 0x01 , 0x01 , 0x01 , byte (PUSH1 ), 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 }, 0x00 , 1 },
39- {[]byte {0x01 , byte (PUSH8 ), 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 }, 0x3F , 0 },
40- {[]byte {0x01 , byte (PUSH8 ), 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 }, 0xC0 , 1 },
41- {[]byte {byte (PUSH16 ), 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 }, 0x7F , 0 },
42- {[]byte {byte (PUSH16 ), 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 }, 0xFF , 1 },
43- {[]byte {byte (PUSH16 ), 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 }, 0x80 , 2 },
44- {[]byte {byte (PUSH8 ), 0x01 , 0x02 , 0x03 , 0x04 , 0x05 , 0x06 , 0x07 , 0x08 , byte (PUSH1 ), 0x01 }, 0x7f , 0 },
45- {[]byte {byte (PUSH8 ), 0x01 , 0x02 , 0x03 , 0x04 , 0x05 , 0x06 , 0x07 , 0x08 , byte (PUSH1 ), 0x01 }, 0xA0 , 1 },
46- {[]byte {byte (PUSH32 )}, 0x7F , 0 },
47- {[]byte {byte (PUSH32 )}, 0xFF , 1 },
48- {[]byte {byte (PUSH32 )}, 0xFF , 2 },
32+ {[]byte {byte (PUSH1 ), 0x01 , 0x01 , 0x01 }, 0b0000_0010 , 0 },
33+ {[]byte {byte (PUSH1 ), byte (PUSH1 ), byte (PUSH1 ), byte (PUSH1 )}, 0b0000_1010 , 0 },
34+ {[]byte {0x00 , byte (PUSH1 ), 0x00 , byte (PUSH1 ), 0x00 , byte (PUSH1 ), 0x00 , byte (PUSH1 )}, 0b0101_0100 , 0 },
35+ {[]byte {byte (PUSH8 ), byte (PUSH8 ), byte (PUSH8 ), byte (PUSH8 ), byte (PUSH8 ), byte (PUSH8 ), byte (PUSH8 ), byte (PUSH8 ), 0x01 , 0x01 , 0x01 }, bits .Reverse8 (0x7F ), 0 },
36+ {[]byte {byte (PUSH8 ), 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 }, 0b0000_0001 , 1 },
37+ {[]byte {0x01 , 0x01 , 0x01 , 0x01 , 0x01 , byte (PUSH2 ), byte (PUSH2 ), byte (PUSH2 ), 0x01 , 0x01 , 0x01 }, 0b1100_0000 , 0 },
38+ {[]byte {0x01 , 0x01 , 0x01 , 0x01 , 0x01 , byte (PUSH2 ), 0x01 , 0x01 , 0x01 , 0x01 , 0x01 }, 0b0000_0000 , 1 },
39+ {[]byte {byte (PUSH3 ), 0x01 , 0x01 , 0x01 , byte (PUSH1 ), 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 }, 0b0010_1110 , 0 },
40+ {[]byte {byte (PUSH3 ), 0x01 , 0x01 , 0x01 , byte (PUSH1 ), 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 }, 0b0000_0000 , 1 },
41+ {[]byte {0x01 , byte (PUSH8 ), 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 }, 0b1111_1100 , 0 },
42+ {[]byte {0x01 , byte (PUSH8 ), 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 }, 0b0000_0011 , 1 },
43+ {[]byte {byte (PUSH16 ), 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 }, 0b1111_1110 , 0 },
44+ {[]byte {byte (PUSH16 ), 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 }, 0b1111_1111 , 1 },
45+ {[]byte {byte (PUSH16 ), 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 }, 0b0000_0001 , 2 },
46+ {[]byte {byte (PUSH8 ), 0x01 , 0x02 , 0x03 , 0x04 , 0x05 , 0x06 , 0x07 , 0x08 , byte (PUSH1 ), 0x01 }, 0b1111_1110 , 0 },
47+ {[]byte {byte (PUSH8 ), 0x01 , 0x02 , 0x03 , 0x04 , 0x05 , 0x06 , 0x07 , 0x08 , byte (PUSH1 ), 0x01 }, 0b0000_0101 , 1 },
48+ {[]byte {byte (PUSH32 )}, 0b1111_1110 , 0 },
49+ {[]byte {byte (PUSH32 )}, 0b1111_1111 , 1 },
50+ {[]byte {byte (PUSH32 )}, 0b1111_1111 , 2 },
51+ {[]byte {byte (PUSH32 )}, 0b1111_1111 , 3 },
52+ {[]byte {byte (PUSH32 )}, 0b0000_0001 , 4 },
4953 }
5054 for i , test := range tests {
5155 ret := codeBitmap (test .code )
0 commit comments