Commit 99cf7091 authored by Brett Cannon's avatar Brett Cannon

PyTokenizer_FindEncoding() always failed because it set the tokenizer state

with only a file pointer when it called fp_setreadl() which expected a file
path. Changed fp_setreadl() to use either a file path or file descriptor
(derived from the file pointer) to fix the issue.

Closes issue 3594.
Reviewed by Antoine Pitrou and Benjamin Peterson.
parent 6def8f40
import imp import imp
import sys
import unittest import unittest
from test import support from test import support
...@@ -59,6 +60,21 @@ class ImportTests(unittest.TestCase): ...@@ -59,6 +60,21 @@ class ImportTests(unittest.TestCase):
'"""Tokenization help for Python programs.\n') '"""Tokenization help for Python programs.\n')
fp.close() fp.close()
def test_issue3594(self):
temp_mod_name = 'test_imp_helper'
sys.path.insert(0, '.')
try:
with open(temp_mod_name + '.py', 'w') as file:
file.write("# coding: cp1252\nu = 'test.test_imp'\n")
file, filename, info = imp.find_module(temp_mod_name)
file.close()
self.assertEquals(file.encoding, 'cp1252')
finally:
del sys.path[0]
support.unlink(temp_mod_name + '.py')
support.unlink(temp_mod_name + '.pyc')
support.unlink(temp_mod_name + '.pyo')
def test_reload(self): def test_reload(self):
import marshal import marshal
imp.reload(marshal) imp.reload(marshal)
......
...@@ -12,6 +12,10 @@ What's New in Python 3.0 release candidate 1 ...@@ -12,6 +12,10 @@ What's New in Python 3.0 release candidate 1
Core and Builtins Core and Builtins
----------------- -----------------
- Issue 3594: Fix Parser/tokenizer.c:fp_setreadl() to open the file being
tokenized by either a file path or file pointer for the benefit of
PyTokenizer_FindEncoding().
- Issue #3696: Error parsing arguments on OpenBSD <= 4.4 and Cygwin. On - Issue #3696: Error parsing arguments on OpenBSD <= 4.4 and Cygwin. On
these systems, the mbstowcs() function is slightly buggy and must be these systems, the mbstowcs() function is slightly buggy and must be
replaced with strlen() for the purpose of counting of number of wide replaced with strlen() for the purpose of counting of number of wide
......
...@@ -448,8 +448,12 @@ fp_setreadl(struct tok_state *tok, const char* enc) ...@@ -448,8 +448,12 @@ fp_setreadl(struct tok_state *tok, const char* enc)
if (io == NULL) if (io == NULL)
goto cleanup; goto cleanup;
if (tok->filename)
stream = PyObject_CallMethod(io, "open", "ssis", stream = PyObject_CallMethod(io, "open", "ssis",
tok->filename, "r", -1, enc); tok->filename, "r", -1, enc);
else
stream = PyObject_CallMethod(io, "open", "isis",
fileno(tok->fp), "r", -1, enc);
if (stream == NULL) if (stream == NULL)
goto cleanup; goto cleanup;
......
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