diff Python/future.c @ 82687:46cadd3955d0

reject non-docs strings between future imports (closes #17434)
author Benjamin Peterson <benjamin@python.org>
date Sat, 16 Mar 2013 09:15:47 -0700
parents b97964af7299
children 0e253370863f
line wrap: on
line diff
--- a/Python/future.c	Sat Mar 16 08:03:51 2013 +0100
+++ b/Python/future.c	Sat Mar 16 09:15:47 2013 -0700
@@ -58,11 +58,14 @@
 static int
 future_parse(PyFutureFeatures *ff, mod_ty mod, const char *filename)
 {
-    int i, found_docstring = 0, done = 0, prev_line = 0;
+    int i, done = 0, prev_line = 0;
 
     if (!(mod->kind == Module_kind || mod->kind == Interactive_kind))
         return 1;
 
+    if (asdl_seq_LEN(mod->v.Module.body) == 0)
+        return 1;
+
     /* A subsequent pass will detect future imports that don't
        appear at the beginning of the file.  There's one case,
        however, that is easier to handle here: A series of imports
@@ -71,8 +74,13 @@
        but is preceded by a regular import.
     */
 
+    i = 0;
+    stmt_ty first = (stmt_ty)asdl_seq_GET(mod->v.Module.body, i);
+    if (first->kind == Expr_kind && first->v.Expr.value->kind == Str_kind)
+        i++;
 
-    for (i = 0; i < asdl_seq_LEN(mod->v.Module.body); i++) {
+
+    for (; i < asdl_seq_LEN(mod->v.Module.body); i++) {
         stmt_ty s = (stmt_ty)asdl_seq_GET(mod->v.Module.body, i);
 
         if (done && s->lineno > prev_line)
@@ -99,18 +107,13 @@
                     return 0;
                 ff->ff_lineno = s->lineno;
             }
-            else
+            else {
                 done = 1;
+            }
         }
-        else if (s->kind == Expr_kind && !found_docstring) {
-            expr_ty e = s->v.Expr.value;
-            if (e->kind != Str_kind)
-                done = 1;
-            else
-                found_docstring = 1;
+        else {
+            done = 1;
         }
-        else
-            done = 1;
     }
     return 1;
 }