mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	[3.13] gh-120221: Support KeyboardInterrupt in asyncio REPL (GH-123795) (#123799)
This switches the main pyrepl event loop to always be non-blocking so that it
can listen to incoming interruptions from other threads.
This also resolves invalid display of exceptions from other threads
(gh-123178).
This also fixes freezes with pasting and an active input hook.
(cherry picked from commit 033510e11d)
Co-authored-by: Łukasz Langa <lukasz@langa.pl>
			
			
This commit is contained in:
		
							parent
							
								
									66b15381f1
								
							
						
					
					
						commit
						5c3078d6e5
					
				
					 8 changed files with 133 additions and 21 deletions
				
			
		|  | @ -199,8 +199,14 @@ def _my_getstr(cap: str, optional: bool = False) -> bytes | None: | |||
|         self.event_queue = EventQueue(self.input_fd, self.encoding) | ||||
|         self.cursor_visible = 1 | ||||
| 
 | ||||
|     def more_in_buffer(self) -> bool: | ||||
|         return bool( | ||||
|             self.input_buffer | ||||
|             and self.input_buffer_pos < len(self.input_buffer) | ||||
|         ) | ||||
| 
 | ||||
|     def __read(self, n: int) -> bytes: | ||||
|         if not self.input_buffer or self.input_buffer_pos >= len(self.input_buffer): | ||||
|         if not self.more_in_buffer(): | ||||
|             self.input_buffer = os.read(self.input_fd, 10000) | ||||
| 
 | ||||
|         ret = self.input_buffer[self.input_buffer_pos : self.input_buffer_pos + n] | ||||
|  | @ -393,6 +399,7 @@ def get_event(self, block: bool = True) -> Event | None: | |||
|         """ | ||||
|         if not block and not self.wait(timeout=0): | ||||
|             return None | ||||
| 
 | ||||
|         while self.event_queue.empty(): | ||||
|             while True: | ||||
|                 try: | ||||
|  | @ -413,7 +420,11 @@ def wait(self, timeout: float | None = None) -> bool: | |||
|         """ | ||||
|         Wait for events on the console. | ||||
|         """ | ||||
|         return bool(self.pollob.poll(timeout)) | ||||
|         return ( | ||||
|             not self.event_queue.empty() | ||||
|             or self.more_in_buffer() | ||||
|             or bool(self.pollob.poll(timeout)) | ||||
|         ) | ||||
| 
 | ||||
|     def set_cursor_vis(self, visible): | ||||
|         """ | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Miss Islington (bot)
						Miss Islington (bot)