mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	
		
			
	
	
		
			57 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			57 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|   | 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() |