mirror of
https://github.com/python/cpython.git
synced 2025-10-31 21:51:50 +00:00
GH-95150: Use position and exception tables for code hashing and equality (GH-95509)
(cherry picked from commit c7e5bbaee8)
Co-authored-by: Brandt Bucher <brandtbucher@gmail.com>
This commit is contained in:
parent
76d83b1dfe
commit
7baca3c05e
5 changed files with 68 additions and 5 deletions
|
|
@ -613,7 +613,7 @@ def check_same_constant(const):
|
|||
exec(code, ns)
|
||||
f1 = ns['f1']
|
||||
f2 = ns['f2']
|
||||
self.assertIs(f1.__code__, f2.__code__)
|
||||
self.assertIs(f1.__code__.co_consts, f2.__code__.co_consts)
|
||||
self.check_constant(f1, const)
|
||||
self.assertEqual(repr(f1()), repr(const))
|
||||
|
||||
|
|
@ -626,7 +626,7 @@ def check_same_constant(const):
|
|||
# Note: "lambda: ..." emits "LOAD_CONST Ellipsis",
|
||||
# whereas "lambda: Ellipsis" emits "LOAD_GLOBAL Ellipsis"
|
||||
f1, f2 = lambda: ..., lambda: ...
|
||||
self.assertIs(f1.__code__, f2.__code__)
|
||||
self.assertIs(f1.__code__.co_consts, f2.__code__.co_consts)
|
||||
self.check_constant(f1, Ellipsis)
|
||||
self.assertEqual(repr(f1()), repr(Ellipsis))
|
||||
|
||||
|
|
@ -641,7 +641,7 @@ def check_same_constant(const):
|
|||
# {0} is converted to a constant frozenset({0}) by the peephole
|
||||
# optimizer
|
||||
f1, f2 = lambda x: x in {0}, lambda x: x in {0}
|
||||
self.assertIs(f1.__code__, f2.__code__)
|
||||
self.assertIs(f1.__code__.co_consts, f2.__code__.co_consts)
|
||||
self.check_constant(f1, frozenset({0}))
|
||||
self.assertTrue(f1(0))
|
||||
|
||||
|
|
@ -1264,6 +1264,27 @@ def f():
|
|||
self.assertIsNotNone(end_column)
|
||||
self.assertLessEqual((line, column), (end_line, end_column))
|
||||
|
||||
@support.cpython_only
|
||||
def test_column_offset_deduplication(self):
|
||||
# GH-95150: Code with different column offsets shouldn't be merged!
|
||||
for source in [
|
||||
"lambda: a",
|
||||
"(a for b in c)",
|
||||
"[a for b in c]",
|
||||
"{a for b in c}",
|
||||
"{a: b for c in d}",
|
||||
]:
|
||||
with self.subTest(source):
|
||||
code = compile(f"{source}, {source}", "<test>", "eval")
|
||||
self.assertEqual(len(code.co_consts), 2)
|
||||
self.assertIsInstance(code.co_consts[0], types.CodeType)
|
||||
self.assertIsInstance(code.co_consts[1], types.CodeType)
|
||||
self.assertNotEqual(code.co_consts[0], code.co_consts[1])
|
||||
self.assertNotEqual(
|
||||
list(code.co_consts[0].co_positions()),
|
||||
list(code.co_consts[1].co_positions()),
|
||||
)
|
||||
|
||||
|
||||
class TestExpressionStackSize(unittest.TestCase):
|
||||
# These tests check that the computed stack size for a code object
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue