]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
GH-90344: replace single-call `io.IncrementalNewlineDecoder` usage with non-increment...
authorGuo Ci <zguoci@gmail.com>
Sat, 15 Nov 2025 00:13:37 +0000 (19:13 -0500)
committerGitHub <noreply@github.com>
Sat, 15 Nov 2025 00:13:37 +0000 (00:13 +0000)
Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com>
Co-authored-by: Brett Cannon <brett@python.org>
Lib/doctest.py
Lib/importlib/_bootstrap_external.py
Lib/test/test_importlib/test_abc.py
Misc/NEWS.d/next/Core_and_Builtins/2025-10-31-14-03-42.gh-issue-90344.gvZigO.rst [new file with mode: 0644]

index 92a2ab4f7e66f8b959bd137b75a988cd55465687..ad8fb900f692c7361ac139f996b4d41ac40051ae 100644 (file)
@@ -104,7 +104,7 @@ import sys
 import traceback
 import types
 import unittest
-from io import StringIO, IncrementalNewlineDecoder
+from io import StringIO, TextIOWrapper, BytesIO
 from collections import namedtuple
 import _colorize  # Used in doctests
 from _colorize import ANSIColors, can_colorize
@@ -237,10 +237,6 @@ def _normalize_module(module, depth=2):
     else:
         raise TypeError("Expected a module, string, or None")
 
-def _newline_convert(data):
-    # The IO module provides a handy decoder for universal newline conversion
-    return IncrementalNewlineDecoder(None, True).decode(data, True)
-
 def _load_testfile(filename, package, module_relative, encoding):
     if module_relative:
         package = _normalize_module(package, 3)
@@ -252,10 +248,9 @@ def _load_testfile(filename, package, module_relative, encoding):
                 pass
         if hasattr(loader, 'get_data'):
             file_contents = loader.get_data(filename)
-            file_contents = file_contents.decode(encoding)
             # get_data() opens files as 'rb', so one must do the equivalent
             # conversion as universal newlines would do.
-            return _newline_convert(file_contents), filename
+            return TextIOWrapper(BytesIO(file_contents), encoding=encoding, newline=None).read(), filename
     with open(filename, encoding=encoding) as f:
         return f.read(), filename
 
index 4ab0e79ea6efebba68783fe820aafe85312a5537..192c0261408ead9df27c98b3035e1ddc442033a2 100644 (file)
@@ -552,8 +552,7 @@ def decode_source(source_bytes):
     import tokenize  # To avoid bootstrap issues.
     source_bytes_readline = _io.BytesIO(source_bytes).readline
     encoding = tokenize.detect_encoding(source_bytes_readline)
-    newline_decoder = _io.IncrementalNewlineDecoder(None, True)
-    return newline_decoder.decode(source_bytes.decode(encoding[0]))
+    return _io.TextIOWrapper(_io.BytesIO(source_bytes), encoding=encoding[0], newline=None).read()
 
 
 # Module specifications #######################################################
index dd943210ffca3cf24d9a47673b8a330a6ce1bce7..bd1540ce403ce29eb7fa7a1b91f9c5e5df4ef9ac 100644 (file)
@@ -904,7 +904,7 @@ class SourceLoaderGetSourceTests:
         mock = self.SourceOnlyLoaderMock('mod.file')
         source = "x = 42\r\ny = -13\r\n"
         mock.source = source.encode('utf-8')
-        expect = io.IncrementalNewlineDecoder(None, True).decode(source)
+        expect = io.StringIO(source, newline=None).getvalue()
         self.assertEqual(mock.get_source(name), expect)
 
 
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-31-14-03-42.gh-issue-90344.gvZigO.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-31-14-03-42.gh-issue-90344.gvZigO.rst
new file mode 100644 (file)
index 0000000..b1d0535
--- /dev/null
@@ -0,0 +1 @@
+Replace :class:`io.IncrementalNewlineDecoder` with non incremental newline decoders in codebase where :meth:`!io.IncrementalNewlineDecoder.decode` was being called once.