Commit a4e4e357 authored by Benjamin Peterson's avatar Benjamin Peterson

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

parent e1121537
...@@ -218,6 +218,12 @@ class AST_Tests(unittest.TestCase): ...@@ -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))
......
...@@ -10,6 +10,9 @@ What's New in Python 3.2.4 ...@@ -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.
......
...@@ -60,13 +60,6 @@ future_parse(PyFutureFeatures *ff, mod_ty mod, const char *filename) ...@@ -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) ...@@ -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);
......
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