diff options
-rw-r--r-- | Lib/test/test_print.py | 9 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Core and Builtins/2017-12-03-22-29-13.bpo-32028.KC2w4Q.rst | 3 | ||||
-rw-r--r-- | Objects/exceptions.c | 16 |
3 files changed, 23 insertions, 5 deletions
diff --git a/Lib/test/test_print.py b/Lib/test/test_print.py index e6434fe..7bc23cf 100644 --- a/Lib/test/test_print.py +++ b/Lib/test/test_print.py @@ -156,6 +156,15 @@ class TestPy2MigrationHint(unittest.TestCase): self.assertIn('print("Hello World", end=" ")', str(context.exception)) + def test_string_with_leading_whitespace(self): + python2_print_str = '''if 1: + print "Hello World" + ''' + with self.assertRaises(SyntaxError) as context: + exec(python2_print_str) + + self.assertIn('print("Hello World")', str(context.exception)) + def test_stream_redirection_hint_for_py2_migration(self): # Test correct hint produced for Py2 redirection syntax with self.assertRaises(TypeError) as context: diff --git a/Misc/NEWS.d/next/Core and Builtins/2017-12-03-22-29-13.bpo-32028.KC2w4Q.rst b/Misc/NEWS.d/next/Core and Builtins/2017-12-03-22-29-13.bpo-32028.KC2w4Q.rst new file mode 100644 index 0000000..8e2b2e1 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2017-12-03-22-29-13.bpo-32028.KC2w4Q.rst @@ -0,0 +1,3 @@ +Leading whitespace is now correctly ignored when generating suggestions +for converting Py2 print statements to Py3 builtin print function calls. +Patch by Sanyam Khurana. diff --git a/Objects/exceptions.c b/Objects/exceptions.c index 4901eb1..d59abd1 100644 --- a/Objects/exceptions.c +++ b/Objects/exceptions.c @@ -2846,17 +2846,23 @@ _set_legacy_print_statement_msg(PySyntaxErrorObject *self, Py_ssize_t start) // PRINT_OFFSET is to remove `print ` word from the data. const int PRINT_OFFSET = 6; - Py_ssize_t text_len = PyUnicode_GET_LENGTH(self->text); - PyObject *data = PyUnicode_Substring(self->text, PRINT_OFFSET, text_len); - + const int STRIP_BOTH = 2; + // Issue 32028: Handle case when whitespace is used with print call + PyObject *initial_data = _PyUnicode_XStrip(self->text, STRIP_BOTH, strip_sep_obj); + if (initial_data == NULL) { + Py_DECREF(strip_sep_obj); + return -1; + } + Py_ssize_t text_len = PyUnicode_GET_LENGTH(initial_data); + PyObject *data = PyUnicode_Substring(initial_data, PRINT_OFFSET, text_len); + Py_DECREF(initial_data); if (data == NULL) { Py_DECREF(strip_sep_obj); return -1; } - PyObject *new_data = _PyUnicode_XStrip(data, 2, strip_sep_obj); + PyObject *new_data = _PyUnicode_XStrip(data, STRIP_BOTH, strip_sep_obj); Py_DECREF(data); Py_DECREF(strip_sep_obj); - if (new_data == NULL) { return -1; } |