From 8a9583ec5c00384514fe9f5045866ad6ebd2be5a Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Thu, 4 Sep 2008 05:04:25 +0000 Subject: [PATCH] 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. --- Lib/test/test_imp.py | 16 ++++++++++++++++ Misc/NEWS | 4 ++++ Parser/tokenizer.c | 8 ++++++-- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_imp.py b/Lib/test/test_imp.py index e2b9e9ab245..3a3059e1619 100644 --- a/Lib/test/test_imp.py +++ b/Lib/test/test_imp.py @@ -1,4 +1,5 @@ import imp +import sys import unittest from test import support @@ -59,6 +60,21 @@ def test_issue1267(self): '"""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) diff --git a/Misc/NEWS b/Misc/NEWS index e393c06ab95..3e77aa2d76d 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -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 diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index e2da3e5b6b0..e4cf8e4cc55 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -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;