Author: Manuel Jacob <[email protected]>
Branch: py3.6
Changeset: r94173:aa53932d50e0
Date: 2018-03-22 17:00 +0100
http://bitbucket.org/pypy/pypy/changeset/aa53932d50e0/

Log:    IN-PROGRESS: Implement sys.get_asyncgen_hooks() and
        sys.get_asyncgen_hooks(). This needs to made thread-local
        eventually.

diff --git a/pypy/module/sys/__init__.py b/pypy/module/sys/__init__.py
--- a/pypy/module/sys/__init__.py
+++ b/pypy/module/sys/__init__.py
@@ -116,6 +116,8 @@
         'flags'                 : 'app.null_sysflags',
         '_xoptions'             : 'app.null__xoptions',
         'implementation'        : 'app.implementation',
+        'get_asyncgen_hooks'    : 'app.get_asyncgen_hooks',
+        'set_asyncgen_hooks'    : 'app.set_asyncgen_hooks',
 
         # these six attributes are here only during tests;
         # they are removed before translation
diff --git a/pypy/module/sys/app.py b/pypy/module/sys/app.py
--- a/pypy/module/sys/app.py
+++ b/pypy/module/sys/app.py
@@ -111,6 +111,29 @@
 null__xoptions = {}
 
 
+class asyncgen_hooks(metaclass=structseqtype):
+    name = "asyncgen_hooks"
+
+    firstiter = structseqfield(0)
+    finalizer = structseqfield(1)
+
+# FIXME: make this thread-local
+_current_asyncgen_hooks = asyncgen_hooks((None, None))
+
+def get_asyncgen_hooks():
+    return _current_asyncgen_hooks
+
+_default_arg = object()
+
+def set_asyncgen_hooks(firstiter=_default_arg, finalizer=_default_arg):
+    global _current_asyncgen_hooks
+    if firstiter is _default_arg:
+        firstiter = _current_asyncgen_hooks.firstiter
+    if finalizer is _default_arg:
+        finalizer = _current_asyncgen_hooks.finalizer
+    _current_asyncgen_hooks = asyncgen_hooks((firstiter, finalizer))
+
+
 implementation = SimpleNamespace(
     name='pypy',
     version=sys.version_info,
diff --git a/pypy/module/sys/test/test_sysmodule.py 
b/pypy/module/sys/test/test_sysmodule.py
--- a/pypy/module/sys/test/test_sysmodule.py
+++ b/pypy/module/sys/test/test_sysmodule.py
@@ -713,6 +713,33 @@
         assert not sys.is_finalizing()
         # xxx should also test when it is True, but maybe not worth the effort
 
+    def test_asyncgen_hooks(self):
+        import sys
+        old = sys.get_asyncgen_hooks()
+        assert old.firstiter is None
+        assert old.finalizer is None
+
+        firstiter = lambda *a: None
+        sys.set_asyncgen_hooks(firstiter=firstiter)
+        hooks = sys.get_asyncgen_hooks()
+        assert hooks.firstiter is firstiter
+        assert hooks[0] is firstiter
+        assert hooks.finalizer is None
+        assert hooks[1] is None
+
+        finalizer = lambda *a: None
+        sys.set_asyncgen_hooks(finalizer=finalizer)
+        hooks = sys.get_asyncgen_hooks()
+        assert hooks.firstiter is firstiter
+        assert hooks[0] is firstiter
+        assert hooks.finalizer is finalizer
+        assert hooks[1] is finalizer
+
+        sys.set_asyncgen_hooks(*old)
+        cur = sys.get_asyncgen_hooks()
+        assert cur.firstiter is None
+        assert cur.finalizer is None
+
 
 class AppTestSysSettracePortedFromCpython(object):
     def test_sys_settrace(self):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to