Commit 688a11a0 authored by Victor Stinner's avatar Victor Stinner

Issue #23840: tokenize.open() now closes the temporary binary file on error to

fix a resource warning.
parent f986f2b0
...@@ -646,7 +646,7 @@ from tokenize import (tokenize, _tokenize, untokenize, NUMBER, NAME, OP, ...@@ -646,7 +646,7 @@ from tokenize import (tokenize, _tokenize, untokenize, NUMBER, NAME, OP,
STRING, ENDMARKER, ENCODING, tok_name, detect_encoding, STRING, ENDMARKER, ENCODING, tok_name, detect_encoding,
open as tokenize_open, Untokenizer) open as tokenize_open, Untokenizer)
from io import BytesIO from io import BytesIO
from unittest import TestCase from unittest import TestCase, mock
import os, sys, glob import os, sys, glob
import token import token
...@@ -1058,6 +1058,14 @@ class TestDetectEncoding(TestCase): ...@@ -1058,6 +1058,14 @@ class TestDetectEncoding(TestCase):
ins = Bunk(lines, path) ins = Bunk(lines, path)
detect_encoding(ins.readline) detect_encoding(ins.readline)
def test_open_error(self):
# Issue #23840: open() must close the binary file on error
m = BytesIO(b'#coding:xxx')
with mock.patch('tokenize._builtin_open', return_value=m):
self.assertRaises(SyntaxError, tokenize_open, 'foobar')
self.assertTrue(m.closed)
class TestTokenize(TestCase): class TestTokenize(TestCase):
......
...@@ -435,11 +435,15 @@ def open(filename): ...@@ -435,11 +435,15 @@ def open(filename):
detect_encoding(). detect_encoding().
""" """
buffer = _builtin_open(filename, 'rb') buffer = _builtin_open(filename, 'rb')
encoding, lines = detect_encoding(buffer.readline) try:
buffer.seek(0) encoding, lines = detect_encoding(buffer.readline)
text = TextIOWrapper(buffer, encoding, line_buffering=True) buffer.seek(0)
text.mode = 'r' text = TextIOWrapper(buffer, encoding, line_buffering=True)
return text text.mode = 'r'
return text
except:
buffer.close()
raise
def tokenize(readline): def tokenize(readline):
......
...@@ -59,6 +59,9 @@ Core and Builtins ...@@ -59,6 +59,9 @@ Core and Builtins
Library Library
------- -------
- Issue #23840: tokenize.open() now closes the temporary binary file on error
to fix a resource warning.
- Issue #24257: Fixed segmentation fault in sqlite3.Row constructor with faked - Issue #24257: Fixed segmentation fault in sqlite3.Row constructor with faked
cursor type. cursor type.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment