@@ -1193,5 +1193,56 @@ def get_insts(lno1, lno2, op1, op2):
1193
1193
]
1194
1194
self .cfg_optimization_test (insts , expected_insts , consts = list (range (5 )))
1195
1195
1196
+ def test_list_to_tuple_get_iter (self ):
1197
+ # for _ in (*foo, *bar) -> for _ in [*foo, *bar]
1198
+ INTRINSIC_LIST_TO_TUPLE = 6
1199
+ insts = [
1200
+ ("BUILD_LIST" , 0 , 1 ),
1201
+ ("LOAD_FAST" , 0 , 2 ),
1202
+ ("LIST_EXTEND" , 1 , 3 ),
1203
+ ("LOAD_FAST" , 1 , 4 ),
1204
+ ("LIST_EXTEND" , 1 , 5 ),
1205
+ ("CALL_INTRINSIC_1" , INTRINSIC_LIST_TO_TUPLE , 6 ),
1206
+ ("GET_ITER" , None , 7 ),
1207
+ top := self .Label (),
1208
+ ("FOR_ITER" , end := self .Label (), 8 ),
1209
+ ("STORE_FAST" , 2 , 9 ),
1210
+ ("JUMP" , top , 10 ),
1211
+ end ,
1212
+ ("END_FOR" , None , 11 ),
1213
+ ("POP_TOP" , None , 12 ),
1214
+ ("LOAD_CONST" , 0 , 13 ),
1215
+ ("RETURN_VALUE" , None , 14 ),
1216
+ ]
1217
+ expected_insts = [
1218
+ ("BUILD_LIST" , 0 , 1 ),
1219
+ ("LOAD_FAST" , 0 , 2 ),
1220
+ ("LIST_EXTEND" , 1 , 3 ),
1221
+ ("LOAD_FAST" , 1 , 4 ),
1222
+ ("LIST_EXTEND" , 1 , 5 ),
1223
+ ("NOP" , None , 6 ), # ("CALL_INTRINSIC_1", INTRINSIC_LIST_TO_TUPLE, 6),
1224
+ ("GET_ITER" , None , 7 ),
1225
+ top := self .Label (),
1226
+ ("FOR_ITER" , end := self .Label (), 8 ),
1227
+ ("STORE_FAST" , 2 , 9 ),
1228
+ ("JUMP" , top , 10 ),
1229
+ end ,
1230
+ ("END_FOR" , None , 11 ),
1231
+ ("POP_TOP" , None , 12 ),
1232
+ ("LOAD_CONST" , 0 , 13 ),
1233
+ ("RETURN_VALUE" , None , 14 ),
1234
+ ]
1235
+ self .cfg_optimization_test (insts , expected_insts , consts = [None ])
1236
+
1237
+ def test_list_to_tuple_get_iter_is_safe (self ):
1238
+ a , b = [], []
1239
+ for item in (* (items := [0 , 1 , 2 , 3 ]),):
1240
+ a .append (item )
1241
+ b .append (items .pop ())
1242
+ self .assertEqual (a , [0 , 1 , 2 , 3 ])
1243
+ self .assertEqual (b , [3 , 2 , 1 , 0 ])
1244
+ self .assertEqual (items , [])
1245
+
1246
+
1196
1247
if __name__ == "__main__" :
1197
1248
unittest .main ()
0 commit comments