|
2 | 2 | import dis
|
3 | 3 | import io
|
4 | 4 | import itertools
|
| 5 | +import marshal |
5 | 6 | import math
|
6 | 7 | import opcode
|
7 | 8 | import os
|
@@ -1385,52 +1386,91 @@ def check_op_count(func, op, expected):
|
1385 | 1386 | self.assertEqual(actual, expected)
|
1386 | 1387 |
|
1387 | 1388 | def check_consts(func, typ, expected):
|
1388 |
| - slice_consts = 0 |
| 1389 | + expected = set([repr(x) for x in expected]) |
| 1390 | + all_consts = set() |
1389 | 1391 | consts = func.__code__.co_consts
|
1390 | 1392 | for instr in dis.Bytecode(func):
|
1391 | 1393 | if instr.opname == "LOAD_CONST" and isinstance(consts[instr.oparg], typ):
|
1392 |
| - slice_consts += 1 |
1393 |
| - self.assertEqual(slice_consts, expected) |
| 1394 | + all_consts.add(repr(consts[instr.oparg])) |
| 1395 | + self.assertEqual(all_consts, expected) |
1394 | 1396 |
|
1395 | 1397 | def load():
|
1396 | 1398 | return x[a:b] + x [a:] + x[:b] + x[:]
|
1397 | 1399 |
|
| 1400 | + check_op_count(load, "BINARY_SLICE", 3) |
| 1401 | + check_op_count(load, "BUILD_SLICE", 0) |
| 1402 | + check_consts(load, slice, [slice(None, None, None)]) |
| 1403 | + check_op_count(load, "BINARY_SUBSCR", 1) |
| 1404 | + |
1398 | 1405 | def store():
|
1399 | 1406 | x[a:b] = y
|
1400 | 1407 | x [a:] = y
|
1401 | 1408 | x[:b] = y
|
1402 | 1409 | x[:] = y
|
1403 | 1410 |
|
| 1411 | + check_op_count(store, "STORE_SLICE", 3) |
| 1412 | + check_op_count(store, "BUILD_SLICE", 0) |
| 1413 | + check_op_count(store, "STORE_SUBSCR", 1) |
| 1414 | + check_consts(store, slice, [slice(None, None, None)]) |
| 1415 | + |
1404 | 1416 | def long_slice():
|
1405 | 1417 | return x[a:b:c]
|
1406 | 1418 |
|
| 1419 | + check_op_count(long_slice, "BUILD_SLICE", 1) |
| 1420 | + check_op_count(long_slice, "BINARY_SLICE", 0) |
| 1421 | + check_consts(long_slice, slice, []) |
| 1422 | + check_op_count(long_slice, "BINARY_SUBSCR", 1) |
| 1423 | + |
1407 | 1424 | def aug():
|
1408 | 1425 | x[a:b] += y
|
1409 | 1426 |
|
| 1427 | + check_op_count(aug, "BINARY_SLICE", 1) |
| 1428 | + check_op_count(aug, "STORE_SLICE", 1) |
| 1429 | + check_op_count(aug, "BUILD_SLICE", 0) |
| 1430 | + check_op_count(aug, "BINARY_SUBSCR", 0) |
| 1431 | + check_op_count(aug, "STORE_SUBSCR", 0) |
| 1432 | + check_consts(aug, slice, []) |
| 1433 | + |
1410 | 1434 | def aug_const():
|
1411 | 1435 | x[1:2] += y
|
1412 | 1436 |
|
| 1437 | + check_op_count(aug_const, "BINARY_SLICE", 0) |
| 1438 | + check_op_count(aug_const, "STORE_SLICE", 0) |
| 1439 | + check_op_count(aug_const, "BINARY_SUBSCR", 1) |
| 1440 | + check_op_count(aug_const, "STORE_SUBSCR", 1) |
| 1441 | + check_consts(aug_const, slice, [slice(1, 2)]) |
| 1442 | + |
1413 | 1443 | def compound_const_slice():
|
1414 | 1444 | x[1:2:3, 4:5:6] = y
|
1415 | 1445 |
|
1416 |
| - check_op_count(load, "BINARY_SLICE", 3) |
1417 |
| - check_op_count(load, "BUILD_SLICE", 0) |
1418 |
| - check_consts(load, slice, 1) |
1419 |
| - check_op_count(store, "STORE_SLICE", 3) |
1420 |
| - check_op_count(store, "BUILD_SLICE", 0) |
1421 |
| - check_consts(store, slice, 1) |
1422 |
| - check_op_count(long_slice, "BUILD_SLICE", 1) |
1423 |
| - check_op_count(long_slice, "BINARY_SLICE", 0) |
1424 |
| - check_op_count(aug, "BINARY_SLICE", 1) |
1425 |
| - check_op_count(aug, "STORE_SLICE", 1) |
1426 |
| - check_op_count(aug, "BUILD_SLICE", 0) |
1427 |
| - check_op_count(aug_const, "BINARY_SLICE", 0) |
1428 |
| - check_op_count(aug_const, "STORE_SLICE", 0) |
1429 |
| - check_consts(aug_const, slice, 1) |
1430 | 1446 | check_op_count(compound_const_slice, "BINARY_SLICE", 0)
|
1431 | 1447 | check_op_count(compound_const_slice, "BUILD_SLICE", 0)
|
1432 |
| - check_consts(compound_const_slice, slice, 0) |
1433 |
| - check_consts(compound_const_slice, tuple, 1) |
| 1448 | + check_op_count(compound_const_slice, "STORE_SLICE", 0) |
| 1449 | + check_op_count(compound_const_slice, "STORE_SUBSCR", 1) |
| 1450 | + check_consts(compound_const_slice, slice, []) |
| 1451 | + check_consts(compound_const_slice, tuple, [(slice(1, 2, 3), slice(4, 5, 6))]) |
| 1452 | + |
| 1453 | + def mutable_slice(): |
| 1454 | + x[[]:] = y |
| 1455 | + |
| 1456 | + check_consts(mutable_slice, slice, {}) |
| 1457 | + |
| 1458 | + def different_but_equal(): |
| 1459 | + x[:0] = y |
| 1460 | + x[:0.0] = y |
| 1461 | + x[:False] = y |
| 1462 | + x[:None] = y |
| 1463 | + |
| 1464 | + check_consts( |
| 1465 | + different_but_equal, |
| 1466 | + slice, |
| 1467 | + [ |
| 1468 | + slice(None, 0, None), |
| 1469 | + slice(None, 0.0, None), |
| 1470 | + slice(None, False, None), |
| 1471 | + slice(None, None, None) |
| 1472 | + ] |
| 1473 | + ) |
1434 | 1474 |
|
1435 | 1475 | def test_compare_positions(self):
|
1436 | 1476 | for opname_prefix, op in [
|
|
0 commit comments