diff Python/ceval.c @ 17494:a34293ced63b legacy-trunk

Change error message raised when free variable is not yet bound. It now raises NameError instead of UnboundLocalError, because the var in question is definitely not local. (This affects test_scope.py) Also update the recent fix by Ping using get_func_name(). Replace tests of get_func_name() return value with call to get_func_desc() to match all the other uses.
author Jeremy Hylton <jeremy@alum.mit.edu>
date Fri, 13 Apr 2001 16:51:46 +0000
parents 35139a9454d4
children 9098415971d0 32e7d0898eab
line wrap: on
line diff
--- a/Python/ceval.c	Fri Apr 13 15:55:25 2001 +0000
+++ b/Python/ceval.c	Fri Apr 13 16:51:46 2001 +0000
@@ -83,6 +83,9 @@
 	"global name '%.200s' is not defined"
 #define UNBOUNDLOCAL_ERROR_MSG \
 	"local variable '%.200s' referenced before assignment"
+#define UNBOUNDFREE_ERROR_MSG \
+	"free variable '%.200s' referenced before assignment" \
+        " in enclosing scope"
 
 /* Dynamic execution profile */
 #ifdef DYNAMIC_EXECUTION_PROFILE
@@ -1693,18 +1696,22 @@
 			x = freevars[oparg];
 			w = PyCell_Get(x);
 			if (w == NULL) {
-				if (oparg < f->f_ncells)
+				if (oparg < f->f_ncells) {
 					v = PyTuple_GetItem(co->co_cellvars,
 							       oparg);
-				else
+				       format_exc_check_arg(
+					       PyExc_UnboundLocalError,
+					       UNBOUNDLOCAL_ERROR_MSG,
+					       v);
+				} else {
 				       v = PyTuple_GetItem(
 						      co->co_freevars,
 						      oparg - f->f_ncells);
-
-				format_exc_check_arg(
-					PyExc_UnboundLocalError,
-					UNBOUNDLOCAL_ERROR_MSG,
-					v);
+				       format_exc_check_arg(
+					       PyExc_NameError,
+					       UNBOUNDFREE_ERROR_MSG,
+					       v);
+				}
 				err = -1;
 				break;
 			}
@@ -2883,11 +2890,10 @@
 				return NULL;
 		}
 		if (!ok) {
-			char* fn = get_func_name(func);
 			PyErr_Format(PyExc_TypeError,
-				     "unbound method %s%smust be "
+				     "unbound method %s%s must be "
 				     "called with instance as first argument",
-				     fn ? fn : "", fn ? "() " : "");
+				     get_func_name(func), get_func_desc(func));
 			return NULL;
 		}
 		Py_INCREF(arg);