@@ -483,7 +483,6 @@ def test_constant_folding(self):
483
483
484
484
def test_constant_folding_small_int (self ):
485
485
tests = [
486
- # subscript
487
486
('(0, )[0]' , 0 ),
488
487
('(1 + 2, )[0]' , 3 ),
489
488
('(2 + 2 * 2, )[0]' , 6 ),
@@ -494,7 +493,18 @@ def test_constant_folding_small_int(self):
494
493
('(256
10000
, )[0]' , None ),
495
494
('(1000, )[0]' , None ),
496
495
('(1 - 2, )[0]' , None ),
496
+ ('255 + 0' , 255 ),
497
497
('255 + 1' , None ),
498
+ ('-1' , None ),
499
+ ('--1' , 1 ),
500
+ ('--255' , 255 ),
501
+ ('--256' , None ),
502
+ ('~1' , None ),
503
+ ('~~1' , 1 ),
504
+ ('~~255' , 255 ),
505
+ ('~~256' , None ),
506
+ ('++255' , 255 ),
507
+ ('++256' , None ),
498
508
]
499
509
for expr , oparg in tests :
500
510
with self .subTest (expr = expr , oparg = oparg ):
@@ -505,6 +515,9 @@ def test_constant_folding_small_int(self):
505
515
self .assertNotInBytecode (code , 'LOAD_SMALL_INT' )
506
516
self .check_lnotab (code )
507
517
518
+ def test_folding_unaryop (self ):
519
+ pass
520
+
508
521
def test_folding_binop (self ):
509
522
add = get_binop_argval ('NB_ADD' )
510
523
sub = get_binop_argval ('NB_SUBTRACT' )
@@ -1225,14 +1238,21 @@ def f():
1225
1238
self .assertEqual (f (), frozenset (range (40 )))
1226
1239
1227
1240
def test_multiple_foldings (self ):
1228
- # (1, (2 + 2 * 2 // 2 - 2, )[0], ) ==> (1, 2)
1241
+ # (1, (--2 + ++2 * 2 // 2 - 2, )[0], ~~3, not not True) ==> (1, 2, 3, True)
1242
+ intrinsic_positive = 5
1229
1243
before = [
1230
1244
('LOAD_SMALL_INT' , 1 , 0 ),
1231
1245
('NOP' , None , 0 ),
1232
1246
('LOAD_SMALL_INT' , 2 , 0 ),
1247
+ ('UNARY_NEGATIVE' , None , 0 ),
1248
+ ('NOP' , None , 0 ),
1249
+ ('UNARY_NEGATIVE' , None , 0 ),
1233
1250
('NOP' , None , 0 ),
1234
1251
('NOP' , None , 0 ),
1235
1252
('LOAD_SMALL_INT' , 2 , 0 ),
1253
+ ('CALL_INTRINSIC_1' , intrinsic_positive , 0 ),
1254
+ ('NOP' , None , 0 ),
1255
+ ('CALL_INTRINSIC_1' , intrinsic_positive , 0 ),
1236
1256
('BINARY_OP' , get_binop_argval ('NB_MULTIPLY' )),
1237
1257
('LOAD_SMALL_INT' , 2 , 0 ),
1238
1258
('NOP' , None , 0 ),
@@ -1242,18 +1262,34 @@ def test_multiple_foldings(self):
1242
1262
('BINARY_OP' , get_binop_argval ('NB_ADD' )),
1243
1263
('NOP' , None , 0 ),
1244
1264
('LOAD_SMALL_INT' , 2 , 0 ),
1265
+ ('NOP' , None , 0 ),
1245
1266
('BINARY_OP' , get_binop_argval ('NB_SUBTRACT' )),
1267
+ ('NOP' , None , 0 ),
1246
1268
('BUILD_TUPLE' , 1 , 0 ),
1247
1269
('LOAD_SMALL_INT' , 0 , 0 ),
1248
1270
('BINARY_OP' , get_binop_argval ('NB_SUBSCR' ), 0 ),
1249
- ('BUILD_TUPLE' , 2 , 0 ),
1271
+ ('NOP' , None , 0 ),
1272
+ ('LOAD_SMALL_INT' , 3 , 0 ),
1273
+ ('NOP' , None , 0 ),
1274
+ ('UNARY_INVERT' , None , 0 ),
1275
+ ('NOP' , None , 0 ),
1276
+ ('UNARY_INVERT' , None , 0 ),
1277
+ ('NOP' , None , 0 ),
1278
+ ('LOAD_SMALL_INT' , 3 , 0 ),
1279
+ ('NOP' , None , 0 ),
1280
+ ('UNARY_NOT' , None , 0 ),
1281
+ ('NOP' , None , 0 ),
1282
+ ('UNARY_NOT' , None , 0 ),
1283
+ ('NOP' , None , 0 ),
1284
+ ('BUILD_TUPLE' , 4 , 0 ),
1285
+ ('NOP' , None , 0 ),
1250
1286
('RETURN_VALUE' , None , 0 )
1251
1287
]
1252
1288
after = [
1253
1289
('LOAD_CONST' , 1 , 0 ),
1254
1290
('RETURN_VALUE' , None , 0 )
1255
1291
]
1256
- self .cfg_optimization_test (before , after , consts = [], expected_consts = [( 2 ,), (1 , 2 )])
1292
+ self .cfg_optimization_test (before , after , consts = [], expected_consts = [- 2 , (1 , 2 , 3 , True )])
1257
1293
1258
1294
def test_build_empty_tuple (self ):
1259
1295
before = [
@@ -1601,6 +1637,89 @@ def test_optimize_literal_set_contains(self):
1601
1637
]
1602
1638
self .cfg_optimization_test (same , same , consts = [None ], expected_consts = [None ])
1603
1639
1640
+ def test_optimize_unary_not_to_bool (self ):
1641
+ before = [
1642
+ ('LOAD_NAME' , 0 , 0 ),
1643
+ ('UNARY_NOT' , None , 0 ),
1644
+ ('TO_BOOL' , None , 0 ),
1645
+ ('TO_BOOL' , None , 0 ),
1646
+ ('TO_BOOL' , None , 0 ),
1647
+ ('LOAD_CONST' , 0 , 0 ),
1648
+ ('RETURN_VALUE' , None , 0 ),
1649
+ ]
1650
+ after = [
1651
+ ('LOAD_NAME' , 0 , 0 ),
1652
+ ('UNARY_NOT' , None , 0 ),
1653
+ ('LOAD_CONST' , 0 , 0 ),
1654
+ ('RETURN_VALUE' , None , 0 ),
1655
+ ]
1656
+ self .cfg_optimization_test (before , after , consts = [None ], expected_consts = [None ])
1657
+
1658
+ before = [
1659
+ ('LOAD_SMALL_INT' , 1 , 0 ),
1660
+ ('UNARY_NOT' , None , 0 ),
1661
+ ('TO_BOOL' , None , 0 ),
1662
+ ('TO_BOOL' , None , 0 ),
1663
+ ('TO_BOOL' , None , 0 ),
1664
+ ('TO_BOOL' , None , 0 ),
1665
+ ('RETURN_VALUE' , None , 0 ),
1666
+ ]
1667
+ after = [
1668
+ ('LOAD_CONST' , 0 , 0 ),
1669
+ ('RETURN_VALUE' , None , 0 ),
1670
+ ]
1671
+ self .cfg_optimization_test (before , after , consts = [], expected_consts = [False ])
1672
+
1673
+ is_ = 0
1674
+ isnot = 1
1675
+ before = [
1676
+ ('LOAD_NAME' , 0 , 0 ),
1677
+ ('LOAD_NAME' , 1 , 0 ),
1678
+ ('IS_OP' , is_ , 0 ),
1679
+ ('UNARY_NOT' , None , 0 ),
1680
+ ('TO_BOOL' , None , 0 ),
1681
+ ('TO_BOOL' , None , 0 ),
1682
+ ('TO_BOOL' , None , 0 ),
1683
+ ('LOAD_CONST' , 0 , 0 ),
1684
+ ('RETURN_VALUE' , None , 0 ),
1685
+ ]
1686
+ after = [
1687
+ ('LOAD_NAME' , 0 , 0 ),
1688
+ ('LOAD_NAME' , 1 , 0 ),
1689
+ ('IS_OP' , isnot , 0 ),
1690
+ ('LOAD_CONST' , 0 , 0 ),
1691
+ ('RETURN_VALUE' , None , 0 ),
1692
+ ]
1693
+ self .cfg_optimization_test (before , after , consts = [None ], expected_consts = [None ])
1694
+
1695
+ in_ = 0
1696
+ notin = 1
1697
+ before = [
1698
+ ('LOAD_NAME' , 0 , 0 ),
1699
+ ('LOAD_NAME' , 1 , 0 ),
1700
+ ('CONTAINS_OP' , in_ , 0 ),
1701
+ ('UNARY_NOT' , None , 0 ),
1702
+ ('TO_BOOL' , None , 0 ),
1703
+ ('TO_BOOL' , None , 0 ),
1704
+ ('TO_BOOL' , None , 0 ),
1705
+ ('LOAD_CONST' , 0 , 0 ),
1706
+ ('RETURN_VALUE' , None , 0 ),
1707
+ ]
1708
+ after = [
1709
+ ('LOAD_NAME' , 0 , 0 ),
1710
+ ('LOAD_NAME' , 1 , 0 ),
1711
+ ('CONTAINS_OP' , notin , 0 ),
1712
+ ('LOAD_CONST' , 0 , 0 ),
1713
+ ('RETURN_VALUE' , None , 0 ),
1714
+ ]
1715
+ self .cfg_optimization_test (before , after , consts = [None ], expected_consts = [None ])
1716
+
1717
+ def test_optimize_if_const_unaryop (self ):
1718
+ pass
1719
+
1720
+ def test_optimize_if_const_binop (self ):
1721
+ pass
1722
+
1604
1723
def test_conditional_jump_forward_const_condition (self ):
1605
1724
# The unreachable branch of the jump is removed, the jump
1606
1725
# becomes redundant and is replaced by a NOP (for the lineno)
0 commit comments