| import sys | |
| import unittest | |
| from test.support import import_helper | |
| _testcapi = import_helper.import_module('_testcapi') | |
| class FrameTest(unittest.TestCase): | |
| def getframe(self): | |
| return sys._getframe() | |
| def test_frame_getters(self): | |
| frame = self.getframe() | |
| self.assertEqual(frame.f_locals, _testcapi.frame_getlocals(frame)) | |
| self.assertIs(frame.f_globals, _testcapi.frame_getglobals(frame)) | |
| self.assertIs(frame.f_builtins, _testcapi.frame_getbuiltins(frame)) | |
| self.assertEqual(frame.f_lasti, _testcapi.frame_getlasti(frame)) | |
| def test_getvar(self): | |
| current_frame = sys._getframe() | |
| x = 1 | |
| self.assertEqual(_testcapi.frame_getvar(current_frame, "x"), 1) | |
| self.assertEqual(_testcapi.frame_getvarstring(current_frame, b"x"), 1) | |
| with self.assertRaises(NameError): | |
| _testcapi.frame_getvar(current_frame, "y") | |
| with self.assertRaises(NameError): | |
| _testcapi.frame_getvarstring(current_frame, b"y") | |
| # wrong name type | |
| with self.assertRaises(TypeError): | |
| _testcapi.frame_getvar(current_frame, b'x') | |
| with self.assertRaises(TypeError): | |
| _testcapi.frame_getvar(current_frame, 123) | |
| def getgenframe(self): | |
| yield sys._getframe() | |
| def test_frame_get_generator(self): | |
| gen = self.getgenframe() | |
| frame = next(gen) | |
| self.assertIs(gen, _testcapi.frame_getgenerator(frame)) | |
| def test_frame_fback_api(self): | |
| """Test that accessing `f_back` does not cause a segmentation fault on | |
| a frame created with `PyFrame_New` (GH-99110).""" | |
| def dummy(): | |
| pass | |
| frame = _testcapi.frame_new(dummy.__code__, globals(), locals()) | |
| # The following line should not cause a segmentation fault. | |
| self.assertIsNone(frame.f_back) | |
| if __name__ == "__main__": | |
| unittest.main() |