check by equality for __future__ not identity (closes #14378)
This commit is contained in:
parent
0e3c107549
commit
eff19a13ed
|
@ -231,6 +231,12 @@ class AST_Tests(unittest.TestCase):
|
|||
im = ast.parse("from . import y").body[0]
|
||||
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):
|
||||
self.assertTrue(issubclass(ast.For, ast.stmt))
|
||||
self.assertTrue(issubclass(ast.Name, ast.expr))
|
||||
|
|
|
@ -9,6 +9,9 @@ What's New in Python 2.7.4
|
|||
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
|
||||
allocating path buffers on the heap instead of the stack.
|
||||
|
||||
|
|
|
@ -59,13 +59,6 @@ future_parse(PyFutureFeatures *ff, mod_ty mod, const char *filename)
|
|||
{
|
||||
int i, found_docstring = 0, done = 0, prev_line = 0;
|
||||
|
||||
static PyObject *future;
|
||||
if (!future) {
|
||||
future = PyString_InternFromString("__future__");
|
||||
if (!future)
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!(mod->kind == Module_kind || mod->kind == Interactive_kind))
|
||||
return 1;
|
||||
|
||||
|
@ -92,7 +85,9 @@ future_parse(PyFutureFeatures *ff, mod_ty mod, const char *filename)
|
|||
*/
|
||||
|
||||
if (s->kind == ImportFrom_kind) {
|
||||
if (s->v.ImportFrom.module == future) {
|
||||
PyObject *modname = s->v.ImportFrom.module;
|
||||
if (PyString_GET_SIZE(modname) == 10 &&
|
||||
!strcmp(PyString_AS_STRING(modname), "__future__")) {
|
||||
if (done) {
|
||||
PyErr_SetString(PyExc_SyntaxError,
|
||||
ERR_LATE_FUTURE);
|
||||
|
|
Loading…
Reference in New Issue