bpo-43693: Un-revert commit f3fa63e. (#26609)

This was reverted in GH-26596 (commit 6d518bb) due to some bad memory accesses.

* Add the MAKE_CELL opcode. (gh-26396)

The memory accesses have been fixed.

https://bugs.python.org/issue43693
This commit is contained in:
Eric Snow 2021-06-08 16:01:34 -06:00 committed by GitHub
parent ab36b9f834
commit 3e1c7167d8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
16 changed files with 4470 additions and 4234 deletions

View file

@ -176,6 +176,57 @@ class ScopeTests(unittest.TestCase):
self.assertEqual(foo(a=42), 50)
self.assertEqual(foo(), 25)
def testCellIsArgAndEscapes(self):
# We need to be sure that a cell passed in as an arg still
# gets wrapped in a new cell if the arg escapes into an
# inner function (closure).
def external():
value = 42
def inner():
return value
cell, = inner.__closure__
return cell
cell_ext = external()
def spam(arg):
def eggs():
return arg
return eggs
eggs = spam(cell_ext)
cell_closure, = eggs.__closure__
cell_eggs = eggs()
self.assertIs(cell_eggs, cell_ext)
self.assertIsNot(cell_eggs, cell_closure)
def testCellIsLocalAndEscapes(self):
# We need to be sure that a cell bound to a local still
# gets wrapped in a new cell if the local escapes into an
# inner function (closure).
def external():
value = 42
def inner():
return value
cell, = inner.__closure__
return cell
cell_ext = external()
def spam(arg):
cell = arg
def eggs():
return cell
return eggs
eggs = spam(cell_ext)
cell_closure, = eggs.__closure__
cell_eggs = eggs()
self.assertIs(cell_eggs, cell_ext)
self.assertIsNot(cell_eggs, cell_closure)
def testRecursion(self):
def f(x):