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