check by equality for __future__ not identity (closes #14378)

This commit is contained in:
Benjamin Peterson 2012-03-22 08:19:04 -04:00
parent e112153727
commit a4e4e35783
3 changed files with 11 additions and 8 deletions

View file

@ -218,6 +218,12 @@ class AST_Tests(unittest.TestCase):
im = ast.parse("from . import y").body[0] im = ast.parse("from . import y").body[0]
self.assertIsNone(im.module) self.assertIsNone(im.module)
def test_non_interned_future_from_ast(self):
mod = ast.parse("from __future__ import division")
self.assertIsInstance(mod.body[0], ast.ImportFrom)
mod.body[0].module = " __future__ ".strip()
compile(mod, "<test>", "exec")
def test_base_classes(self): def test_base_classes(self):
self.assertTrue(issubclass(ast.For, ast.stmt)) self.assertTrue(issubclass(ast.For, ast.stmt))
self.assertTrue(issubclass(ast.Name, ast.expr)) self.assertTrue(issubclass(ast.Name, ast.expr))

View file

@ -10,6 +10,9 @@ What's New in Python 3.2.4
Core and Builtins Core and Builtins
----------------- -----------------
- Issue #14378: Fix compiling ast.ImportFrom nodes with a "__future__" string as
the module name that was not interned.
- Issue #14331: Use significantly less stack space when importing modules by - Issue #14331: Use significantly less stack space when importing modules by
allocating path buffers on the heap instead of the stack. allocating path buffers on the heap instead of the stack.

View file

@ -60,13 +60,6 @@ future_parse(PyFutureFeatures *ff, mod_ty mod, const char *filename)
{ {
int i, found_docstring = 0, done = 0, prev_line = 0; int i, found_docstring = 0, done = 0, prev_line = 0;
static PyObject *future;
if (!future) {
future = PyUnicode_InternFromString("__future__");
if (!future)
return 0;
}
if (!(mod->kind == Module_kind || mod->kind == Interactive_kind)) if (!(mod->kind == Module_kind || mod->kind == Interactive_kind))
return 1; return 1;
@ -93,7 +86,8 @@ future_parse(PyFutureFeatures *ff, mod_ty mod, const char *filename)
*/ */
if (s->kind == ImportFrom_kind) { if (s->kind == ImportFrom_kind) {
if (s->v.ImportFrom.module == future) { PyObject *modname = s->v.ImportFrom.module;
if (!PyUnicode_CompareWithASCIIString(modname, "__future__")) {
if (done) { if (done) {
PyErr_SetString(PyExc_SyntaxError, PyErr_SetString(PyExc_SyntaxError,
ERR_LATE_FUTURE); ERR_LATE_FUTURE);