Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r47202:4c296bad5568 Date: 2011-09-11 14:48 +0200 http://bitbucket.org/pypy/pypy/changeset/4c296bad5568/
Log: A test for hidden_applevel code objects, and fixing the fact that the 'f_back' attribute of frames might return a hidden frame. diff --git a/pypy/interpreter/pyframe.py b/pypy/interpreter/pyframe.py --- a/pypy/interpreter/pyframe.py +++ b/pypy/interpreter/pyframe.py @@ -614,7 +614,8 @@ return self.get_builtin().getdict(space) def fget_f_back(self, space): - return self.space.wrap(self.f_backref()) + f_backref = ExecutionContext.getnextframe_nohidden(self) + return self.space.wrap(f_backref) def fget_f_lasti(self, space): return self.space.wrap(self.last_instr) diff --git a/pypy/interpreter/test/test_pyframe.py b/pypy/interpreter/test/test_pyframe.py --- a/pypy/interpreter/test/test_pyframe.py +++ b/pypy/interpreter/test/test_pyframe.py @@ -6,6 +6,14 @@ def setup_class(cls): cls.w_udir = cls.space.wrap(str(udir.udir)) cls.w_tempfile1 = cls.space.wrap(str(udir.udir.join('tempfile1'))) + w_call_further = cls.space.appexec([], """(): + def call_further(f): + return f() + return call_further + """) + assert not w_call_further.code.hidden_applevel + w_call_further.code.hidden_applevel = True # hack + cls.w_call_further = w_call_further # test for the presence of the attributes, not functionality @@ -107,6 +115,20 @@ frame = f() assert frame.f_back.f_code.co_name == 'f' + def test_f_back_hidden(self): + import sys + def f(): + return (sys._getframe(0), + sys._getframe(1), + sys._getframe(0).f_back) + def main(): + return self.call_further(f) + f0, f1, f1bis = main() + assert f0.f_code.co_name == 'f' + assert f1.f_code.co_name == 'main' + assert f1bis is f1 + assert f0.f_back is f1 + def test_f_exc_xxx(self): import sys _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit