| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -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() | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -4,6 +4,7 @@ | |||
| 4 | 4 | #include "Python.h" | |
| 5 | 5 | #include "pycore_flowgraph.h" | |
| 6 | 6 | #include "pycore_compile.h" | |
| 7 | + #include "pycore_intrinsics.h" | ||
| 7 | 8 | #include "pycore_pymem.h" // _PyMem_IsPtrFreed() | |
| 8 | 9 | ||
| 9 | 10 | #include "pycore_opcode_utils.h" | |
@@ -1874,6 +1875,12 @@ optimize_basic_block(PyObject *const_cache, basicblock *bb, PyObject *consts) | |||
| 1874 | 1875 | continue; | |
| 1875 | 1876 | } | |
| 1876 | 1877 | break; | |
| 1878 | + case CALL_INTRINSIC_1: | ||
| 1879 | + // for _ in (*foo, *bar) -> for _ in [*foo, *bar] | ||
| 1880 | + if (oparg == INTRINSIC_LIST_TO_TUPLE && nextop == GET_ITER) { | ||
| 1881 | + INSTR_SET_OP0(inst, NOP); | ||
| 1882 | + } | ||
| 1883 | + break; | ||
| 1877 | 1884 | } | |
| 1878 | 1885 | } | |
| 1879 | 1886 | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments