Author: Armin Rigo <ar...@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 _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit