mirror of
https://github.com/python/cpython.git
synced 2025-10-09 08:31:26 +00:00
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:
parent
ab36b9f834
commit
3e1c7167d8
16 changed files with 4470 additions and 4234 deletions
|
@ -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):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue