@@ -1261,6 +1261,202 @@ def test_optimize_if_const_set(self):
1261
1261
]
1262
1262
self .cfg_optimization_test (same , same , consts = [])
1263
1263
1264
+ def test_optimize_literal_list_for_iter (self ):
1265
+ # for _ in [1, 2]: pass ==> for _ in (1, 2): pass
1266
+ before = [
1267
+ ('LOAD_SMALL_INT' , 1 , 0 ),
1268
+ ('LOAD_SMALL_INT' , 2 , 0 ),
1269
+ ('BUILD_LIST' , 2 , 0 ),
1270
+ ('GET_ITER' , None , 0 ),
1271
+ start := self .Label (),
1272
+ ('FOR_ITER' , end := self .Label (), 0 ),
1273
+ ('STORE_FAST' , 0 , 0 ),
1274
+ ('JUMP' , start , 0 ),
1275
+ end ,
1276
+ ('END_FOR' , None , 0 ),
1277
+ ('POP_ITER' , None , 0 ),
1278
+ ('LOAD_CONST' , 0 , 0 ),
1279
+ ('RETURN_VALUE' , None , 0 ),
1280
+ ]
1281
+ after = [
1282
+ ('LOAD_CONST' , 1 , 0 ),
1283
+ ('GET_ITER' , None , 0 ),
1284
+ start := self .Label (),
1285
+ ('FOR_ITER' , end := self .Label (), 0 ),
1286
+ ('STORE_FAST' , 0 , 0 ),
1287
+ ('JUMP' , start , 0 ),
1288
+ end ,
1289
+ ('END_FOR' , None , 0 ),
1290
+ ('POP_ITER' , None , 0 ),
1291
+ ('LOAD_CONST' , 0 , 0 ),
1292
+ ('RETURN_VALUE' , None , 0 ),
1293
+ ]
1294
+ self .cfg_optimization_test (before , after , consts = [None ], expected_consts = [None , (1 , 2 )])
1295
+
1296
+ # for _ in [1, x]: pass ==> for _ in (1, x): pass
1297
+ before = [
1298
+ ('LOAD_SMALL_INT' , 1 , 0 ),
1299
+ ('LOAD_NAME' , 0 , 0 ),
1300
+ ('BUILD_LIST' , 2 , 0 ),
1301
+ ('GET_ITER' , None , 0 ),
1302
+ start := self .Label (),
1303
+ ('FOR_ITER' , end := self .Label (), 0 ),
1304
+ ('STORE_FAST' , 0 , 0 ),
1305
+ ('JUMP' , start , 0 ),
1306
+ end ,
1307
+ ('END_FOR' , None , 0 ),
1308
+ ('POP_ITER' , None , 0 ),
1309
+ ('LOAD_CONST' , 0 , 0 ),
1310
+ ('RETURN_VALUE' , None , 0 ),
1311
+ ]
1312
+ after = [
1313
+ ('LOAD_SMALL_INT' , 1 , 0 ),
1314
+ ('LOAD_NAME' , 0 , 0 ),
1315
+ ('BUILD_TUPLE' , 2 , 0 ),
1316
+ ('GET_ITER' , None , 0 ),
1317
+ start := self .Label (),
1318
+ ('FOR_ITER' , end := self .Label (), 0 ),
1319
+ ('STORE_FAST' , 0 , 0 ),
1320
+ ('JUMP' , start , 0 ),
1321
+ end ,
1322
+ ('END_FOR' , None , 0 ),
1323
+ ('POP_ITER' , None , 0 ),
1324
+ ('LOAD_CONST' , 0 , 0 ),
1325
+ ('RETURN_VALUE' , None , 0 ),
1326
+ ]
1327
+ self .cfg_optimization_test (before , after , consts = [None ], expected_consts = [None ])
1328
+
1329
+ def test_optimize_literal_set_for_iter (self ):
1330
+ # for _ in {1, 2}: pass ==> for _ in (1, 2): pass
1331
+ before = [
1332
+ ('LOAD_SMALL_INT' , 1 , 0 ),
1333
+ ('LOAD_SMALL_INT' , 2 , 0 ),
1334
+ ('BUILD_SET' , 2 , 0 ),
1335
+ ('GET_ITER' , None , 0 ),
1336
+ start := self .Label (),
1337
+ ('FOR_ITER' , end := self .Label (), 0 ),
1338
+ ('STORE_FAST' , 0 , 0 ),
1339
+ ('JUMP' , start , 0 ),
1340
+ end ,
1341
+ ('END_FOR' , None , 0 ),
1342
+ ('POP_ITER' , None , 0 ),
1343
+ ('LOAD_CONST' , 0 , 0 ),
1344
+ ('RETURN_VALUE' , None , 0 ),
1345
+ ]
1346
+ after = [
1347
+ ('LOAD_CONST' , 1 , 0 ),
1348
+ ('GET_ITER' , None , 0 ),
1349
+ start := self .Label (),
1350
+ ('FOR_ITER' , end := self .Label (), 0 ),
1351
+ ('STORE_FAST' , 0 , 0 ),
1352
+ ('JUMP' , start , 0 ),
1353
+ end ,
1354
+ ('END_FOR' , None , 0 ),
1355
+ ('POP_ITER' , None , 0 ),
1356
+ ('LOAD_CONST' , 0 , 0 ),
1357
+ ('RETURN_VALUE' , None , 0 ),
1358
+ ]
1359
+ self .cfg_optimization_test (before , after , consts = [None ], expected_consts = [None , frozenset ({1 , 2 })])
1360
+
1361
+ # non constant literal set is not changed
1362
+ # for _ in {1, x}: pass ==> for _ in {1, x}: pass
1363
+ same = [
1364
+ ('LOAD_SMALL_INT' , 1 , 0 ),
1365
+ ('LOAD_NAME' , 0 , 0 ),
1366
+ ('BUILD_SET' , 2 , 0 ),
1367
+ ('GET_ITER' , None , 0 ),
1368
+ start := self .Label (),
1369
+ ('FOR_ITER' , end := self .Label (), 0 ),
1370
+ ('STORE_FAST' , 0 , 0 ),
1371
+ ('JUMP' , start , 0 ),
1372
+ end ,
1373
+ ('END_FOR' , None , 0 ),
1374
+ ('POP_ITER' , None , 0 ),
1375
+ ('LOAD_CONST' , 0 , 0 ),
1376
+ ('RETURN_VALUE' , None , 0 ),
1377
+ ]
1378
+ self .cfg_optimization_test (same , same , consts = [None ], expected_consts = [None ])
1379
+
1380
+ def test_optimize_literal_list_contains (self ):
1381
+ # x in [1, 2] ==> x in (1, 2)
1382
+ before = [
1383
+ ('LOAD_NAME' , 0 , 0 ),
1384
+ ('LOAD_SMALL_INT' , 1 , 0 ),
1385
+ ('LOAD_SMALL_INT' , 2 , 0 ),
1386
+ ('BUILD_LIST' , 2 , 0 ),
1387
+ ('CONTAINS_OP' , 0 , 0 ),
1388
+ ('POP_TOP' , None , 0 ),
1389
+ ('LOAD_CONST' , 0 , 0 ),
1390
+ ('RETURN_VALUE' , None , 0 ),
1391
+ ]
1392
+ after = [
1393
+ ('LOAD_NAME' , 0 , 0 ),
1394
+ ('LOAD_CONST' , 1 , 0 ),
1395
+ ('CONTAINS_OP' , 0 , 0 ),
1396
+ ('POP_TOP' , None , 0 ),
1397
+ ('LOAD_CONST' , 0 , 0 ),
1398
+ ('RETURN_VALUE' , None , 0 ),
1399
+ ]
1400
+ self .cfg_optimization_test (before , after , consts = [None ], expected_consts = [None , (1 , 2 )])
1401
+
1402
+ # x in [1, y] ==> x in (1, y)
1403
+ before = [
1404
+ ('LOAD_NAME' , 0 , 0 ),
1405
+ ('LOAD_SMALL_INT' , 1 , 0 ),
1406
+ ('LOAD_NAME' , 1 , 0 ),
1407
+ ('BUILD_LIST' , 2 , 0 ),
1408
+ ('CONTAINS_OP' , 0 , 0 ),
1409
+ ('POP_TOP' , None , 0 ),
1410
+ ('LOAD_CONST' , 0 , 0 ),
1411
+ ('RETURN_VALUE' , None , 0 ),
1412
+ ]
1413
+ after = [
1414
+ ('LOAD_NAME' , 0 , 0 ),
1415
+ ('LOAD_SMALL_INT' , 1 , 0 ),
1416
+ ('LOAD_NAME' , 1 , 0 ),
1417
+ ('BUILD_TUPLE' , 2 , 0 ),
1418
+ ('CONTAINS_OP' , 0 , 0 ),
1419
+ ('POP_TOP' , None , 0 ),
1420
+ ('LOAD_CONST' , 0 , 0 ),
1421
+ ('RETURN_VALUE' , None , 0 ),
1422
+ ]
1423
+ self .cfg_optimization_test (before , after , consts = [None ], expected_consts = [None ])
1424
+
1425
+ def test_optimize_literal_set_contains (self ):
1426
+ # x in {1, 2} ==> x in (1, 2)
1427
+ before = [
1428
+ ('LOAD_NAME' , 0 , 0 ),
1429
+ ('LOAD_SMALL_INT' , 1 , 0 ),
1430
+ ('LOAD_SMALL_INT' , 2 , 0 ),
1431
+ ('BUILD_SET' , 2 , 0 ),
1432
+ ('CONTAINS_OP' , 0 , 0 ),
1433
+ ('POP_TOP' , None , 0 ),
1434
+ ('LOAD_CONST' , 0 , 0 ),
1435
+ ('RETURN_VALUE' , None , 0 ),
1436
+ ]
1437
+ after = [
1438
+ ('LOAD_NAME' , 0 , 0 ),
1439
+ ('LOAD_CONST' , 1 , 0 ),
1440
+ ('CONTAINS_OP' , 0 , 0 ),
1441
+ ('POP_TOP' , None , 0 ),
1442
+ ('LOAD_CONST' , 0 , 0 ),
1443
+ ('RETURN_VALUE' , None , 0 ),
1444
+ ]
1445
+ self .cfg_optimization_test (before , after , consts = [None ], expected_consts = [None , frozenset ({1 , 2 })])
1446
+
1447
+ # non constant literal set is not changed
1448
+ # x in {1, y} ==> x in {1, y}
1449
+ same = [
1450
+ ('LOAD_NAME' , 0 , 0 ),
1451
+ ('LOAD_SMALL_INT' , 1 , 0 ),
1452
+ ('LOAD_NAME' , 1 , 0 ),
1453
+ ('BUILD_SET' , 2 , 0 ),
1454
+ ('CONTAINS_OP' , 0 , 0 ),
1455
+ ('POP_TOP' , None , 0 ),
1456
+ ('LOAD_CONST' , 0 , 0 ),
1457
+ ('RETURN_VALUE' , None , 0 ),
1458
+ ]
1459
+ self .cfg_optimization_test (same , same , consts = [None ], expected_consts = [None ])
1264
1460
1265
1461
def test_conditional_jump_forward_const_condition (self ):
1266
1462
# The unreachable branch of the jump is removed, the jump
0 commit comments