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 sys
import unittest
from test import support
......@@ -59,6 +60,21 @@ class ImportTests(unittest.TestCase):
'"""Tokenization help for Python programs.\n')
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):
import marshal
imp.reload(marshal)
......
......@@ -12,6 +12,10 @@ What's New in Python 3.0 release candidate 1
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
these systems, the mbstowcs() function is slightly buggy and must be
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)
if (io == NULL)
goto cleanup;
stream = PyObject_CallMethod(io, "open", "ssis",
tok->filename, "r", -1, enc);
if (tok->filename)
stream = PyObject_CallMethod(io, "open", "ssis",
tok->filename, "r", -1, enc);
else
stream = PyObject_CallMethod(io, "open", "isis",
fileno(tok->fp), "r", -1, enc);
if (stream == NULL)
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