Merge 3.4 -> default: asyncio: Add __weakref__ slots to Handle and CoroWrapper. Upstream issue #166.

This commit is contained in:
Guido van Rossum 2014-04-27 10:44:46 -07:00
commit 6cd08d6277
4 changed files with 16 additions and 2 deletions

View File

@ -16,7 +16,7 @@ import socket
class Handle:
"""Object returned by callback registration methods."""
__slots__ = ['_callback', '_args', '_cancelled', '_loop']
__slots__ = ['_callback', '_args', '_cancelled', '_loop', '__weakref__']
def __init__(self, callback, args, loop):
assert not isinstance(callback, Handle), 'A Handle is not a callback'

View File

@ -36,7 +36,7 @@ _DEBUG = (not sys.flags.ignore_environment
class CoroWrapper:
# Wrapper for coroutine in _DEBUG mode.
__slots__ = ['gen', 'func', '__name__', '__doc__']
__slots__ = ['gen', 'func', '__name__', '__doc__', '__weakref__']
def __init__(self, gen, func):
assert inspect.isgenerator(gen), gen

View File

@ -21,6 +21,7 @@ import time
import errno
import unittest
from unittest import mock
import weakref
from test import support # find_unused_port, IPV6_ENABLED, TEST_HOME_DIR
@ -1786,6 +1787,11 @@ class HandleTests(unittest.TestCase):
'handle': h
})
def test_handle_weakref(self):
wd = weakref.WeakValueDictionary()
h = asyncio.Handle(lambda: None, (), object())
wd['h'] = h # Would fail without __weakref__ slot.
class TimerTests(unittest.TestCase):

View File

@ -4,6 +4,7 @@ import gc
import os.path
import types
import unittest
import weakref
from test.script_helper import assert_python_ok
import asyncio
@ -1475,6 +1476,13 @@ class TaskTests(unittest.TestCase):
self.assertEqual(call((1, 2)), (1, 2))
self.assertEqual(call('spam'), 'spam')
def test_corowrapper_weakref(self):
wd = weakref.WeakValueDictionary()
def foo(): yield from []
cw = asyncio.tasks.CoroWrapper(foo(), foo)
wd['cw'] = cw # Would fail without __weakref__ slot.
cw.gen = None # Suppress warning from __del__.
class GatherTestsBase: