From: Jeremy Hylton <jeremy@alum.mit.edu>
Date: Thu, 22 Mar 2001 03:51:05 +0000 (+0000)
Subject: Make error messages clearer for illegal combinations of nested
X-Git-Tag: v2.1b2~86
X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=280e6bd742a50cf7f00739c7904f1b5aa66bdad9;p=python

Make error messages clearer for illegal combinations of nested
functions and import */exec.
---

diff --git a/Python/compile.c b/Python/compile.c
index 81be103515..fe84921433 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -4191,32 +4191,53 @@ symtable_check_unoptimized(struct compiling *c,
 	      || (ste->ste_nested && si->si_nimplicit)))
 		return 0;
 
+#define ILLEGAL_CONTAINS "contains a nested function with free variables"
+
+#define ILLEGAL_IS "is a nested function"
+
 #define ILLEGAL_IMPORT_STAR \
-"import * is not allowed in function '%.100s' " \
-"because it contains a nested function with free variables"
+"import * is not allowed in function '%.100s' because it %s"
 
 #define ILLEGAL_BARE_EXEC \
-"unqualified exec is not allowed in function '%.100s' " \
-"because it contains a nested function with free variables"
+"unqualified exec is not allowed in function '%.100s' it %s"
 
 #define ILLEGAL_EXEC_AND_IMPORT_STAR \
 "function '%.100s' uses import * and bare exec, which are illegal" \
-"because it contains a nested function with free variables"
+"because it %s"
 
 	/* XXX perhaps the linenos for these opt-breaking statements
 	   should be stored so the exception can point to them. */
 
-	if (ste->ste_optimized == OPT_IMPORT_STAR)
-		sprintf(buf, ILLEGAL_IMPORT_STAR, 
-			PyString_AS_STRING(ste->ste_name));
-	else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
-		sprintf(buf, ILLEGAL_BARE_EXEC,
-			PyString_AS_STRING(ste->ste_name));
-	else {
-		sprintf(buf, ILLEGAL_EXEC_AND_IMPORT_STAR,
-			PyString_AS_STRING(ste->ste_name));
+	if (ste->ste_child_free) {
+		if (ste->ste_optimized == OPT_IMPORT_STAR)
+			sprintf(buf, ILLEGAL_IMPORT_STAR, 
+				PyString_AS_STRING(ste->ste_name),
+				ILLEGAL_CONTAINS);
+		else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
+			sprintf(buf, ILLEGAL_BARE_EXEC,
+				PyString_AS_STRING(ste->ste_name),
+				ILLEGAL_CONTAINS);
+		else {
+			sprintf(buf, ILLEGAL_EXEC_AND_IMPORT_STAR,
+				PyString_AS_STRING(ste->ste_name),
+				ILLEGAL_CONTAINS);
+		}
+	} else {
+		if (ste->ste_optimized == OPT_IMPORT_STAR)
+			sprintf(buf, ILLEGAL_IMPORT_STAR, 
+				PyString_AS_STRING(ste->ste_name),
+				ILLEGAL_IS);
+		else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
+			sprintf(buf, ILLEGAL_BARE_EXEC,
+				PyString_AS_STRING(ste->ste_name),
+				ILLEGAL_IS);
+		else {
+			sprintf(buf, ILLEGAL_EXEC_AND_IMPORT_STAR,
+				PyString_AS_STRING(ste->ste_name),
+				ILLEGAL_IS);
+		}
 	}
-	
+
 	if (c->c_symtable->st_nested_scopes) {
 		PyErr_SetString(PyExc_SyntaxError, buf);
 		PyErr_SyntaxLocation(c->c_symtable->st_filename,