Skip to content

Commit

Permalink
pythongh-111366: Correctly show custom syntax error messages in the c…
Browse files Browse the repository at this point in the history
…odeop module functions (python#111384)
  • Loading branch information
pablogsal authored and FullteaR committed Nov 3, 2023
1 parent 9ff5c68 commit ed6874e
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 5 deletions.
18 changes: 13 additions & 5 deletions Lib/codeop.py
Expand Up @@ -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.
Expand Down Expand Up @@ -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
Expand Down
14 changes: 14 additions & 0 deletions Lib/test/test_codeop.py
Expand Up @@ -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

Expand Down Expand Up @@ -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

0 comments on commit ed6874e

Please sign in to comment.