[Python-checkins] cpython (merge 3.2 -> default): merge 3.2 (#14378)

benjamin.peterson python-checkins at python.org
Thu Mar 22 13:20:01 CET 2012


http://hg.python.org/cpython/rev/9d793be3b4eb
changeset:   75869:9d793be3b4eb
parent:      75867:7c52a59f1409
parent:      75868:f57cbcefde34
user:        Benjamin Peterson <benjamin at python.org>
date:        Thu Mar 22 08:19:50 2012 -0400
summary:
  merge 3.2 (#14378)

files:
  Lib/test/test_ast.py |   6 ++++++
  Misc/NEWS            |   6 +++++-
  Python/future.c      |  10 ++--------
  3 files changed, 13 insertions(+), 9 deletions(-)


diff --git a/Lib/test/test_ast.py b/Lib/test/test_ast.py
--- a/Lib/test/test_ast.py
+++ b/Lib/test/test_ast.py
@@ -226,6 +226,12 @@
         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))
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -13,7 +13,11 @@
 - Issue #1683368: object.__new__ and object.__init__ raise a TypeError if they
   are passed arguments and their complementary method is not overridden.
 
-- Give the ast.AST class a __dict__.
+- 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.
 
 - Issue #14334: Prevent in a segfault in type.__getattribute__ when it was not
   passed strings.
diff --git a/Python/future.c b/Python/future.c
--- a/Python/future.c
+++ b/Python/future.c
@@ -60,13 +60,6 @@
 {
     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))
         return 1;
 
@@ -93,7 +86,8 @@
         */
 
         if (s->kind == ImportFrom_kind) {
-            if (s->v.ImportFrom.module == future) {
+            PyObject *modname = s->v.ImportFrom.module;
+            if (!PyUnicode_CompareWithASCIIString(modname, "__future__")) {
                 if (done) {
                     PyErr_SetString(PyExc_SyntaxError,
                                     ERR_LATE_FUTURE);

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list