mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	gh-111366: Correctly show custom syntax error messages in the codeop module functions (#111384)
This commit is contained in:
		
							parent
							
								
									624ace5a2f
								
							
						
					
					
						commit
						cd6e0a04a1
					
				
					 3 changed files with 30 additions and 5 deletions
				
			
		|  | @ -70,10 +70,14 @@ def _maybe_compile(compiler, source, filename, symbol): | |||
|                     return None | ||||
|                 # fallthrough | ||||
| 
 | ||||
|     return compiler(source, filename, symbol) | ||||
|     return compiler(source, filename, symbol, incomplete_input=False) | ||||
| 
 | ||||
| def _compile(source, filename, symbol): | ||||
|     return compile(source, filename, symbol, PyCF_DONT_IMPLY_DEDENT | PyCF_ALLOW_INCOMPLETE_INPUT) | ||||
| def _compile(source, filename, symbol, incomplete_input=True): | ||||
|     flags = 0 | ||||
|     if incomplete_input: | ||||
|         flags |= PyCF_ALLOW_INCOMPLETE_INPUT | ||||
|         flags |= PyCF_DONT_IMPLY_DEDENT | ||||
|     return compile(source, filename, symbol, flags) | ||||
| 
 | ||||
| def compile_command(source, filename="<input>", symbol="single"): | ||||
|     r"""Compile a command and determine whether it is incomplete. | ||||
|  | @ -104,8 +108,12 @@ class Compile: | |||
|     def __init__(self): | ||||
|         self.flags = PyCF_DONT_IMPLY_DEDENT | PyCF_ALLOW_INCOMPLETE_INPUT | ||||
| 
 | ||||
|     def __call__(self, source, filename, symbol): | ||||
|         codeob = compile(source, filename, symbol, self.flags, True) | ||||
|     def __call__(self, source, filename, symbol, **kwargs): | ||||
|         flags = self.flags | ||||
|         if kwargs.get('incomplete_input', True) is False: | ||||
|             flags &= ~PyCF_DONT_IMPLY_DEDENT | ||||
|             flags &= ~PyCF_ALLOW_INCOMPLETE_INPUT | ||||
|         codeob = compile(source, filename, symbol, flags, True) | ||||
|         for feature in _features: | ||||
|             if codeob.co_flags & feature.compiler_flag: | ||||
|                 self.flags |= feature.compiler_flag | ||||
|  |  | |||
|  | @ -5,6 +5,7 @@ | |||
| import unittest | ||||
| import warnings | ||||
| from test.support import warnings_helper | ||||
| from textwrap import dedent | ||||
| 
 | ||||
| from codeop import compile_command, PyCF_DONT_IMPLY_DEDENT | ||||
| 
 | ||||
|  | @ -308,6 +309,19 @@ def test_invalid_warning(self): | |||
|         self.assertRegex(str(w[0].message), 'invalid escape sequence') | ||||
|         self.assertEqual(w[0].filename, '<input>') | ||||
| 
 | ||||
|     def assertSyntaxErrorMatches(self, code, message): | ||||
|         with self.subTest(code): | ||||
|             with self.assertRaisesRegex(SyntaxError, message): | ||||
|                 compile_command(code, symbol='exec') | ||||
| 
 | ||||
|     def test_syntax_errors(self): | ||||
|         self.assertSyntaxErrorMatches( | ||||
|             dedent("""\ | ||||
|                 def foo(x,x): | ||||
|                    pass | ||||
|             """), "duplicate argument 'x' in function definition") | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| if __name__ == "__main__": | ||||
|     unittest.main() | ||||
|  |  | |||
|  | @ -0,0 +1,3 @@ | |||
| Fix an issue in the :mod:`codeop` that was causing :exc:`SyntaxError` | ||||
| exceptions raised in the presence of invalid syntax to not contain precise | ||||
| error messages. Patch by Pablo Galindo | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Pablo Galindo Salgado
						Pablo Galindo Salgado