@@ -927,3 +927,75 @@ func TestOpMCopy(t *testing.T) {
927927 }
928928 }
929929}
930+
931+ // TestPush sanity-checks how code with immediates are handled when the code size is
932+ // smaller than the size of the immediate.
933+ func TestPush (t * testing.T ) {
934+ code := common .FromHex ("0011223344556677889900aabbccddeeff0102030405060708090a0b0c0d0e0ff1e1d1c1b1a19181716151413121" )
935+
936+ push32 := makePush (32 , 32 )
937+
938+ scope := & ScopeContext {
939+ Memory : nil ,
940+ Stack : newstack (),
941+ Contract : & Contract {
942+ Code : code ,
943+ },
944+ }
945+ for i , want := range []string {
946+ "0x11223344556677889900aabbccddeeff0102030405060708090a0b0c0d0e0ff1" ,
947+ "0x223344556677889900aabbccddeeff0102030405060708090a0b0c0d0e0ff1e1" ,
948+ "0x3344556677889900aabbccddeeff0102030405060708090a0b0c0d0e0ff1e1d1" ,
949+ "0x44556677889900aabbccddeeff0102030405060708090a0b0c0d0e0ff1e1d1c1" ,
950+ "0x556677889900aabbccddeeff0102030405060708090a0b0c0d0e0ff1e1d1c1b1" ,
951+ "0x6677889900aabbccddeeff0102030405060708090a0b0c0d0e0ff1e1d1c1b1a1" ,
952+ "0x77889900aabbccddeeff0102030405060708090a0b0c0d0e0ff1e1d1c1b1a191" ,
953+ "0x889900aabbccddeeff0102030405060708090a0b0c0d0e0ff1e1d1c1b1a19181" ,
954+ "0x9900aabbccddeeff0102030405060708090a0b0c0d0e0ff1e1d1c1b1a1918171" ,
955+ "0xaabbccddeeff0102030405060708090a0b0c0d0e0ff1e1d1c1b1a191817161" ,
956+ "0xaabbccddeeff0102030405060708090a0b0c0d0e0ff1e1d1c1b1a19181716151" ,
957+ "0xbbccddeeff0102030405060708090a0b0c0d0e0ff1e1d1c1b1a1918171615141" ,
958+ "0xccddeeff0102030405060708090a0b0c0d0e0ff1e1d1c1b1a191817161514131" ,
959+ "0xddeeff0102030405060708090a0b0c0d0e0ff1e1d1c1b1a19181716151413121" ,
960+ "0xeeff0102030405060708090a0b0c0d0e0ff1e1d1c1b1a1918171615141312100" ,
961+ "0xff0102030405060708090a0b0c0d0e0ff1e1d1c1b1a191817161514131210000" ,
962+ "0x102030405060708090a0b0c0d0e0ff1e1d1c1b1a19181716151413121000000" ,
963+ "0x2030405060708090a0b0c0d0e0ff1e1d1c1b1a1918171615141312100000000" ,
964+ "0x30405060708090a0b0c0d0e0ff1e1d1c1b1a191817161514131210000000000" ,
965+ "0x405060708090a0b0c0d0e0ff1e1d1c1b1a19181716151413121000000000000" ,
966+ "0x5060708090a0b0c0d0e0ff1e1d1c1b1a1918171615141312100000000000000" ,
967+ "0x60708090a0b0c0d0e0ff1e1d1c1b1a191817161514131210000000000000000" ,
968+ "0x708090a0b0c0d0e0ff1e1d1c1b1a19181716151413121000000000000000000" ,
969+ "0x8090a0b0c0d0e0ff1e1d1c1b1a1918171615141312100000000000000000000" ,
970+ "0x90a0b0c0d0e0ff1e1d1c1b1a191817161514131210000000000000000000000" ,
971+ "0xa0b0c0d0e0ff1e1d1c1b1a19181716151413121000000000000000000000000" ,
972+ "0xb0c0d0e0ff1e1d1c1b1a1918171615141312100000000000000000000000000" ,
973+ "0xc0d0e0ff1e1d1c1b1a191817161514131210000000000000000000000000000" ,
974+ "0xd0e0ff1e1d1c1b1a19181716151413121000000000000000000000000000000" ,
975+ "0xe0ff1e1d1c1b1a1918171615141312100000000000000000000000000000000" ,
976+ "0xff1e1d1c1b1a191817161514131210000000000000000000000000000000000" ,
977+ "0xf1e1d1c1b1a19181716151413121000000000000000000000000000000000000" ,
978+ "0xe1d1c1b1a1918171615141312100000000000000000000000000000000000000" ,
979+ "0xd1c1b1a191817161514131210000000000000000000000000000000000000000" ,
980+ "0xc1b1a19181716151413121000000000000000000000000000000000000000000" ,
981+ "0xb1a1918171615141312100000000000000000000000000000000000000000000" ,
982+ "0xa191817161514131210000000000000000000000000000000000000000000000" ,
983+ "0x9181716151413121000000000000000000000000000000000000000000000000" ,
984+ "0x8171615141312100000000000000000000000000000000000000000000000000" ,
985+ "0x7161514131210000000000000000000000000000000000000000000000000000" ,
986+ "0x6151413121000000000000000000000000000000000000000000000000000000" ,
987+ "0x5141312100000000000000000000000000000000000000000000000000000000" ,
988+ "0x4131210000000000000000000000000000000000000000000000000000000000" ,
989+ "0x3121000000000000000000000000000000000000000000000000000000000000" ,
990+ "0x2100000000000000000000000000000000000000000000000000000000000000" ,
991+ "0x0" ,
992+ } {
993+ pc := new (uint64 )
994+ * pc = uint64 (i )
995+ push32 (pc , nil , scope )
996+ res := scope .Stack .pop ()
997+ if have := res .Hex (); have != want {
998+ t .Fatalf ("case %d, have %v want %v" , i , have , want )
999+ }
1000+ }
1001+ }
0 commit comments