Commit 603ae185 authored by Guido van Rossum's avatar Guido van Rossum

asyncio: Add __weakref__ slots to Handle and CoroWrapper. Upstream issue #166.

parent 7ce010cb
......@@ -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'
......
......@@ -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
......
......@@ -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):
......
......@@ -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:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment