[pypy-commit] pypy continulet-pickle: Implement gr_frame.
arigo
noreply at buildbot.pypy.org
Thu Sep 22 12:04:16 CEST 2011
Author: Armin Rigo <arigo at tunes.org>
Branch: continulet-pickle
Changeset: r47390:41e5b1a4e17c
Date: 2011-09-22 12:03 +0200
http://bitbucket.org/pypy/pypy/changeset/41e5b1a4e17c/
Log: Implement gr_frame.
diff --git a/lib_pypy/greenlet.py b/lib_pypy/greenlet.py
--- a/lib_pypy/greenlet.py
+++ b/lib_pypy/greenlet.py
@@ -96,7 +96,16 @@
@property
def gr_frame(self):
- raise NotImplementedError("attribute 'gr_frame' of greenlet objects")
+ # xxx this doesn't work when called on either the current or
+ # the main greenlet of another thread
+ if self is getcurrent():
+ return None
+ if self.__main:
+ self = getcurrent()
+ f = _continulet.__reduce__(self)[2][0]
+ if not f:
+ return None
+ return f.f_back.f_back.f_back # go past start(), __switch(), switch()
# ____________________________________________________________
# Internal stuff
diff --git a/pypy/module/test_lib_pypy/test_greenlet.py b/pypy/module/test_lib_pypy/test_greenlet.py
--- a/pypy/module/test_lib_pypy/test_greenlet.py
+++ b/pypy/module/test_lib_pypy/test_greenlet.py
@@ -258,3 +258,25 @@
assert sys.exc_info() == (None, None, None)
greenlet(f).switch()
+
+ def test_gr_frame(self):
+ from greenlet import greenlet
+ import sys
+ def f2():
+ assert g.gr_frame is None
+ gmain.switch()
+ assert g.gr_frame is None
+ def f1():
+ assert gmain.gr_frame is gmain_frame
+ assert g.gr_frame is None
+ f2()
+ assert g.gr_frame is None
+ gmain = greenlet.getcurrent()
+ assert gmain.gr_frame is None
+ gmain_frame = sys._getframe()
+ g = greenlet(f1)
+ assert g.gr_frame is None
+ g.switch()
+ assert g.gr_frame.f_code.co_name == 'f2'
+ g.switch()
+ assert g.gr_frame is None
More information about the pypy-commit
mailing list